CNN中用于图像分类的内存泄漏

时间:2019-06-21 10:23:48

标签: python-3.x tensorflow keras deep-learning

好的,这太奇怪了,我已经尝试了很多。我正在为图像分类问题开发CNN管道。

我正在使用使用python 3.7,keras-gpu和tensorflow-gpu的conda环境。

我有1000-1920分辨率的图片(本来是1080-1920,但是顶部的80像素被裁剪了,因为它们显示了时间,并且网络将其用于过度拟合)。

通常我的代码很简单。我有一个训练和验证集,对训练集进行了一些扩充,并使用keras.fit_generator将它们都作为模型的生成器。

我的模型为我的图片提供了一个平坦的输入层,使用了经过预训练的模型进行转移学习,并具有注意力图,并在其上构建了2个密集层。

我的回调是ModelCheckpoint,EarlyStopping,ReduceLearningRate和Tensorboard。

该模型在使用GTX1080Ti的Windows 10计算机上表现非常好,那里已经出现了一些OOM问题。然后,我最终将自己的团队限制在迁移到Ubuntu上,从而极大地提高了速度。

但是,现在代码不断在同一台PC上获取GPU-OOM,甚至在另一台具有RTX2080Ti的PC上也是如此。这真是太奇怪了。

我曾尝试减小模型和批量大小,但最终还是失败了。尽管它不是恒定的,但即使我使用1的批处理大小并将图片压缩到100 * 200之类,它平均也要花费更长的时间。

我将que-size设置为0,将multi-processing设置为false并转为工作人员。我为会话内存管理设置了以下代码。


gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9)

config = tf.ConfigProto(gpu_options=gpu_options)
config.gpu_options.allow_growth = True  

sess = tf.Session(config=config)
set_session(sess)

奇怪的是,它总是最终会耗尽gpu内存,而我不知道该怎么办了。使用小的训练数据,有时可以训练60个纪元,然后突然失败,而如果训练数据较大,则平均减少。

但是它总是失败,并且您永远找不到。因为它完成了时代,所以我不认为这是因为批量大小太大或网络太大。

它也永远不会同时发生,它可能是在某个中间时期,尽管经过了多个时期,但它最常发生,但不是排他地。

错误消息也不总是相同的,它通常表示CUDA_ERROR无法分配张量,但有时也表示CUDA_OS错误,操作系统不支持该调用。我在这里制作了一张崩溃的图像:

Error Message after Computer froze

编辑: 既然有人问,这是使用inceptionv3的一个示例图定义:

图层(类型)输出形状参数#已连接

input_1(InputLayer)(无,1080、1920、3 0


inception_v3(模型)(无,32、58、2048)21802784 input_1 [0] [0]


batch_normalization_95(BatchNo(None,32,58,2048)8192 inception_v3 1 [0]


dropout_1(Dropout)(None,32,58,2048)0 batch_normalization_95 [0] [0]


conv2d_95(Conv2D)(无,32、58、64)131136 dropout_1 [0] [0]


conv2d_96(Conv2D)(无,32、58、16)1040 conv2d_95 [0] [0]


conv2d_97(Conv2D)(无,32、58、8)136 conv2d_96 [0] [0]


conv2d_98(Conv2D)(无,32、58、1)9 conv2d_97 [0] [0]


conv2d_99(Conv2D)(无,32、58、2048)2048 conv2d_98 [0] [0]


multiply_1(相乘)(无,32、58、2048)0 conv2d_99 [0] [0]
                                                                 batch_normalization_95 [0] [0]


global_average_pooling2d_1(Glo(无,2048)0乘法_1 [0] [0]


global_average_pooling2d_2(Glo(无,2048)0 conv2d_99 [0] [0]


RescaleGAP(Lambda)(无,2048)0 global_average_pooling2d_1 [0] [0]                                                                  global_average_pooling2d_2 [0] [0]


dropout_2(退出)(无,2048)0 RescaleGAP [0] [0]


dense_1(密集)(无,128)262272 dropout_2 [0] [0]


dropout_3(Dropout)(无,128)0 density_1 [0] [0]


dense_2(密集)(无,2)258 dropout_3 [0] [0]

总参数:22,207,875 可训练的参数:398,947 不可训练的参数:21,808,928

0 个答案:

没有答案
相关问题