使用tf.keras.application时如何获得中间输出

时间:2018-08-27 12:10:54

标签: python tensorflow keras

tf.keras.application包含许多著名的神经网络链接VGGdensenetmobilenet等。以tf.keras.application.MobileNet为例,我感兴趣的不仅是最终输出,还包括中间层的输出,在重新训练网络时如何获得所有这些输出。

可能对model.get_output_at(index)有帮助。但是,每次调用此函数时,都会得到一个DeferredTensor,因为我无法同时转发数据。是否存在方便的方法?

预先感谢〜

1 个答案:

答案 0 :(得分:2)

我建议您阅读喀拉拉语documentation

一种简单的方法是创建一个新的Model,它将输出您感兴趣的图层:

from keras.models import Model

model = ...  # create the original model

layer_name = 'my_layer'
intermediate_layer_model = Model(inputs=model.input,
                                 outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)

或者,您可以构建Keras函数,该函数将在给定特定输入的情况下返回特定图层的输出,例如:

from keras import backend as K

# with a Sequential model
get_3rd_layer_output = K.function([model.layers[0].input],
                                  [model.layers[3].output])
layer_output = get_3rd_layer_output([x])[0]

类似地,您可以直接构建Theano和TensorFlow函数。

请注意,如果模型在训练和测试阶段的行为不同(例如,如果使用Dropout,BatchNormalization等),则需要将学习阶段标志传递给函数:

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

# output in test mode = 0
layer_output = get_3rd_layer_output([x, 0])[0]

# output in train mode = 1
layer_output = get_3rd_layer_output([x, 1])[0]

这是fchollet他自己写的另一个类似的答案: How can I get hidden layer representation of the given data?