Keras的新功能,大量内存Conv2D

时间:2018-08-01 23:43:24

标签: python tensorflow keras

我对卷积神经网络的理解是,它是应用于图像的一组较小的滤镜。

类似于下面的简单模型中的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个过滤器总数。是过滤器的深度,而不是每次通过的内核总数吗?阅读文档,仍然认为我缺少什么。

1 个答案:

答案 0 :(得分:1)

这非常大:

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()进行确认)

您要对所有具有扁平化的图层应用密集的图层:通道*像素*像素。

我建议您寻找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