亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號