TF 2.3 中的错误。当混合 Eager 和 non-Eager Keras 模型时

Posted

技术标签:

【中文标题】TF 2.3 中的错误。当混合 Eager 和 non-Eager Keras 模型时【英文标题】:Error in TF 2.3. when mixing eager and non-eager Keras models 【发布时间】:2021-06-06 05:57:09 【问题描述】:

我在尝试在 Tenserlfow 2.3 中拟合模型时遇到了这个问题,是否有任何解决方法或解决方案?当我尝试使用 TensorFlow 神经网络模型预测一些记录时,也会发生此错误。我希望 Tensorflow 专家能找出问题所在!

代码:

import tensorflow as tf
import numpy as np

DO_BUG = True

inputs = tf.keras.Input((1,))
outputs = tf.keras.layers.Dense(10)(inputs)
model0 = tf.keras.Model(inputs=inputs, outputs=outputs)

if DO_BUG:
    with tf.Graph().as_default():
        inputs = tf.keras.Input((1,))
        outputs = tf.keras.layers.Dense(10)(inputs)
        model1 = tf.keras.Model(inputs=inputs, outputs=outputs)

model0.compile(optimizer=tf.optimizers.SGD(0.1), loss=tf.losses.mse)
model0.fit(np.zeros((4, 1)), np.zeros((4, 10)))

日志:

Traceback (most recent call last):
  File ".../tmp.py", line 15, in <module>
    model0.fit(np.zeros((4, 1)), np.zeros((4, 10)))
  File "...\tensorflow\python\keras\engine\training_v1.py", line 807, in fit
    use_multiprocessing=use_multiprocessing)
  File "...\tensorflow\python\keras\engine\training_arrays.py", line 666, in fit
    steps_name='steps_per_epoch')
  File "...\tensorflow\python\keras\engine\training_arrays.py", line 189, in model_iteration
    f = _make_execution_function(model, mode)
  File "...\tensorflow\python\keras\engine\training_arrays.py", line 557, in _make_execution_function
    return model._make_execution_function(mode)
  File "...\tensorflow\python\keras\engine\training_v1.py", line 2072, in _make_execution_function
    self._make_train_function()
  File "...\tensorflow\python\keras\engine\training_v1.py", line 2021, in _make_train_function
    **self._function_kwargs)
  File "...\tensorflow\python\keras\backend.py", line 3933, in function
    'eager execution. You passed: %s' % (updates,))
ValueError: `updates` argument is not supported during eager execution. You passed: [<tf.Operation 'training/SGD/SGD/AssignAddVariableOp' type=AssignAddVariableOp>]

【问题讨论】:

您使用的 tensorflow 版本是什么?我认为 tf-2.x 版本不支持使用tf.Graph().as_default()。您使用它的任何具体原因? 【参考方案1】:

下面的代码可以正常工作。使用下面评论部分的任何具体原因。

import tensorflow as tf
import numpy as np

DO_BUG = True

inputs = tf.keras.Input((1,))
outputs = tf.keras.layers.Dense(10)(inputs)
model0 = tf.keras.Model(inputs=inputs, outputs=outputs)
"""
if DO_BUG:
    with tf.Graph().as_default():
        inputs = tf.keras.Input((1,))
        outputs = tf.keras.layers.Dense(10)(inputs)
        model1 = tf.keras.Model(inputs=inputs, outputs=outputs)
"""
model0.compile(optimizer=tf.optimizers.SGD(0.1), loss=tf.losses.mse)
model0.fit(np.zeros((4, 1)), np.zeros((4, 10)))

【讨论】:

以上是关于TF 2.3 中的错误。当混合 Eager 和 non-Eager Keras 模型时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TF 2.0 / 1.14.0-eager 和自定义训练循环(梯度磁带)中执行梯度累积?

python tf_eager.py

TF1 中的渐变到 TF2 中的 GradientTape

python lstm_tf_eager.py

TensorFlow报错:tf.placeholder() is not compatible with eager execution.

TensorFlow报错:tf.placeholder() is not compatible with eager execution.