【发布时间】:2020-09-12 19:42:56
【问题描述】:
我在 tensorflow/keras 中定义了一个 LSTM 模型,如下所示。我只包括与问题有关的相关细节。
t_steps = 60
n_features = 3
def LSTMModel():
input = Input(shape=(t_steps, n_features))
l1 = BatchNormalization()(input)
l2 = LSTM(160,return_sequences=True)(l1)
l3 = LSTM(80,return_sequences=True)(l2)
l4 = LSTM(10,return_sequences=True)(l3)
l5 = Dense(1, activation = 'relu')(l4)
model = Model(inputs = input, outputs = l5)
model.compile(loss="mean_squared_error", optimizer='adam')
return model
# shape of X_train_seq is (275268, 60, 3)
# shape of Y_train_seq is (275268,)
model = LSTMModel()
model.fit(X_train_seq, Y_train_seq, epochs=n_epochs,
batch_size=batch_size,verbose=1,initial_epoch=init_epoch)
然后,当我在形状为 (30355, 60, 3) 的 X_test_seq 上使用此模型进行预测时,我得到形状为 (30355, 60, 1) 的 Y_test_seq_pred,而我期望预测形状为 (30355,)。发生这种情况是因为我上面代码中的 l4 行应该是
l4 = LSTM(10,return_sequences=False)(l3)
我的问题是,使用原始代码,为什么 Tensorflow/Keras 在训练期间没有给出错误或产生任何类型的警告,因为传递给 fit() 方法的 Y_train_seq 的形状是 (275268,) 并且在训练期间,它必须在优化期间为每个批次在内部预测形状为 (batch_size, 60, 1) 的 Y,并将其与来自 Y_train_seq 的形状切片 (batch_size,) 进行比较。为什么 Y 中的这种尺寸不匹配仍然让代码继续,只是让我在训练结束时发现它? 我确信这背后一定有一些原因,我想知道发生了什么。 谢谢!!
【问题讨论】:
-
我在 google colab 上创建了一个示例代码,怀疑这可能与 tf/keras 版本有关。使用 colab 上的默认版本(Keras 2.3.1,tf 2.2.0)它确实给我一个关于尺寸不匹配的错误。然后进行交叉检查,我安装了 Keras 2.2.4(这是我的机器所拥有的)并且代码执行良好,没有任何错误。为了完成 A-B-A 测试,我在 google colab 上重新安装了 Keras 2.3.1,希望它会给我一个错误,但它仍然执行得很好,没有说明任何尺寸。这让我很困惑。
标签: python tensorflow machine-learning keras lstm