Tensorflow VGG16(由caffe转换而来)评估准确度较低

时间:2017-01-25 08:10:13

标签: tensorflow deep-learning

我没有自己转换权重,而是使用来自www(点)cs(点)多伦多(点)edu / ~frossard / post / vgg16 /的vgg16_weights.npz。在那里,提到了

  

我们使用专业工具(github(dot)com / ethereon / caffe)转换作者的GitHub配置文件(gist(dot)github(dot)com / ksimonyan / 211839e770f7b538e2d8#file-readme-md)中公开提供的Caffe权重-tensorflow)。

但是,在该页面中,没有验证码,因此我将其引用为tensorflow MNISTinception代码。

我如何创建Imagenet的TFRecords

我从一开始就使用build_imagenet_data.py。我改变了

  

label_index = 0 #originally label_index = 1

因为启动时使用label_index 0作为后台类(所以总共有1001个类)。 Caffe格式没有使用它,因为输出的数量是1000.我更喜欢使用TFRecord格式,因为我将改变处理权重和重新训练。

我如何加载权重

从MNIST的mnist.py中获取的推理函数被修改,因此变量取自vgg16_weights.npz

我如何加载权重:

weights = np.load('/the_path/vgg16_weights.npz')

我如何将变量放在conv1_1中:

with tf.name_scope('conv1_1') as scope:
    kernel = tf.Variable(tf.constant(weights['conv1_1_W']), name='weights')
    conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')
    biases = tf.Variable(tf.constant(weights['conv1_1_b']), name='biases')

    out = tf.nn.bias_add(conv, biases)
    conv1_1 = tf.nn.relu(out, name=scope)
    sess.run(conv1_1)

我如何阅读TFRecords

我开始使用了image_processing.py,dataset.py和ImagenetData.py而没有任何变化。然后,我运行inception' s inception_eval.py evaluate函数,改变推理代码并从检查点删除恢复移动变量(因为我已经在变量初始化中手动恢复)。但是,Vffe中的VGG-16的准确度并不相同。前5精度约为9%。

这种方法有什么问题?有几部分代码我仍然不了解:

  1. 处理1批图像后,TFReader如何移动到下一批图像?初始的image_processing.py大小的输出只是批量大小的数量。要完成,这是基于文档的输出:
  2.   

    图像:图像。 4D张量大小[batch_size,FLAGS.image_size,                                          image_size,3]。

         

    标签:[FLAGS.batch_size]的1-D整数张量。

    1. 在tf.in_top_k之前我需要softmax logits吗? (好吧,我不认为这是重要的,因为价值序列是相同的)
    2. 感谢您的帮助。很抱歉,如果链接很乱,因为我的名声只能在1个帖子中发布2个链接。

      更新

      我通过改变咖啡重量来尝试自己。反转conv1_1的通道输入维度(因为caffe接收BGR,因此权重是BGR而不是tensorflow中的RGB),并且与网站的权重相同:前5位大约9%。

      我发现在tensorflow初始的image_processing.py中没有平均图像减法。我使用tf.reduce_mean添加均值减法(在eval_image函数中)并且准确率为11%。

      然后我尝试用

      更改eval_image函数
      # source: https://github.com/ethereon/caffe-tensorflow/blob/master/examples/imagenet/dataset.py
      img_shape = tf.to_float(tf.shape(image)[:2])
      min_length = tf.minimum(img_shape[0], img_shape[1])
      new_shape = tf.to_int32((256 / min_length) * img_shape) #isotropic case
      
      # new_shape = tf.pack([256,256]) #non isotropic case
      
      image = tf.image.resize_images(image, [new_shape[0], new_shape[1]])
      
      offset = tf.to_int32((new_shape - 224) / 2)
      image = tf.slice(image, begin=tf.pack([offset[0], offset[1], 0]), size=tf.pack([224, 224, -1]))
      
      # mean_subs_image = tf.reduce_mean(image,axis=[0,1],keep_dims=True)
      
      return image - mean_subs_image
      

      我得到了13%。增加但仍然缺乏很多。似乎这是问题之一。我不确定其他问题是什么。

1 个答案:

答案 0 :(得分:0)

一般来说,跨库移植整个模型权重会很困难。你指出了与caffe的一些区别,但可能还有其他的。在TensorFlow中重新训练模型可能更容易。