ResourceExhaustedError(请参见上面的回溯):分配形状为[3,3,256,512]的张量并键入float时为OOM

时间:2018-07-14 10:26:36

标签: python tensorflow keras deep-learning

import keras
from keras.models import Sequential
from keras.layers import Dense,Flatten,Dropout
from keras.layers.convolutional import Conv2D,MaxPooling2D
#from sklearn.model_selection import train_test_split
import keras.optimizers
import gc
label=pd.read_csv('trainLabels.csv')
label=label.sort_values(by=['image'])
model = Sequential()
model.add(Conv2D(64,(3,3),strides=(1,1),input_shape=(512,512,3),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(64,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(128,(3,2),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(128,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1,activation='relu'))
opt = keras.optimizers.Adagrad(lr=0.01)
model.compile(loss='mean_squared_error', optimizer=opt)
#ID=train_test_split(list(range(1000)),test_size=0.2,stratify=label['level'].iloc[0:1000])
df=np.array(df)
model.fit(df, label['level'].iloc[0:1000],epochs=100, batch_size=1)
gc.collect()

GPU:GTX980M-8GB CPU:2.7GHZ 8核
内存:16GB

df.shape
    Out[78]: (1000, 512, 512, 3)

错误消息:

ResourceExhaustedError (see above for traceback): OOM when allocating tensor of shape [3,3,256,512] and type float
     [[Node: training_9/Adagrad/zeros_14 = Const[dtype=DT_FLOAT, value=Tensor<type: float shape: [3,3,256,512] values: [[[0 0 0]]]...>, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

图像为512 X 512,并通过一种标准的vgg19 我只是问这个问题是由硬件缺陷引起的,无法通过其他方法解决吗?即我无法使用8GB GPU通过vgg19处理512 X 512图像。我有点怀疑,因为在添加批处理大小的同时使用11GB GPU必须存在相同的错误。否则应该有问题或其他解决方案。

1 个答案:

答案 0 :(得分:0)

我认为该模型不会太大,无法容纳8GB内存的GPU。

在大多数情况下,有一个进程使用GPU中的大部分内存资源。

您可以检查哪个进程消耗了大部分GPU内存。

nvidia-smi

如果您在python中看到类似Process name的内容,只需使用kill -9 [process ID]终止该进程

该过程可能是您执行的模型,该模型不会被杀死,并且会消耗大部分GPU内存。