tf.summary.image获取错误InvalidArgumentError

时间:2017-01-16 06:42:30

标签: machine-learning tensorflow

我用cnn模型和随机图像训练我的数据。第一个卷积层定义为:

 with tf.name_scope("conv1") as scope:
    image = tf.placeholder(tf.float32, [FLAGS.batch_size, 32, 32, 1])
    image = tf.reshape(image, [FLAGS.batch_size, 32, 32, 1])
    print(image)

    w_conv1 = weight_variable([7, 7, 1, 50])
    tf.summary.histogram('w_conv1', w_conv1)
    conv = tf.nn.conv2d(image, w_conv1, [1, 1, 1, 1], padding='SAME')
    b_conv1 = bias_variable([50])
    tf.summary.histogram('b_conv1', b_conv1)
    conv1 = tf.nn.bias_add(conv, b_conv1)
    tf.summary.image('conv1_img',conv1)# **this line get the error**
    print('conv1:')
    print(conv1)

如果我删除该行" tf.summary.image(' conv1_img',conv1)",程序可以成功运行。当我添加此行时,错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a V alue for placeholder tensor 'conv1/Placeholder' with dtype float and shape [30,32,32,1]

发生,为什么呢?

1 个答案:

答案 0 :(得分:1)

您使用tf.summary.image定义的摘要会自动添加到摘要集合中。

您肯定会运行操作summaries = tf.summary.merge_all(key='summaries')来收集添加到名为summaries的集合(默认的sumamry集合)中的所有摘要。

然后,在使用sess.run(summaries)的会话中运行此操作后,将执行先前定义的每个摘要。

直方图摘要仅取决于模型参数值,因此不需要计算任何外部数据。

相反,tf.summary.image('conv1_img',conv1)会绘制需要占位符(conv1)的image op的输出。

因此,您应该使用图像占位符执行摘要操作图:

sess.run(summaries, feed_dict{image: <your image here>})

建议:

让占位符成为一个安置者。随着声明

image = tf.placeholder(tf.float32, [FLAGS.batch_size, 32, 32, 1])
image = tf.reshape(image, [FLAGS.batch_size, 32, 32, 1])

  1. image定义为占位符
  2. 将python image变量覆盖为张量流操作。
  3. 因此,当你运行时使用feed_dict参数将图像占位符的值注入计算图中,你实际上是覆盖了张量流op(因此你必须提供已经重新整形的值)使它工作)。

    因此,最好让占位符成为占位符:

    image_placeholder = tf.placeholder(tf.float32, [FLAGS.batch_size, 32, 32, 1])
    image = tf.reshape(image_placeholder, [FLAGS.batch_size, 32, 32, 1])
    

    然后用它来正确输入图表:

    sess.run(<your ops>, feed_dict:{image_placeholder: <your image>})