Keras,如何获取每一层的输出?

新手上路,请多包涵

我用 CNN 训练了一个二元分类模型,这是我的代码

model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
                        border_mode='valid',
                        input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (16, 16, 32)
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (8, 8, 64) = (2048)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2))  # define a binary classification problem
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])
model.fit(x_train, y_train,
          batch_size=batch_size,
          nb_epoch=nb_epoch,
          verbose=1,
          validation_data=(x_test, y_test))

在这里,我想像 TensorFlow 一样获取每一层的输出,我该怎么做?

原文由 GoingMyWay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 636
2 个回答

您可以使用以下方法轻松获得任何层的输出: model.layers[index].output

对于所有层使用这个:

 from keras import backend as K

inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functors = [K.function([inp, K.learning_phase()], [out]) for out in outputs]    # evaluation functions

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = [func([test, 1.]) for func in functors]
print layer_outs

注意:要模拟辍学使用 learning_phase 1. layer_outs 0.

编辑:( 基于评论)

K.function 创建 theano/tensorflow 张量函数,稍后用于在给定输入的情况下从符号图中获取输出。

现在 K.learning_phase() 需要作为输入,因为像 Dropout/Batchnomalization 这样的许多 Keras 层都依赖它来改变训练和测试期间的行为。

因此,如果您删除代码中的 dropout 层,您可以简单地使用:

 from keras import backend as K

inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functors = [K.function([inp], [out]) for out in outputs]    # evaluation functions

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = [func([test]) for func in functors]
print layer_outs

编辑 2:更优化

我刚刚意识到之前的答案并没有针对每个函数评估进行优化,数据将被传输到 CPU->GPU 内存,而且张量计算需要对下层进行 over-n-over。

相反,这是一种更好的方法,因为您不需要多个函数,而是一个函数即可为您提供所有输出的列表:

 from keras import backend as K

inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 1.])
print layer_outs

原文由 indraforyou 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自 https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer

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

 from keras.models import Model

model = ...  # include here your 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]

原文由 blue-sky 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题