Keras 中间层输出

9
我将尝试在使用Keras的Functional API时获取中间层输出。我可以在使用标准Sequential API时获取输出,但在使用Functional 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)

但是如果我使用函数式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)

回答: 显然,在使用功能 API 层时,0 表示输入本身。因此,所有内容都向前移动一个位置。


8
为什么不将你的答案写成一个实际的答案(并接受它),而不是将它作为问题的脚注?这样很容易被忽略... 建议将您的回答作为一个实际的答案发布,并选中“接受答案”。这样其他人就能更容易地找到您的答案,而不会错过它。 - Mr Tsjolder
1个回答

0
问题出在OP所说的事实上,即索引为0的层(即model.layers[0])对应于输入层:“使用函数式API时,第0层就是输入本身。因此,所有内容都向前移动了一个位置。”
注意:此答案以社区百科的形式发布,正如已接受的答案和{{link2:“没有答案的问题,但问题在评论中得到解决(或在聊天中扩展)”}}中建议的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接