【问题标题】:Why am I getting GPU ran out of memory error here?为什么我在这里得到 GPU 内存不足错误?
【发布时间】:2019-07-05 09:44:06
【问题描述】:

我对深度学习非常陌生,正在尝试使用 keras 制作猫/狗分类器。该模型在我的笔记本电脑上训练花费了太多时间,因此我决定在我的台式机上使用 GTX 750Ti (2GB) 对其进行训练。我正在使用带有 tensorflow-gpu 后端的 keras,但它每次都会给我 OOM 错误。即使我将batch size减少到1。如何控制这里给gpu的数据量?

代码

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Activation, Conv2D, MaxPooling2D, Flatten, Dropout
images = ImageDataGenerator()
train = images.flow_from_directory('./dataset', class_mode='binary', target_size=(200, 200), batch_size=64)

model = Sequential()

model.add(Conv2D(32, (3, 3), padding='same', input_shape=(200,200,3), activation='relu'))
model.add(Conv2D(32, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(1))
model.add(Activation('sigmoid'))
    
model.compile(loss='binary_crossentropy',
            optimizer='adam',
            metrics=['accuracy'])

model.fit_generator(train, steps_per_epoch=len(train.filenames)//32, epochs=100)

model.save_weights('model.h5')

这是模型摘要:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 200, 200, 32)      896       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 200, 200, 32)      9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 100, 100, 32)      0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 100, 100, 64)      18496     
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 100, 100, 64)      36928     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 50, 50, 64)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 50, 50, 128)       73856     
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 50, 50, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 25, 25, 128)       0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 25, 25, 256)       295168    
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 25, 25, 256)       590080    
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 12, 12, 256)       0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 36864)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               9437440   
_________________________________________________________________
dropout_1 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 256)               65792     
_________________________________________________________________
dropout_2 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 257       
_________________________________________________________________
activation_1 (Activation)    (None, 1)                 0         
=================================================================
Total params: 10,675,745
Trainable params: 10,675,745
Non-trainable params: 0
_________________________________________________________________

【问题讨论】:

  • 您可以打印模型摘要并在此处添加吗?似乎要学习的参数数量从 Conv(256) 层到 Dense 通过 flatten 层很高。
  • @venkatkrishnan 好的,我现在已经在帖子中添加了模型摘要:)
  • 请尝试将密集层中的节点数dense_1减少到较小的数量,例如64并尝试一下。
  • @venkatkrishnan 仍然出现 OOM :(
  • 对.. 将其设置为 32,在所有以下密集层中,如果这也会产生问题,那么可能是 GPU 内存被占用的情况。有编程方法可以删除GPU 内存中的内容。但我通常会重新启动我的电脑以重新开始。

标签: python tensorflow keras


【解决方案1】:

通常发生OOM错误是因为batch_size太大或者你的VRAM太小。

在您的情况下,GPU 只是内存不足,因为您的 VRAM 太小。对于 10.000.000 个参数的神经网络来说,2GB 的显存是非常少的。

对于计算机视觉任务,大多数神经网络至少需要 6GB 的 VRAM。

解决办法肯定是使用内存更大的显卡。

【讨论】:

  • 说得对,这就是我要求模型摘要确定参数数量的原因。
  • 虽然减少了卷积滤波器的数量,但还是存在 VRAM 太小的问题。自然的解决方案(不可避免)是升级到更大的显卡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2020-07-31
  • 2021-11-08
  • 2016-11-22
相关资源
最近更新 更多