1. 程式人生 > 程式設計 >keras 獲取某層輸出 獲取複用層的多次輸出例項

keras 獲取某層輸出 獲取複用層的多次輸出例項

官方文件很全面,搜尋功能也很好。但是如果你想單獨實現某個功能,根本無從搜尋。於是我寫了這個筆記。從功能出發。

兩個tensor經過一個layer例項會產生兩個輸出。

a = Input(shape=(280,256))
b = Input(shape=(280,256))
 
lstm = LSTM(32)
encoded_a = lstm(a)
encoded_b = lstm(b)
 
lstm.output

這個程式碼有錯誤,因為最後一行沒有指定lstm這個layer例項的那個輸出。

>> AttributeError: Layer lstm_1 has multiple inbound nodes,hence the notion of "layer output" is ill-defined.
Use `get_output_at(node_index)` instead.

所以如果想要得到多個輸出中的一個:

assert lstm.get_output_at(0) == encoded_a
assert lstm.get_output_at(1) == encoded_b

補充知識:kears訓練中如何實時輸出卷積層的結果?

在訓練unet模型時,發現預測結果和真實結果幾乎完全差距太大,想著列印每層輸出的結果檢視問題在哪?

但是發現kears只是提供了訓練完成後在模型測試時輸出每層的函式。並沒有提供訓練時的函式,同時本著不對原有程式碼進行太大改動。最後實現了這個方法。

即新建一個輸出節點新增到現有的網路結構裡面。

#新建一個列印層。
class PrintLayer(Layer):
	#初始化方法,不須改變
 def __init__(self,**kwargs):
  super(PrintLayer,self).__init__(**kwargs)
	#呼叫該層時執行的方法
 def call(self,x):
  x = tf.Print(x,[x],message="x is: ",summarize=65536)
  #呼叫tf的Print方法列印tensor方法,第一個引數為輸入的x,第二個引數為要輸出的引數,summarize引數為輸出的元素個數。
  return x;
  #一定要返回tf.Print()函式返回的變數,不要直接使用傳入的變數。
 
#接著在網路中引入
conv9 = Conv2D(2,3,activation = 'relu',padding = 'same',kernel_initializer = 'he_normal')(conv9)
print11 = PrintLayer()(conv9)
conv10 = Conv2D(1,1,activation = 'sigmoid')(print11)
#PrintLayer層處理的結果一定要在下一層用到,不然不會列印tensor。該結點可以加在任何結點之間。

以上這篇keras 獲取某層輸出 獲取複用層的多次輸出例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。