2017-03-21 81 views
0
的輸出
## what my model looks like 

# defining the model archictecture 
model = Sequential() 
# 1st conv layer 
model.add(Conv2D(32, (5, 5), activation='relu', input_shape=x_ip_shape)) 
# 1st max pool 
model.add(MaxPooling2D(pool_size=(2, 2))) 
# 2nd conv layer 
model.add(Conv2D(64, (7, 7), activation='relu')) 
# 2nd max pool 
model.add(MaxPooling2D(pool_size=(2, 2))) 
# Flattenning the input 
model.add(Flatten()) 
# 1st Fully connected layer 
model.add(Dense(10, activation='relu')) 
# Adding droput 
model.add(Dropout(0.25)) 
# softmax layer 
model.add(Dense(classes_out, activation='softmax')) 

# defining loss, optimizer learning rate and metric 
model.compile(loss='categorical_crossentropy',optimizer=keras.optimizers.Adam(1e-4), metrics=['accuracy']) 


## prediction 
scores = model.evaluate(test_x, test_labels, verbose=0) 

問題: 相反,我可以得到一個直傳爲#1日完全連接層的輸出,即model.add(Dense(10, activation='relu'))Keras越來越intermidate層

我通過keras的例子FAQ。但我感到困惑: 在此:

get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()], [model.layers[3].output]) 

我在哪裏傳遞輸入數據? model.layers [0] .input是什麼意思?訓練有素的模型是否存儲輸入?

回答

2

get_3rd_layer_output是一個Theano函數。你不需要做很多修改。

model.layers[0].input將保持原樣,如果您希望在網絡中輸入第一層的輸出(任何圖層)。換句話說,如果你想要輸出第4層作爲輸入的某個圖層,那麼你應該將其更改爲model.layers[4].input

K.learning_phase()指示您是希望在訓練階段還是在測試階段輸出。這兩種輸出之間會有一些差異,因爲在訓練和測試時間內存在諸如Dropout等不同的層次。如果您希望輸出類似於predict(),則您希望傳遞零。

model.layers[3].output:這是您需要進行修改的地方。找出你想輸出的圖層的索引。如果您有IDE(例如Pycharm),則點擊model變量並查看圖層的索引(請記住它從零開始)。如果沒有,請爲該圖層指定一些名稱,然後通過執行model.layers找出所有圖層名稱。從這裏,你可以很容易地獲得索引。例如,如果你想從第10層輸出,那麼你可以將其更改爲model.layers[10].output

如何調用?

這又是一個Theano函數,所以是一個同態函數。您必須傳遞值並對其進行評估。你這樣做如下:

out = get_3rd_layer_output([X, 0])[0] # test mode 

記住,即使X是一個單一的數據點,其形狀應(1,) + x_ip_shape

+0

我不明白K.Learning_phase()在這裏的作用。從理論上講,在訓練中,我們設置一些給定概率的隱藏輸出爲0.並且在測試中我們採用期望。 1.如果我想獲得中間層的輸出,是不是總是在測試時間?說,我訓練了模型。現在,我想檢查一些火車樣本的中間輸出。在這種情況下,我會使用測試模式,對吧? –

+0

你會使用測試模式,但我認爲他們已經給出了功能。如果你的訓練沒有按預期工作,那麼你會希望看到訓練階段的中間輸出是正確的? –