我正在使用tensorflow 2.0在tf.keras中训练模型。 我的模型似乎可以成功训练,但是没有遍历整个数据集。我将代码重构为tensorflow 1.15,在tensorflow 1.x中没有这个问题。我正在关注this tutorial,用于多输入系列。以下是更多详细信息:
我有一个时间序列数据集。它很小,因此我可以将其加载到内存中,因此不需要数据集API。我正在打开时间序列窗口以产生两个数组X和Y,例如
X=[
[[1,2,3],[4,5,6], [7,8,9]],
[[4,5,6],[7,8,9], [10,11,12]],
[[7,8,9],[10,11,12],[13,14,15]],
...
]
Y = [
[4],
[7],
[10],
...
]
(是的,我意识到我可以很容易地只包含其中一个功能并制作X=[[[1,2,3]], [[4,5,6]], [[7,8,9]], ...]
,但是我将包含许多功能,这些功能在管道正常工作时并不能完美同步。而且,即使当我仅包含第一个功能,我仍然看到我描述的问题。)
然后,我建立我的模型:
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
然后我训练它:
model.fit([X],[Y],num_epochs=300,validation_split=0.2)
它正确报告训练和验证样本的数量,然后弹出进度条...但这就是成功的地方。对于每个时期,val_loss和val_mean_squared_error始终为0,并且似乎永远不会训练我的数据集中的窗口的一部分(〜1/1000)以上。这是打印输出:
Epoch X/300 192/162636 [..............................] - ETA: 45:42 - loss: 0.4783 - mean_squared_error: 0.4783 - val_loss: 0.0000e+00 - val_mean_squared_error: 0.0000e+00
当我在tf 1.15中执行相同的代码时,它会按我的预期执行-历时大约需要45分钟(在tf 2.0中,它们花费的时间少于3秒),而tf 1.15报告了合法的val_loss和val_mean_squared_error。我无法弄清楚为什么该模型在tf 2.0中无法正确训练。这是我第一次在tf 2.0中编写代码,但并未从tf 1.13迁移,但是我从tf 1.13升级到tf 2.0的所有旧代码都没有错误地执行。我迁移的遗留代码都没有顺序模型。
没有报告的错误,警告或信息,它只是尽早停止遍历我的数据集。 有人对tensorflow 2.0中的tf.keras.Model.fit的更改有任何见解吗?还是我走的道路上有任何错误?任何见解将不胜感激。谢谢!
编辑11/25:
我已针对此错误here提交了GitHub问题。请查看该帖子以获取进度更新,并且在问题解决后,我会尽力记得更新此帖子。
您描述的行为可疑,听起来很像TF方面的错误。您可以尝试做的一件可能的事是在导入张量流后立即通过调用tf.compat.v1.enable_v2_behavior()
在TF 1.15中启用TF2的行为。这会进行很多内部更改(老实说,我本人不知道exactly的作用,文档只说“它将TensorFlow 1.x和2.x之间不同的所有全局行为切换为(适用于2.x。”),这可以帮助您弄清错误的根源是在Tensorflow的实现中还是在您的代码中。
[我可能要做的另一项检查是确保您在各处使用tf.keras
(即Tensorflow对Keras API的实现),而不是“独立的” Keras(您可以通过pip install keras
安装的)。第一个是为与TF兼容而量身定制的,而第二个也许还不能完全容忍TF1和TF2之间的重大变化,尽管这纯粹是猜测。