我想创建一个具有多个输入的模型。因此,我尝试构建这样的模型。
# 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个派生错误。
感谢阅读,希望对我有帮助:)
答案 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)
您的计算机内存不足。您可以做一些事情:
Dense
,Conv2D
层中神经元的数量float
数据类型,即np.float16
而不是np.float64
batch_size
(或增加steps_per_epoch
)MaxPooling2D
层(紧随Conv2D
层之后)strides
层中使用较大的Conv2D
PIL
)答案 2 :(得分:0)
也发生在我身上。
您可以尝试使用某种形式的“转移学习”来减少可训练的参数-尝试冻结最初的几层并使用较小的批次大小。