Keras中间层输出

Posted

技术标签:

【中文标题】Keras中间层输出【英文标题】:Keras intermediate layers output 【发布时间】:2017-07-14 14:37:01 【问题描述】:

我正在尝试在使用 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)

但如果我使用函数式 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 层是输入本身。所以一切都向前移动了一个位置。

【问题讨论】:

为什么不将您的答案写为实际答案(并接受它),而不是将其作为问题的脚注?监督很容易...... 【参考方案1】:

问题源于事实,正如 OP 所建议的那样,索引为 0 的层(即model.layers[0])对应于输入层:“当使用功能 API 时,层 0 是输入本身。所以一切都是前移一位​​。”

注意:此答案作为社区 wiki 发布,如 accepted answer of "Question with no answers, but issue solved in the comments (or extended in chat)" 中所建议的那样。

【讨论】:

以上是关于Keras中间层输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在keras中可视化卷积神经网络中间层的输出?

可以在 keras 损失函数中直接访问中间层吗?

Keras FAQ: 常见问题解答

mac 上keras不能用GPU?

Keras 中间层可视化,附代码详解,以Mnist数字为对象

测试最佳神经元数量 - Keras / Tensorflow