Memory Keras在批处理、fit等上调用train_时使用了太多的GPU内存

Memory Keras在批处理、fit等上调用train_时使用了太多的GPU内存,memory,tensorflow,keras,theano,Memory,Tensorflow,Keras,Theano,我一直在和Keras捣乱,到目前为止我很喜欢。在使用相当深的网络时,我遇到了一个大问题:在批处理上调用model.train\u或model.fit等时,Keras分配的GPU内存远远超过了模型本身所需的内存。这并不是因为试图在一些非常大的图像上进行训练,而是网络模型本身似乎需要大量的GPU内存。我创建了这个玩具示例来说明我的意思。下面是实际情况: 我首先创建一个相当深的网络,并使用model.summary()获取网络所需的参数总数(在本例中为206538153,相当于826MB)。然后我使用

我一直在和Keras捣乱,到目前为止我很喜欢。在使用相当深的网络时,我遇到了一个大问题:在批处理上调用model.train\u或model.fit等时,Keras分配的GPU内存远远超过了模型本身所需的内存。这并不是因为试图在一些非常大的图像上进行训练,而是网络模型本身似乎需要大量的GPU内存。我创建了这个玩具示例来说明我的意思。下面是实际情况:

我首先创建一个相当深的网络,并使用model.summary()获取网络所需的参数总数(在本例中为206538153,相当于826MB)。然后我使用NVIDIASMI来查看Keras分配了多少GPU内存,我可以看出它非常合理(849MB)

然后我编译网络,并确认这不会增加GPU内存使用。正如我们在本例中所看到的,目前我有将近1GB的VRAM可用

然后我尝试向网络提供一个简单的16x16图像和一个1x1地面真相,然后一切都爆炸了,因为Keras再次开始分配大量内存,这对我来说是不明显的。关于训练网络的一些东西似乎比仅仅拥有模型需要更多的记忆,这对我来说没有意义。我已经在其他框架中在这个GPU上训练了相当深入的网络,所以这让我觉得我使用Keras是错误的(或者我的设置或Keras中有错误,但当然这很难确定)

代码如下:

来自scipy导入杂项
将numpy作为np导入
从keras.models导入顺序
从keras.layers导入稠密、激活、卷积2D、最大池2D、重塑、展平、零填充2D、退出
导入操作系统
模型=顺序()
添加(卷积2D(256,3,3,border_mode='same',input_shape=(16,16,1)))
add(MaxPoolig2D(池大小=(2,2),跨步=(2,2)))
添加(卷积2D(512,3,3,border_mode='same'))
add(MaxPoolig2D(池大小=(2,2),跨步=(2,2)))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
添加(卷积2D(1024,3,3,border_mode='same'))
add(MaxPoolig2D(池大小=(2,2),跨步=(2,2)))
添加(卷积2D(256,3,3,border_mode='same'))
添加(卷积2D(32,3,3,border_mode='same'))
model.add(MaxPoolig2D(池大小=(2,2)))
model.add(展平())
模型.添加(密度(4))
模型.添加(密度(1))
model.summary()
操作系统(“nvidia smi”)
原始输入(“按回车键继续…”)
model.compile(优化器='sgd',
损失='mse',
指标=[‘准确度’])
操作系统(“nvidia smi”)
原始输入(“已编译模型。按Enter键继续…”)
n_批次=1
批次大小=1
对于范围内的ibatch(n个批次):
x=np.random.rand(批次尺寸,16,16,1)
y=np.random.rand(批次大小,1)
操作系统(“nvidia smi”)
原始输入(“即将训练一次迭代。按Enter键继续…”)
批量生产(x,y)上的系列
打印(“训练一次迭代”)
这为我提供了以下输出:

使用无后端。
使用gpu设备0:GeForce GTX 960(禁用CNMeM,cuDNN 5103)
/usr/local/lib/python2.7/dist-packages/theano/sandbox/cuda/_-init__.py:600:UserWarning:您的cuDNN版本比theano官方支持的版本更新。如果您发现任何问题,请尝试更新Theano或将cuDNN降级至版本5。
警告。警告(警告)
____________________________________________________________________________________________________
层(类型)输出形状参数#连接到
====================================================================================================
卷积2D_1(卷积2D)(无、16、16、256)2560卷积2D_输入_1[0][0]
____________________________________________________________________________________________________
MaxPoolig2D_1(MaxPoolig2D)(无、8、8、256)0卷积2D_1[0][0]
____________________________________________________________________________________________________
卷积2D_2(卷积2D)(无、8、8、512)1180160最大池2D_1[0][0]
____________________________________________________________________________________________________
MaxPoolig2D_2(MaxPoolig2D)(无、4、4、512)0卷积2D_2[0][0]
____________________________________________________________________________________________________
卷积2D_3(卷积2D)(无,4,4,1024)4719616最大池2D_2[0][0]
____________________________________________________________________________________________________
卷积2D