我尝试为ImageNet提供可靠的功能,以便对它们进行进一步的分类。为了达到这个目的,我想使用与Alexnet的tensorflow进行特征提取。这意味着我想从CNN的最后一层获取值。有人可以编写一段Python代码来解释它是如何工作的吗?
答案 0 :(得分:3)
正如jonrsharpe所提到的,那不是真正的stackoverflow的MO,但在实践中,很多人确实选择编写代码来帮助解释答案(因为它通常更容易) 。 因此,我将假设这只是错误传达,您真的打算提出以下两个问题之一:
第一个问题的答案实际上非常简单。我将使用TensorFlow中的cifar10
示例代码(松散地基于AlexNet)作为示例。网络的正向传递建立在inference
函数中,该函数返回表示softmax图层输出的变量。要实际获取预测的图像标签,您只需对logits进行argmax,如下所示:(我已经省略了一些设置代码,但如果您已经运行了alexnet,那么您已经有了这个功能)
logits = cifar10.inference(images)
predictions = tf.argmax(logits,1)
# Actually run the computation
labels = session.run([predictions])
因此,抓住最后一层功能实际上就像要求它们一样简单。唯一的问题是,在这种情况下,cifar10本身没有暴露它们,所以你需要修改cifar10.inference函数来返回两者:
# old code in cifar10.inference:
# return softmax_linear
# new code in cifar10.inference:
return softmax_linear, local4
然后修改所有对cifar10.inference的调用,就像我们刚刚显示的那样:
logits,local4 = cifar10.inference(images)
predictions = tf.argmax(logits,1)
# Actually run the computation, this time asking for both answers
labels,last_layer = session.run([predictions, local4])
就是这样。 last_layer
包含您为模型提供的所有输入的最后一层。
关于第二个问题,这是一个更深层次的问题,但我猜这就是为什么你想要解决这个问题。我建议首先阅读该领域发表的一些论文。我不是这里的专家,但我确实喜欢Bolei Zhou的工作。例如,尝试查看"Learning Deep Features for Discriminative Localization"中的图2。它是一篇本地化论文,但它使用了非常相似的技术(Bolei的一些论文使用它)。