我一直在搞乱Keras,到目前为止还喜欢它.在使用相当深的网络时,我遇到了一个大问题:当调用model.train_on_batch或model.fit等时,Keras分配的GPU内存比模型本身需要的多得多.这不是因为尝试训练一些非常大的图像,而是网络模型本身似乎需要大量的GPU内存.我创建了这个玩具示例来展示我的意思.这基本上是在发生什么:
我首先创建一个相当深的网络,并使用model.summary()来获取网络所需的参数总数(在本例中为206538153,相当于大约826 MB).然后我使用nvidia-smi来查看Keras分配了多少GPU内存,我可以看到它非常有意义(849 MB).
然后我编译网络,并确认这不会增加GPU内存使用量.正如我们在这种情况下所看到的,此时我有近1 GB的VRAM可用.
然后我尝试将一个简单的16x16图像和1x1基础事实提供给网络,然后一切都爆炸了,因为Keras开始再次分配大量内存,这对我来说无缘无故.关于训练网络的东西似乎需要比仅拥有模型更多的内存,这对我来说没有意义.在其他框架中,我已经在这个GPU上训练了更深层次的网络,所以这让我觉得我使用的是Keras错误(或者我的设置或者Keras中存在错误,但当然很难确定).
这是代码:
from scipy import misc
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Reshape, Flatten, ZeroPadding2D, Dropout
import os
model = Sequential()
model.add(Convolution2D(256, 3, 3, border_mode='same', input_shape=(16,16,1)))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
model.add(Convolution2D(512, 3, 3, border_mode='same'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
model.add(Convolution2D(1024, 3, 3, border_mode='same'))
model.add(Convolution2D(1024, 3, 3, border_mode='same'))
model.add(Convolution2D(1024, 3, 3, border_mode='same'))
model.add(Convolution2D(1024, 3, 3, border_mode='same'))
model.add(Convolution2D(1024, 3, 3, border_mode='same'))
model.add(Convolution2D(1024, 3, 3, border_mode='same'))
model.add(Convolution2D(1024, 3, 3, border_mode='same'))
model.add(Convolution2D(1024, 3, 3, …Run Code Online (Sandbox Code Playgroud)