使用 GPU 进行数据验证的 Keras OOM

数据挖掘 Python 喀拉斯 张量流 显卡
2022-01-24 19:08:26

我正在尝试使用 GPU 运行深度模型,并且似乎 Keras 在一批中针对整个验证数据集运行验证,而不是在多个批次中进行验证,这会导致内存不足问题

tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[160000,64,64,1] and type double on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [Op:GatherV2]

我在 CPU 上运行时没有这个问题,它只是在我在 GPU 上运行时发生,我的 fit 代码看起来像这样

history =model.fit(patches_imgs_train,patches_masks_train, batch_size=8, epochs=10,
  shuffle=True, verbose=1, validation_split=0.2) 

当我从 fit 方法中删除验证参数时,代码可以工作,但我需要验证。

2个回答

您的问题可能有两个原因:

  • 在验证中,网络需要更多内存。
  • 还有一个与此没有直接关系的问题。

这个 Keras 问题中,您可以找到一个非常相似的问题的讨论。基本上,您可以尝试:

  • 减少批量大小。
  • 如果您使用的是 Tensorboad,请尝试禁用它或设置其batch_size参数。

所以我可以考虑发生了什么作为 Keras 实现中的一个错误,看起来它正在尝试将整个数据集加载到内存中以将其拆分为验证集和训练集,并且它与批量大小无关,在尝试了很多方法之后我发现处理它的最佳方法是使用 sklearn train_test_split 拆分数据,而不是使用 validation_split 参数在拟合方法中拆分数据。

x_train, x_v, y_train, y_v = train_test_split(x,y,test_size = 0.2,train_size =0.8)

history = model.fit(x_train,y_train,
              batch_size=16,
              epochs=5,
              shuffle=True,
              verbose=2,
              validation_data=(x_v, y_v))