Tensorflow错误:分配具有奇怪形状的张量时出现OOM

时间:2020-07-17 20:40:13

标签: tensorflow out-of-memory vgg-net

出现此错误时,我正在尝试使用一些512x512图像执行VGG16的一个小变化:

tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[131072,4096]

这是我的model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 512, 512, 64)      1792      
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 512, 512, 64)      36928     
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 256, 256, 64)      0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 256, 256, 128)     73856     
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 256, 256, 128)     147584    
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 128, 128, 128)     0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 128, 128, 256)     295168    
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 128, 128, 256)     590080    
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 128, 128, 256)     590080    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 64, 64, 256)       0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 64, 64, 512)       1180160   
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 64, 64, 512)       2359808   
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 64, 64, 32)        147488    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 32, 32, 32)        0         
_________________________________________________________________
flatten (Flatten)            (None, 32768)             0         
_________________________________________________________________
dense (Dense)                (None, 4096)              134221824 
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              16781312  
_________________________________________________________________
dense_2 (Dense)              (None, 3)                 12291     
=================================================================
Total params: 156,438,371
Trainable params: 156,438,371
Non-trainable params: 0

奇怪的是错误消息中的shape[131072, 4096]

在我的模型中,正如我们在model.summary()中看到的那样,唯一的4096Dense层之后的flatten层的末尾。但是平坦层产生32768个神经元的输出。因此,这种情况下的错误应为shape[32768, 4096]。我尝试写2048或1024而不是4096。但是错误始终是shape[131072, 4096],并且这种形状永远不会改变。

问题是:

  1. 这个shape[131072, 4096]来自哪里?不是shape[32768, 4096]吗?
  2. 如何解决?

我读了一些同样问题的问题,例如我们:

Shape of image after MaxPooling2D with padding ='same' --calculating layer-by-layer shape in convolution autoencoder

Error: OOM when allocating tensor with shape

但是他们都没有解释为什么形状不正确。

1 个答案:

答案 0 :(得分:1)

由于使用的是VGG16,因此需要确保输入的内容为224x224,而事实并非如此。另外,您能否告诉您正在使用的批处理大小,这是因为您没有足够的GPU内存。因此,请考虑减小批次大小。假设您使用的是512x512,GPU没有足够的内存是可以理解的。另外,作为最佳做法,请记住,大多数SOTA模型的输入图像都不要超过300x300。建议不要使用这么大的尺寸。

关于您要求的形状,让我问您是否使用批处理大小32。因为32 x 256 x 256 x 64 = 131072 x4096。因此,张量实际上是正在创建的初始张量,但是由于内存不足而无法创建。至于为什么这样的形状可能是由于TensorFlow的内部工作而引起的,我对此不予评论,因为我对此感到有限,对此我深表歉意。但是,希望我能帮助您了解形状的来源。