从一个非最终的Keras模型层获取输出

7

我正在使用 Ubuntu,Python 3 和 Tensorflow 上的 Keras,我正在尝试使用预训练的 Keras 模型进行迁移学习,如此处所述:这里

我正在使用以下代码:

import numpy as np
from keras.applications import vgg16, inception_v3, resnet50, mobilenet
from keras import Model

a = np.random.rand(1, 224, 224, 3) + 0.001
a = mobilenet.preprocess_input(a)

mobilenet_model = mobilenet.MobileNet(weights='imagenet')

mobilenet_model.summary()
inputLayer = mobilenet_model.input

m = Model(input=inputLayer, outputs=mobilenet_model.get_layer("conv_pw_13_relu")(inputLayer))
m.set_weights(mobilenet_model.get_weights()[:len(m.get_weights())])
p = m.predict(a)
print(np.std(p), np.mean(p))
print(p.shape)

我正在使用的层的输出始终是一个由零组成的数组,我应该加载我创建的权重到p中,以使预训练模型实际工作吗?


1
尝试使用 m = Model(input=..., outputs=mobilenet_model.get_layer('...').output)) - sdcbr
可以了!你能发一篇答案吗? - thebeancounter
1
Sreeram TP发布了这个答案,请随意接受。 :) - sdcbr
2个回答

14
在Keras中,层和这些层的输出之间有一个区别。你可以把层想象成代表计算,而输出代表这些计算的结果。当你实例化一个Model对象时,它期望的是计算的结果作为输出,而不是计算本身,因此会出现错误。要修复它,你可以将层的输出传递给Model构造函数:
import numpy as np
from keras.applications import vgg16, inception_v3, resnet50, mobilenet
from keras import Model

a = np.random.rand(24, 224, 224, 3)
a = mobilenet.preprocess_input(a)

mobilenet_model = mobilenet.MobileNet(weights='imagenet')

mobilenet_model.summary()

model_output = mobilenet_model.get_layer("conv_pw_13_relu").output
m = Model(inputs=mobilenet_model.input, outputs=model_output)
print(m.predict(a))

1
谢谢,您的回答帮助我理解了这个隐藏的 bhahmyagyan(印地语单词) - silentsudo

2
为了访问Keras模型中间层的输出,Keras提供了不同的方法。
在您的情况下,您可以像这样获取所需层的输出。
model_out = mobilenet_model.get_layer("layer_you_want").output
m = Model(input=inputLayer, outputs=model_out)

如果需要更多关于此方法和其他可用方法的详细信息,请查看文档。


请再解释一下。 - thebeancounter
请参阅此文档 https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer - Sreeram TP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接