当调用tf.keras.model.fit时,Tensorflow 2.0不会遍历整个数据集

问题描述 投票:1回答:1

我正在使用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问题。请查看该帖子以获取进度更新,并且在问题解决后,我会尽力记得更新此帖子。

tensorflow tensorflow2.0 tf.keras
1个回答
1
投票

您描述的行为可疑,听起来很像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之间的重大变化,尽管这纯粹是猜测。

© www.soinside.com 2019 - 2024. All rights reserved.