如何解决“ ResourceExhaustedError:分配张量时的OOM”

时间:2019-12-18 15:12:04

标签: python tensorflow keras deep-learning multiple-input

我想创建一个具有多个输入的模型。因此,我尝试构建这样的模型。

# define two sets of inputs
inputA = Input(shape=(32,64,1))
inputB = Input(shape=(32,1024))

# CNN
x = layers.Conv2D(32, kernel_size = (3, 3), activation = 'relu')(inputA)
x = layers.Conv2D(32, (3,3), activation='relu')(x)
x = layers.MaxPooling2D(pool_size=(2,2))(x)
x = layers.Dropout(0.2)(x)
x = layers.Flatten()(x)
x = layers.Dense(500, activation = 'relu')(x)
x = layers.Dropout(0.5)(x)
x = layers.Dense(500, activation='relu')(x)
x = Model(inputs=inputA, outputs=x)

# DNN
y = layers.Flatten()(inputB)
y = Dense(64, activation="relu")(y)
y = Dense(250, activation="relu")(y)
y = Dense(500, activation="relu")(y)
y = Model(inputs=inputB, outputs=y)

# Combine the output of the two models
combined = concatenate([x.output, y.output])


# combined outputs
z = Dense(300, activation="relu")(combined)
z = Dense(100, activation="relu")(combined)
z = Dense(1, activation="softmax")(combined)

model = Model(inputs=[x.input, y.input], outputs=z)

model.summary()

opt = Adam(lr=1e-3, decay=1e-3 / 200)
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = opt,
    metrics = ['accuracy'])

和摘要 : _

但是,当我尝试训练该模型时,

history = model.fit([trainimage, train_product_embd],train_label,
    validation_data=([validimage,valid_product_embd],valid_label), epochs=10, 
    steps_per_epoch=100, validation_steps=10)

问题发生了... :

  

--------------------------------------------------- ---------------------------- ResourceExhaustedError错误回溯(最近的调用   最后)在()   ----> 1历史= model.fit([trainimage,train_product_embd],train_label,   validate_data =([[validimage,valid_product_embd],valid_label),   epochs = 10,steps_per_epoch = 100,validation_steps = 10)

     

4幅   /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py   在通话中(自己,* args,** kwargs)1470 ret =   tf_session.TF_SessionRunCallable(self._session._session,1471
  self._handle,args,   -> 1472 run_metadata_ptr)1473如果run_metadata:1474
  proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

     

ResourceExhaustedError:找到2个根本错误。 (0)资源   精疲力竭:分配形状为[800000,32,30,62]的张量时,OOM和   在/ job:localhost / replica:0 / task:0 / device:GPU:0上输入float   分配器GPU_0_bfc [[{{node conv2d_1 / convolution}}]]提示:如果您   要在发生OOM时查看分配的张量列表,请添加   report_tensor_allocations_upon_oom到当前的RunOptions   分配信息。

     

[[metrics / acc / Mean_1 / _185]]提示:如果要查看以下内容的列表   OOM发生时分配张量,添加   report_tensor_allocations_upon_oom到当前的RunOptions   分配信息。

     

(1)资源耗尽:分配张量时使用OOM   形状[800000,32,30,62]并键入float on   / job:本地主机/副本:0 /任务:0 /设备:GPU:0(通过分配器GPU_0_bfc
  [[{{node conv2d_1 / convolution}}]]提示:如果要查看以下内容的列表   OOM发生时分配张量,添加   report_tensor_allocations_upon_oom到当前的RunOptions   分配信息。

     

0次成功操作。忽略0个派生错误。

感谢阅读,希望对我有帮助:)

3 个答案:

答案 0 :(得分:0)

[800000,32,30,62]看来,您的模型将所有数据分批处理了。

尝试指定的批量大小,例如

history = model.fit([trainimage, train_product_embd],train_label, validation_data=([validimage,valid_product_embd],valid_label), epochs=10, steps_per_epoch=100, validation_steps=10, batch_size=32)

如果仍然是OOM,请尝试减少batch_size

答案 1 :(得分:0)

您的计算机内存不足。您可以做一些事情:

  • 减少DenseConv2D层中神经元的数量
  • 在输入中使用较小的float数据类型,即np.float16而不是np.float64
  • 使用较小的batch_size(或增加steps_per_epoch
  • 使用灰度图像(因此1个通道而不是3个通道)
  • 减少层数
  • 使用更多MaxPooling2D层(紧随Conv2D层之后)
  • strides层中使用较大的Conv2D
  • 调整图像大小(可以使用PIL

答案 2 :(得分:0)

也发生在我身上。

您可以尝试使用某种形式的“转移学习”来减少可训练的参数-尝试冻结最初的几层并使用较小的批次大小。