1 回答
TA贡献1824条经验 获得超6个赞
那么为什么我们需要输入一个额外的张量
简短的回答是,TensorFlow 不知道在您期望的输入之间建立联系。出现问题是因为您将 Model (而不是Layer)传递给您的TimeDistributed图层。这会留下Input你的model1悬挂层,除非你明确地向它传递一个输入。该TimeDistributed层不够智能,无法以这种方式处理模型。
我的解决方案取决于以下问题的答案,
你为什么需要model1?它只有一层Conv2D。你可以轻松做到
sequence_embedding = tf.keras.layers.TimeDistributed(
tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=1,name='cov1'),
name='time_dis1'
)
如果你这样做,现在你必须改变以下几行,
model1_output_layer = model2.get_layer('time_dis1').layer.get_layer('cov1')
output1 = model1_output_layer.get_output_at(0)
类似的东西(你想要的确切输出将取决于你实际追求的是什么)
model1_output_layer = model2.get_layer('time_dis1')
output1 = model1_output_layer.output
# This output1 may need further processing depending on what you need
# e.g. if you need mean embeddings over time axis
output_mean = tf.keras.layers.Average(output1, axis=1)
这是因为您无法访问层嵌套的层的输出TimeDistributed。因为传递给图层的图层TimeDistributed实际上并没有做任何事情。而且它没有定义的output. 它只是作为图层的模板放在那里,TimeDistributed使用它来计算输出。因此,要从一个层获取输出TimeDistributed,您需要通过该层访问它。
你试着按照你拥有的方式去做(而不是我的方式),你会得到,
AttributeError: Layer cov1 has no inbound nodes.
你可能会问,“为什么它以前有效”?
这是因为,在你有一个Modelthere 而不是Layer. 因为层被模型包裹起来了,所以定义了Conv2D层(因为它有层)。这又回到了原因,为什么它在尝试定义.outputInputInputmodel1submodel
我知道这个解释可能会让你头晕目眩,因为这个错误背后的原因非常复杂。但通过它几次有望有所帮助。
添加回答
举报