深度学习已成功应用于几个大型数据集,用于分类少数类(猫,狗,汽车,飞机等),其性能优于简单的描述符,例如SIFT上的特征包,颜色直方图等.
然而,培训这样的网络需要每个班级有大量的数据和大量的培训时间.然而,在花费时间设计和训练这样的设备并收集训练数据之前,通常一个人没有足够的数据或只是想知道卷积神经网络可能做得多好.
在这种特殊情况下,使用现有技术出版物使用的某些基准数据集来配置和训练网络可能是理想的,并且只需将其应用于您可能作为特征提取器的某些数据集.
这导致每个图像的一组特征,其可以馈送到经典分类方法,如SVM,逻辑回归,神经网络等.
特别是当一个人没有足够的数据来训练CNN时,我可以预期这会超过CNN在少数样本上训练的管道.
我正在查看tensorflow教程,但他们似乎总是有一个明确的培训/测试阶段.我找不到带有预先配置的CNN特征提取器的pickle文件(或类似文件).
我的问题是:这些预先训练好的网络是否存在,我在哪里可以找到它们.另外:这种方法有意义吗?我在哪里可以找到CNN +权重?
编辑
WRT @约翰的评论我试着用'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).
我也希望'DecodeJpeg:0'
需要一个jpeg-string,而不是一个numpy数组,为什么这个名字包含'Jpeg'.@john:你能说出你对自己的评论有多确定吗?
所以我想我不确定是什么,因为我希望训练有素的神经网络是确定性的(但最多是混乱的).
TensorFlow团队最近发布了一个在ImageNet数据集上训练的深度CNN.您可以从此处下载获取数据的脚本(包括模型图和训练的权重).相关的图像识别教程有关于该模型的更多详细信息.
虽然当前模型没有专门打包以用于后续培训步骤,但您可以探索修改脚本以在您自己的网络中重用模型的部分和训练的权重.