正如jonrsharpe 提到的,这并不是stackoverflow 的真正MO,但在实践中,许多人确实选择编写代码来帮助解释答案(因为它通常更容易)。
所以我假设这只是沟通不畅,而你真的打算问以下两个问题之一:
- 如何在 TensorFlow 中获取 Alexnet 最后一层的值?
- 如何从深度卷积网络(如 alexnet)的最后一层提取特征?
第一个问题的答案其实很简单。我将使用 TensorFlow(松散地基于 AlexNet)中的 cifar10 示例代码作为示例。网络的前向传递内置于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 包含您为模型提供的所有输入的最后一层。
至于第二个问题,这是一个更深层次的问题,但我猜这就是你想要研究它的原因。我建议从阅读该领域发表的一些论文开始。我不是这里的专家,但我很喜欢周伯雷的作品。例如,尝试查看"Learning Deep Features for Discriminative Localization" 中的图 2。这是一篇本地化论文,但使用的技术非常相似(博雷的几篇论文都使用了它)。