使用预训练 (Tensorflow) CNN 提取特征

Extract features using pre-trained (Tensorflow) CNN

深度学习已成功应用于几个大型数据集,class少数class实体(猫、狗、汽车、飞机等)的化,性能比简单的要好SIFT 特征袋、颜色直方图等描述符

然而,训练这样的网络需要每个 class 大量数据和大量训练时间。然而,在花时间设计和训练这样的设备并收集训练数据之前,人们通常没有足够的数据,或者只是想了解一下卷积神经网络的性能如何。

在这种特殊情况下,使用最先进的出版物使用的一些基准数据集配置和训练网络可能是理想的,并将其简单地应用于您可能拥有的一些数据集特征提取器。

这会为每个图像生成一组特征,这些特征可以提供给class典型的class化方法,如支持向量机、逻辑回归、神经网络等

特别是当没有足够的数据来训练 CNN 时,我预计这会优于 CNN 在少量样本上进行训练的管道。

我在看 tensorflow 教程,但它们似乎总是有明确的训练/测试阶段。我找不到带有预配置 CNN 特征提取器的 pickle 文件(或类似文件)。

我的问题是:这样的预训练网络是否存在,我在哪里可以找到它们。或者:这种方法有意义吗?我在哪里可以找到 CNN+权重?

编辑 W.r.t。 @john 的评论我尝试使用 'DecodeJpeg:0''DecodeJpeg/contents:0' 并检查了不同的输出 (:S)

import cv2, requests, numpy
import tensorflow.python.platform
import tensorflow as tf


response = requests.get('https://i.stack.imgur.com/LIW6C.jpg?s=328&g=1')
data = numpy.asarray(bytearray(response.content), dtype=np.uint8)
image = cv2.imdecode(data,-1)

compression_worked, jpeg_data = cv2.imencode('.jpeg', image)
if not compression_worked:
    raise Exception("Failure when compressing image to jpeg format in opencv library")
jpeg_data = jpeg_data.tostring()

with open('./deep_learning_models/inception-v3/classify_image_graph_def.pb', 'rb') as graph_file:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(graph_file.read())
    tf.import_graph_def(graph_def, name='')

with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('pool_3:0')

    arr0 = numpy.squeeze(sess.run(
        softmax_tensor,
        {'DecodeJpeg:0': image}
    ))

    arr1 = numpy.squeeze(sess.run(
        softmax_tensor,
        {'DecodeJpeg/contents:0': jpeg_data}
    ))

    print(numpy.abs(arr0 - arr1).max())

所以最大的绝对差是 1.27649,一般来说所有元素都不同(特别是因为 arr0arr1 本身的平均值在 0 - 0.5 之间) .

我也希望 'DecodeJpeg:0' 需要一个 jpeg 字符串,而不是一个 numpy 数组,否则为什么名称包含 'Jpeg'。 @john:你能说说怎么做吗 确定要评论吗?

所以我想我不确定什么是什么,因为我希望经过训练的神经网络是确定性的(但最多是混乱的)。

TensorFlow 团队最近发布了一个在 ImageNet 数据集上训练的深度 CNN。您可以从 here. The associated Image Recognition tutorial 下载获取数据(包括模型图和训练的权重)的脚本,其中包含有关模型的更多详细信息。

虽然当前模型未专门打包用于后续训练步骤,但您可以探索修改脚本以在您自己的网络中重用部分模型和训练的权重。