python - Keras 新手,海量内存 Conv2D
问题描述
我对卷积神经网络的理解是它是一组应用于图像的较小过滤器。
所以像下面简单模型中的 Conv2D
model = Sequential()
model.add(Conv2D(128,(3,3),activation='relu',input_shape=(101,101,1)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(101*101,activation='sigmoid'))
参数 = 128*3*3 = 8192 字节数 = 参数*4 = 32768 字节
我看到的现实是我的后端的 tensorflow 正试图为此培训分配 12.5GB 的视频内存。
我的数据作为 (4000,101,101,1) 数组传递给它,就像在使用 (60000,28,28,1) 数组的 MNIST 示例中一样。我的整个数组转换为浮点数的数据约为 326MB。
我是在做错什么,还是几乎不可能在没有 10 GB 视频内存的情况下在 GPU 上训练图像?我有 8 GB,我不希望创造一些改变世界的东西,而是数字。我需要以不同的方式准备数据吗?我尝试传递一半的数据并且内存分配基本相同,但是将过滤器计数更改为 30 可以让我编译没有错误。我误解了参数吗?任何援助将不胜感激。
我认为 128 是过滤器的总数。是过滤器的深度,而不是每次通过的内核总数吗?阅读文档,但仍然认为我遗漏了一些东西。
解决方案
这是非常大的:
model.add(Flatten()) #shape: (batch, 128*50*50)
model.add(Dense(101*101,activation='sigmoid')) #parameters: 128*50*50*101*101 + 101*101 = 3264330201
三十亿个参数。(检查您model.summary()
的确认)
您正在使用 flatten 对所有内容应用密集层:通道 * 像素 * 像素。
我建议你寻找 U-net 风格的模型(完全卷积)。或者,如果您确实想使用密集层,请先使用某种GlobalPooling。
概括:
input: shape: (101,101,1) params: 0
conv: shape: (99, 99, 128) params: 3*3*1*128 + 3*3*128
pool: shape: (50,50, 128) params: 0
flat: shape: (50*50*128,) params: 0
dense: shape: (101*101,) params: 50*50*128*101*101 + 101*101
推荐阅读
- reporting-services - 有没有办法在 ssrs 2012 的图表上显示选择的日期范围
- javascript - 为什么我不能一个接一个地等待2个?
- php - 将json转换为数组并迭代数组
- javascript - html webpack插件和注入后的新行
- javascript - 当我单击按钮时,页面本身会重复
- python - 默认 MaxPoolingOp 仅在设备类型 CPU 上支持 NHWC
- reactjs - 如何模拟 Firebase Auth 方法?(反应,测试库)
- algorithm - AI中搜索算法的混乱
- julia - 如何在 Julia 中管理求解器 cplex 的间隙?
- python - 如何从节点服务器通知 python 客户端?