Alex-Net用于特征提取

时间:2016-06-15 13:49:26

标签: python classification tensorflow feature-extraction

我尝试为ImageNet提供可靠的功能,以便对它们进行进一步的分类。为了达到这个目的,我想使用与Alexnet的tensorflow进行特征提取。这意味着我想从CNN的最后一层获取值。有人可以编写一段Python代码来解释它是如何工作的吗?

1 个答案:

答案 0 :(得分:3)

正如jonrsharpe所提到的,那不是真正的stackoverflow的MO,但在实践中,很多人确实选择编写代码来帮助解释答案(因为它通常更容易) 。 因此,我将假设这只是错误传达,您真的打算提出以下两个问题之一:

  1. 如何在TensorFlow中获取Alexnet最后一层的值?
  2. 如何从像alexnet这样的深度卷积网络的最后一层进行特征提取工作?
  3. 第一个问题的答案实际上非常简单。我将使用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的一些论文使用它)。