我没有自己转换权重,而是使用来自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 MNIST和inception代码。
我如何创建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%。
合
这种方法有什么问题?有几部分代码我仍然不了解:
图像:图像。 4D张量大小[batch_size,FLAGS.image_size, image_size,3]。
标签:[FLAGS.batch_size]的1-D整数张量。
感谢您的帮助。很抱歉,如果链接很乱,因为我的名声只能在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%。增加但仍然缺乏很多。似乎这是问题之一。我不确定其他问题是什么。
答案 0 :(得分:0)
一般来说,跨库移植整个模型权重会很困难。你指出了与caffe的一些区别,但可能还有其他的。在TensorFlow中重新训练模型可能更容易。