我用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]
发生,为什么呢?
答案 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])
你
image
定义为占位符image
变量覆盖为张量流操作。因此,当你运行时使用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>})