为了账号安全,请及时绑定邮箱和手机立即绑定

ValueError: Graph disconnected: cannot obtain

ValueError: Graph disconnected: cannot obtain

胡说叔叔 2023-04-25 16:12:33
我想用 tf2.keras 获得中间子模型层的输出。这是一个由两个子模块组成的模型:    input_shape = (100, 100, 3)    def model1():        input = tf.keras.layers.Input(input_shape)        cov = tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=1,name='cov1')(input)        embedding_model = tf.keras.Model(input,cov,name='model1')        return embedding_model    def model2(embedding_model):        input_sequence = tf.keras.layers.Input((None,) + input_shape)        sequence_embedding = tf.keras.layers.TimeDistributed(embedding_model,name='time_dis1')        emb = sequence_embedding(input_sequence)        att = tf.keras.layers.Attention()([emb,emb])        dense1 = tf.keras.layers.Dense(64,name='dense1')(att)        outputs = tf.keras.layers.Softmax()(dense1)        final_model = tf.keras.Model(inputs=input_sequence, outputs=outputs,name='model2')        return final_model    embedding_model = model1()    model2 = model2(embedding_model)    print(model2.summary())
查看完整描述

1 回答

?
慕妹3242003

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


我知道这个解释可能会让你头晕目眩,因为这个错误背后的原因非常复杂。但通过它几次有望有所帮助。


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信