从 TF1 移动到 TF2 时,具有多个输入的功能模型中的 AssertionError

AssertionError in Functional Model with Multiple Inputs when moving from TF1 to TF2

您好,我正在尝试将旧模型从 TF1 上的 运行ning 转换为 TF2,但 运行ning 遇到了一些问题。一直在使用 google colab 在 TF1 和 TF2 之间切换,使用 TF1 似乎 运行 一切正常,但使用 TF2 则不然。我已经用下面的一小段代码复制了这个问题。


from keras.layers import *
from keras import Model
from keras.backend import squeeze

def create_model():

    inputA = Input(shape=(1,))
    x = Dense(1)(inputA)
    x = Model(inputs=inputA, outputs=x)

    print(x.predict([0.1]))
    
    inputB = Input(shape=(1,))
    y = Dense(1)(inputB)
    y = Model(inputs=inputB, outputs=y)
    
    print(y.predict([0.1]))
    
    combined  = concatenate(inputs = [x.output,y.output])
    model = Model(inputs=[x.input, y.input], outputs=combined)
    
    return model


if (__name__  == "__main__") :
    model = create_model()
    model.compile(loss='mse',optimizer='RMSprop')
    model.summary()

    print(model.predict([[0.1],[0.1]]))


这里是使用 TF2 的错误:

AssertionError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:1462 predict_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:1452 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:1445 run_step  **
        outputs = model.predict_step(data)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:1418 predict_step
        return self(x, training=False)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py:985 __call__
        outputs = call_fn(inputs, *args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/functional.py:386 call
        inputs, training=training, mask=mask)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/functional.py:517 _run_internal_graph
        assert x_id in tensor_dict, 'Could not compute output ' + str(x)

    AssertionError: Could not compute output Tensor("concatenate/concat:0", shape=(None, 2), dtype=float32)

如有任何帮助,我们将不胜感激。

谢谢, V_W

您可以像这样修改您的代码,

from tf.keras.layers import *
from tf.keras import Model

def create_model():

    inputA = Input(shape=(1,))
    x = Dense(1)(inputA)
    modelA = Model(inputs=inputA, outputs=x)

    print(modelA.predict([0.1]))
    
    inputB = Input(shape=(1,))
    y = Dense(1)(inputB)
    modelB = Model(inputs=inputB, outputs=y)
    
    print(modelB.predict([0.1]))
    
    concat = Concatenate()( [ x , y ] )
    model = Model(inputs=[ inputA, inputB ], outputs=concat )
    
    return model