問題描述
我使用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
它處理了幾乎所邊際情況,望能幫助到你!
參考資料