深度学习已成功应用于几个大型数据集,用于分类少数类(猫,狗,汽车,飞机等),其性能优于简单的描述符,如SIFT上的特征包,颜色直方图等
然而,培训这样的网络需要每个班级有大量的数据和大量的培训时间。然而,在花费时间设计和训练这样的设备并收集训练数据之前,往往一个人没有足够的数据或只是想知道卷积神经网络可能做得多好。
在这种特殊情况下,使用最先进的出版物使用的某些基准数据集来配置和训练网络可能是理想的,并且可以简单地将其应用于您可能作为特征提取器使用的某些数据集。
这导致每个图像的一组特征,这些特征可以用于经典的分类方法,如SVM,逻辑回归,神经网络等。
特别是当一个人没有足够的数据来训练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
,并且通常所有元素都不同(特别是因为arr0
和arr1
的平均值本身介于0 - 0.5之间。< / p>
我也希望'DecodeJpeg:0'
需要一个jpeg-string,而不是一个numpy数组,为什么这个名字包含'Jpeg'。 @john:你能说清楚吗?
确定你是关于你的评论?
所以我想我不确定是什么,因为我希望训练有素的神经网络具有确定性(但最多是混乱)。
答案 0 :(得分:18)
TensorFlow团队最近发布了一个在ImageNet数据集上训练的深度CNN。您可以从here下载获取数据的脚本(包括模型图和训练的权重)。关联的Image Recognition tutorial包含有关该模型的更多详细信息。
虽然当前模型并未专门打包以用于后续培训步骤,但您可以探索修改脚本以在您自己的网络中重复使用模型的部分内容和经过训练的权重。