训练神经网络时出现ResourceExhaustedError错误

时间:2019-01-29 16:33:22

标签: python tensorflow keras deep-learning gpu

全部欢迎。我正在尝试训练我的第一个神经网络。

当我尝试训练她时-出现此错误:

  

tensorflow.python.framework.errors_impl.ResourceExhaustedError:OOM   在分配带有形状[502656,128]的张量时,在   / job:localhost / replica:0 / task:0 / device:GPU:0通过分配器GPU_0_bfc

我读到,我意识到这是由于视频卡(GTX 1050 2 gb)中的内存很少。

原来我根本不能在这里使用视频卡?

也许我可以以某种方式“部分”发行视频卡数据集?

代码:

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
import numpy as np

batch_size = 1
num_classes = 3
epochs = 2

# input image dimensions
img_rows, img_cols = 135, 240

dataset = Dataset()

x_train, y_train = dataset.LoadDataset()

x_train = x_train[0]
y_train = y_train[0]

x_train = np.array(x_train).reshape(10000, 135, 240, 1)

input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')

x_train = x_train / 255

model = Sequential()
model.add(Conv2D(32, kernel_size=(1, 1),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

model.fit([x_train], [y_train],
          batch_size=batch_size,
          epochs=epochs,
          verbose=1)

model.save("First.model")

score = model.evaluate([x_train], [y_train], verbose=0)

print('Test loss:', score[0])
print('Test accuracy:', score[1])

1 个答案:

答案 0 :(得分:0)

gradient-checkpointing是OpenAI开发的用于减少神经网络的内存占用的库。通过在正向传递过程中保存一些张量(计算损失)并在反向传递过程中重新计算其他张量(通过对损失进行反向传播来计算梯度)来实现此目的。

该库的名称为advertised on reddit,可让您以10倍的内存训练模型,以换取20%的计算成本。但是,根据我在具有最佳设置的中型CNN上进行尝试的经验,它使我能够以2倍的内存和30%的计算成本进行训练。他们的GitHub page上的迭代峰值内存图表明,只有在非常大型的网络中,您才能获得更高的收益。

额外:2 GB的GPU内存太少,无法训练大多数神经网络。从2018年开始的This article建议至少使用6 GB。如果可以,我建议您使用具有更多内存和处理能力的高端GPU。或者,您可以使用云计算服务。 Google Cloud为您提供了一个完全免费的试用版,您可以在其中花300美元购买一年的云服务。