## 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]。输入是什么意思?受过训练的模型是否存储输入?
答案 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
。