首页 > 解决方案 > 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 是过滤器的总数。是过滤器的深度,而不是每次通过的内核总数吗?阅读文档,但仍然认为我遗漏了一些东西。

标签: pythontensorflowkeras

解决方案


这是非常大的:

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

推荐阅读