Keras中间层输出

Mig*_*uel 7 python neural-network deep-learning keras keras-layer

我正在尝试使用Keras的功能API时获得中间层输出.我可以在使用标准的Sequential API时获得输出,但不能使用功能API.

我正在研究这个有用的玩具示例:

from keras.models import Sequential
from keras.layers import Input, Dense,TimeDistributed
from keras.models import Model
from keras.layers import Dense, LSTM, Bidirectional,Masking

inputs = [[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[1,2,3],[4,5,6],[7,8,9],[10,11,12]],[[10,20,30],[40,50,60],[70,80,90],[100,110,120]]]

model = Sequential()
model.add(Masking(mask_value=0., input_shape = (4,3)))
model.add(Bidirectional(LSTM(3,return_sequences = True),merge_mode='concat'))
model.add(TimeDistributed(Dense(3,activation = 'softmax')))


print "First layer:"
intermediate_layer_model = Model(input=model.input,output=model.layers[0].output)
print intermediate_layer_model.predict(inputs)
print ""
print "Second layer:"
intermediate_layer_model = Model(input=model.input,output=model.layers[1].output)
print intermediate_layer_model.predict(inputs)
print ""
print "Third layer:"
intermediate_layer_model = Model(input=model.input,output=model.layers[2].output)
print intermediate_layer_model.predict(inputs)
Run Code Online (Sandbox Code Playgroud)

但是如果我使用功能API,它就不起作用.输出不正确.例如,它在第二层输出初始输入:

inputs_ = Input(shape=(4,3))
x = Masking(mask_value=0., input_shape = (4,3))(inputs_)
x = Bidirectional(LSTM(3,return_sequences = True),merge_mode='concat')(x)
predictions = TimeDistributed(Dense(3,activation = 'softmax'))(x)
model2 = Model(input=inputs_, output=predictions)

print "First layer:"
intermediate_layer_model = Model(input=model2.input,output=model2.layers[0].output)
print intermediate_layer_model.predict(inputs)
print ""
print "Second layer:"
intermediate_layer_model = Model(input=model2.input,output=model2.layers[1].output)
print intermediate_layer_model.predict(inputs)
print ""
print "Third layer:"
intermediate_layer_model = Model(input=model2.input,output=model2.layers[2].output)
print intermediate_layer_model.predict(inputs)
Run Code Online (Sandbox Code Playgroud)

答案:嗯,我自己解决了.显然,当使用功能API层时,0是输入本身.所以一切都向前移动了一个位置.

tod*_*day 0

正如 OP 所建议的,问题源于这样一个事实:索引为 0 的层(即model.layers[0])对应于输入层:“当使用功能 API 时,层 0 就是输入本身。因此所有内容都会向前移动一个位置。”

注意:此答案作为社区 wiki 发布,如“没有答案的问题,但问题在评论中解决(或在聊天中扩展)”的接受答案中建议。