InvalidArgumentError: Tensor must be 4-D with last dim 1, 3, or 4, not [shape]问题:
在我的程序里有这个的一个函数:
tf.summary.image()
(一)具体讲一下tf.summary.image()函数
tf.summary.image(
name,
tensor,
max_outputs=3,
collections=None,
family=None
)
定义于:tensorflow/python/summary/summary.py
输出Summary带有图像的协议缓冲区。
构建的图像的Tensor必须是4-D形状[batch_size, height, width, channels], 其中channels可以是:
1: tensor被解析成灰度图像。 #1通道
3:tensor被解析成RGB图像。 #3通道
4:tensor被解析成RGBA图像。 #4通道
图像具有与输入张量相同的通道数。对于浮点输入,将值一次标准化为一个在[0, 255], uint8值不变。op使用两种不同的规范化算法:
如果输入值都是正数,则重新调整它们,因此最大值为255。
如果任何输入值为负,则移动值,使输入值0.0为127.然后重新调整它们,使得最小值为0,或者最大值为255。
参数:
name:生成的节点的名称。也将作为TensorBoard中的系列名称。
tensor:uint8或者float32型的4-D Tensor[batch_size, height, width, channels],其中channels为1, 3 或者4。
max_outpus:要生成图像的最大批处理元素数。
collections:ops.GraphKeys的可选列表。要添加摘要的集合。默认为[_ops.GraphKeys.SUMMARIES]。
family:可选的; 如果提供,则用作摘要标记名称的前缀,该名称控制用于在Tensorboard上显示的选项卡名称。
返回值:
Tensor:string类型的序列化Summary协议缓冲区。
————————————————
以上原文链接:https://blog.csdn.net/heiheiya/article/details/80943534,本文做了些改动!
(2)问题解决
在问题解决之前,先了解一下tf.expand_dims()函数。
在TensorFlow中,想要维度增加一维,可以使用tf.expand_dims(input, dim, name=None)函数。当然,我们常用tf.reshape(input, shape=[])也可以达到相同效果,但是有些时候在构建图的过程中,placeholder没有被feed具体的值,这时就会包下面的错误:TypeError: Expected binary or unicode string, got 1
在这种情况下,我们就可以考虑使用expand_dims来将维度加1。比如我自己代码中遇到的情况,在对图像维度降到二维做特定操作后,要还原成四维[batch, height, width, channels],前后各增加一维。如果用reshape,则因为上述原因报错
官网示例:
# 't' is a tensor of shape [2]
shape(expand_dims(t, 0)) ==> [1, 2]
shape(expand_dims(t, 1)) ==> [2, 1]
shape(expand_dims(t, -1)) ==> [2, 1]
# 't2' is a tensor of shape [2, 3, 5]
shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5]
shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5]
shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]
我的问题代码:
tf.summary.image("image", image) #image的shape是[24,24.3],因此会产生如标题的错误。
问题解决:
image=tf.expand_dims(image,0) #在image的[24,24.3]的索引为0位置的位置上添加一个张量。
tf.summary.image("image", image)
问题完美解决!!!