Keras 模型训练是可能的,但形状与损失函数不兼容

时间:2021-02-07 19:11:44

标签: python tensorflow keras loss-function

我有一个 Keras 模型,它输出形状为 (None, 50, 1) 的张量。我正在将它与形状为 (None, 1) 的目标张量进行拟合。损失为 mse。令我惊讶的是,这似乎可以成功训练而不会引发异常,因为形状不同。实际上,如果您尝试直接在输出张量和目标张量上调用 mse 损失函数,它会引发 InvalidArgumentError: Incompatible shapes。如果不调用损失函数,那么有人可以解释一下 Keras 在训练中的作用吗?

以下代码示例说明了上述内容。

准备:

import numpy as np
from tensorflow import keras

model = keras.Sequential([
    keras.layers.SimpleRNN(10, return_sequences=True),
    keras.layers.Dense(1)])

model.compile(optimizer="nadam", loss="mse")

y = np.random.rand(32*10, 1)
X = np.random.rand(32*10, 50, 1)
y_pred = model(X)

print(y.shape)
print(y_pred.shape)
(320, 1)
(320, 50, 1)

训练在不引发异常的情况下进行:

model.fit(X, y, batch_size=32, epochs=2)

Epoch 1/2
10/10 [==============================] - 0s 7ms/step - loss: 1.4437
Epoch 2/2
10/10 [==============================] - 0s 7ms/step - loss: 0.8179

但是在示例批次上调用损失函数会引发异常:

y_batch = y[:32]
y_pred_batch = y_pred[:32]

print(y_batch.shape)
print(y_pred_batch.shape)
(32, 1)
(32, 50, 1)
keras.losses.mse(y_batch, y_pred_batch)
InvalidArgumentError: Incompatible shapes: [32,50,1] vs. [32,1] [Op:SquaredDifference]

0 个答案:

没有答案