我对卷积神经网络的理解是,它是应用于图像的一组较小的滤镜。
类似于下面的简单模型中的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个过滤器总数。是过滤器的深度,而不是每次通过的内核总数吗?阅读文档,仍然认为我缺少什么。
答案 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