全部欢迎。我正在尝试训练我的第一个神经网络。
当我尝试训练她时-出现此错误:
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])
答案 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美元购买一年的云服务。