當前位置: 首頁>>技術教程>>正文


python – Keras,如何獲得每一層的輸出?代碼實例

問題描述

我使用CNN訓練了二分類模型,這是我的Keras代碼

model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
                        border_mode='valid',
                        input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (16, 16, 32)
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (8, 8, 64) = (2048)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2))  # define a binary classification problem
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])
model.fit(x_train, y_train,
          batch_size=batch_size,
          nb_epoch=nb_epoch,
          verbose=1,
          validation_data=(x_test, y_test))

在這裏,我想像TensorFlow一樣獲得每一層的輸出,我該怎麽做?

 

最佳回答

您可以使用以下方法輕鬆獲取任何層的輸出:model.layers[index].output

對於所有圖層,請使用以下命令:

from keras import backend as K

inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functors = [K.function([inp, K.learning_phase()], [out]) for out in outputs]    # evaluation functions

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = [func([test, 1.]) for func in functors]
print layer_outs

注意:要模擬Dropout,請使用learning_phase作為layer_outs中的1.,否則使用0.

改進1:(基於評論)

K.function創建theano /tensorflow張量函數,該函數隨後用於從給定輸入的符號圖中獲取輸出。

現在,需要K.learning_phase()作為輸入,因為許多Keras層(如Dropout /Batchnomalization)都依賴它來在訓練和測試期間更改行為。

因此,如果您刪除代碼中的dropout,則可以簡單地使用:

from keras import backend as K

inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functors = [K.function([inp], [out]) for out in outputs]    # evaluation functions

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = [func([test]) for func in functors]
print layer_outs

改進2:更優化

先前的答案並不是針對每個函數評估進行了優化,因為數據將被傳輸到CPU-> GPU內存中,並且還需要對較低層進行張量計算。

相應的,這裏有一種更好的方法,因為您不需要多個函數,而隻需一個函數即可為您提供所有輸出的列表:

from keras import backend as K

inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 1.])
print layer_outs

 

次佳回答

來自https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer

一種簡單的方法是創建一個新模型,該模型將輸出您感興趣的圖層:

from keras.models import Model

model = ...  # include here your original model

layer_name = 'my_layer'
intermediate_layer_model = Model(inputs=model.input,
                                 outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)

另外,您可以構建Keras函數,該函數將在給定特定輸入的情況下返回特定圖層的輸出,例如:

from keras import backend as K

# with a Sequential model
get_3rd_layer_output = K.function([model.layers[0].input],
                                  [model.layers[3].output])
layer_output = get_3rd_layer_output([x])[0]

 

補充信息

基於上述優秀答案,這裏編寫了一個庫來獲取每一層的輸出。它抽象了所有複雜性,並被設計為盡可能地對用戶友好:

https://github.com/philipperemy/keract

它處理了幾乎所邊際情況,望能幫助到你!

 

參考資料

 

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/4314.html,未經允許,請勿轉載。