Keras获得了中间层的输出

时间:2017-03-21 05:57:46

标签: tensorflow neural-network keras conv-neural-network

## what my model looks like

# defining the model archictecture
model = Sequential()
# 1st conv layer
model.add(Conv2D(32, (5, 5), activation='relu', input_shape=x_ip_shape))
# 1st max pool
model.add(MaxPooling2D(pool_size=(2, 2)))
# 2nd conv layer
model.add(Conv2D(64, (7, 7), activation='relu'))
# 2nd max pool
model.add(MaxPooling2D(pool_size=(2, 2)))
# Flattenning the input
model.add(Flatten())
# 1st Fully connected layer
model.add(Dense(10, activation='relu'))
# Adding droput
model.add(Dropout(0.25))
# softmax layer
model.add(Dense(classes_out, activation='softmax'))

# defining loss, optimizer learning rate and metric
model.compile(loss='categorical_crossentropy',optimizer=keras.optimizers.Adam(1e-4), metrics=['accuracy'])


## prediction
scores = model.evaluate(test_x, test_labels, verbose=0)

问题: 相反,我可以获得#1st完全连接层的正向传递输出,即model.add(Dense(10, activation='relu'))

我在keras FAQ上看了一些例子。但它让我很困惑: 在这:

get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()], [model.layers[3].output])

我在哪里传递输入数据? model.layers [0]。输入是什么意思?受过训练的模型是否存储输入?

1 个答案:

答案 0 :(得分:4)

get_3rd_layer_output是Theano函数。您无需对其进行任何修改。

model.layers[0].input将保持原样,如果您想要输出(任何层)输出给定网络中第一层的输入。换句话说,如果您希望将第4层的某些图层输出为输入,则应将其更改为model.layers[4].input

K.learning_phase()表示您是希望输出处于训练阶段还是测试阶段。这两个输出之间会有一些差异,因为Dropout等层在训练和测试时间内表现不同。如果您希望输出类似于predict(),则需要传递零。

model.layers[3].output:这是您需要进行修改的地方。找出要从中输出的图层的索引。如果您有IDE(例如Pycharm),则单击model变量并查看图层的索引(记住它从零开始)。如果没有,请为该图层指定一些名称,然后通过model.layers找到所有图层名称。从这里,您可以轻松获得索引。例如,如果您想要从第10层输出,那么您可以将其更改为model.layers[10].output

如何调用此方法?

这又是一个Theano函数,所以是一个符号的函数。您必须传递值并对其进行评估。你这样做:

out = get_3rd_layer_output([X, 0])[0]  # test mode

请记住,即使X是单个数据点,其形状也应为(1,) + x_ip_shape