InceptionV3和使用张量流转移学习

时间:2016-02-08 16:27:43

标签: tensorflow

我想在张量流示例中从给定的inceptionV3进行转移学习。在分类图像示例以及此处给出的运算符和张量名称https://github.com/AKSHAYUBHAT/VisualSearchServer/blob/master/notebooks/notebook_network.ipynb之后,我可以创建我的图表。但是,当我在预先计算的初始图中放入一批大小为(100,299,299,3)的图像时,我在pool_3层得到以下形状错误:

ValueError: Cannot reshape a tensor with 204800 elements to shape [1, 2048] (2048 elements)

似乎这个inceptionV3图表不接受图像批处理作为输入。我错了吗?

4 个答案:

答案 0 :(得分:4)

实际上,如果你提取正确的东西,它适用于转移学习。将一批图像以[N, 299, 299, 3]形状作为ResizeBilinear:0然后使用pool_3:0张量进行处理是没有问题的。这是后来的重塑,但是你可以重塑自己(无论如何你将拥有自己的层)。如果您想将原始分类器与批处理一起使用,您可以在pool_3:0之上添加自己的整形,然后添加softmax图层,重用原始softmax的权重/偏差张量。

TLDR:当double_img是两个形状(2,299,299,3)的图像的堆栈时,这可以工作:

pooled_2 = sess.graph.get_tensor_by_name("pool_3:0").eval(session=sess, feed_dict={'ResizeBilinear:0':double_img})
pooled_2.shape
# => (2, 1, 1, 2048)

答案 1 :(得分:2)

你没错。这似乎是一个非常合理的功能请求,所以我打开了a ticket for it on github。关注更新。

答案 2 :(得分:0)

这样的事情应该这样做:

    with g.as_default():
     inputs = tf.placeholder(tf.float32, shape=[batch_size, 299, 299, 3],
                                name='input')

        with slim.arg_scope(inception.inception_v3_arg_scope()):

            logits, end_points = inception.inception_v3( inputs, 
            num_classes=FLAGS.num_classes, is_training=False)
            variables_to_restore = lim.get_variables_to_restore(exclude=exclude)
        sess = tf.Session()

        saver = tf_saver.Saver(variables_to_restore)

然后你应该可以调用该操作:

        sess.run("pool_3:0",feed_dict={'ResizeBilinear:0':images})

答案 3 :(得分:0)

提出了一个很好的观点。但是,我们不必自己重塑它。相反,我们可以更改shape作为输入的reshape的值。即

input_tensor_name = 'import/input:0'
shape_tensor_name = 'import/InceptionV3/Predictions/Shape:0'
output_tensor_name= 'import/InceptionV3/Predictions/Reshape_1:0'

output_tensor = tf.import_graph_def(
    graph.as_graph_def(),
    input_map={input_tensor_name: image_batch,
               shape_tensor_name: [batch_size, num_class]},
    return_elements=[output_tensor_name])

这些张量名称基于inception_v3_2016_08_28_frozen.pb