我想在张量流示例中从给定的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图表不接受图像批处理作为输入。我错了吗?
答案 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
。