ValueError: Graph disconnected: cannot obtain

我想用 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())


胡说叔叔
浏览 101回答 1
1回答

慕妹3242003

那么为什么我们需要输入一个额外的张量简短的回答是,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 axisoutput_mean = tf.keras.layers.Average(output1, axis=1)这是因为您无法访问层嵌套的层的输出TimeDistributed。因为传递给图层的图层TimeDistributed实际上并没有做任何事情。而且它没有定义的output. 它只是作为图层的模板放在那里,TimeDistributed使用它来计算输出。因此,要从一个层获取输出TimeDistributed,您需要通过该层访问它。你试着按照你拥有的方式去做(而不是我的方式),你会得到,AttributeError: Layer cov1 has no inbound nodes.你可能会问,“为什么它以前有效”?这是因为,在你有一个Modelthere 而不是Layer. 因为层被模型包裹起来了,所以定义了Conv2D层(因为它有层)。这又回到了原因,为什么它在尝试定义.outputInputInputmodel1submodel我知道这个解释可能会让你头晕目眩,因为这个错误背后的原因非常复杂。但通过它几次有望有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python