我有一个 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]