TensorFlow - ValueError: 输出张量必须是TensorFlow“Layer”的输出

4

我已经使用TensorFlow 2.0中的Keras函数API创建了一个RNN,以下代码段可用:

sum_input = keras.Input(shape=(UNIT_SIZE, 256,), name='sum')
x         = tf.unstack(sum_input,axis=2, num=256)
t_sum     = x[0]
for i in range(len(x) - 1):
    t_sum = keras.layers.Add()([t_sum, x[i+1]])
sum_m     = keras.Model(inputs=sum_input, outputs=t_sum, name='sum_model')

我后来不得不改用Tensorflow 1.13,但是遇到了以下错误:

ValueError: Output tensors to a Model must be the output of a TensorFlow `Layer` (thus holding past layer metadata). Found: Tensor("add_254/add:0", shape=(?, 40), dtype=float32)

我不明白为什么输出张量不是来自TensorFlow层,因为t_sum是从keras.layers.Add中输出的。

我已经尝试将代码的部分包装到keras.layers.Lambda中,如 ValueError: Output tensors to a Model must be the output of a TensorFlow Layer所建议的那样,但似乎对我没有用。

1个回答

4
问题并不在于Add()层,而是在于tf.unstack() - 它不是keras.layers.Layer()的一个实例。您可以将其包装为自定义层:
import tensorflow as tf

class Unstack(tf.keras.layers.Layer):
    def __init__(self):
        super(Unstack, self).__init__()
    def call(self, inputs, num=256):
        return tf.unstack(inputs, axis=2, num=num)

x = Unstack()(sum_input)

或者,您可以使用Lambda层而不是子类化来实现:

x = tf.keras.layers.Lambda(lambda t: tf.unstack(t, axis=2, num=256))(sum_input)

我们可以使用Lambda层来包装tf.unstack()吗? - CKM
@chandresh 当然,x = tf.keras.layers.Lambda(lambda t: tf.unstack(t, axis=2, num=256))(inputs) - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接