Tensorflow 为什么像张量的形状是(?,?)
这是我的密码Tensorflow 为什么像张量的形状是(?,?),tensorflow,Tensorflow,这是我的密码 img_path = tf.read_file(testqueue[0]) my_img = tf.image.decode_jpeg(img_path) sess.run(my_img) print my_img.get_shape() 结果呢, (?, ?, ?) 为什么我会得到这个结果?来回答这个问题并提供一些细节 静态信息 tensor\u name.shape返回图形编译时可用的形状信息。它依赖于张量性质 是注册的。在创建图形期间,TensorFlow在推断上下文下运
img_path = tf.read_file(testqueue[0])
my_img = tf.image.decode_jpeg(img_path)
sess.run(my_img)
print my_img.get_shape()
结果呢,
(?, ?, ?)
为什么我会得到这个结果?来回答这个问题并提供一些细节 静态信息
tensor\u name.shape
返回图形编译时可用的形状信息。它依赖于张量性质
是注册的。在创建图形期间,TensorFlow在推断上下文下运行形状传播。给定从输入张量已知的形状属性,每个操作都会提示其输出张量的外观
例如,“rgb2gray”操作只需复制输入张量的形状(例如[b',h',w',c'],并将输出设置为[b',h',w',1]。它不需要知道b',h',w'的确切值,因为它只需复制这些先前的值
从具体情况看,此操作显然可以处理频道
属性:
//读取属性“channels from”tf.image.decode\u jpeg(…,channels)”
TF_返回_IF_错误(c->GetAttr(“通道”和通道));
// ....
//设置张量信息“my_img.get_shape()”将具有
c->set_输出(0,c->MakeShape({推理上下文::Kunnowndim,
推论上下文::kunnowndim,channels_dim});
前两个维度设置为推断上下文::kunnowndim
,因为操作只知道有一个高度和宽度,但具体的值可以变化。它可以最好地猜测通道轴的外观。如果指定属性tf.decode\u jpeg(…,channels=3)
,它可以并将设置最后一个维度
当if分支channels==0
处于活动状态时,这将导致形成一个形状(?,?)
运行时信息
另一方面,定义结束。这检查实际的张量内容:
//从值本身获取实际的张量形状
张量形;
OP_需要_OK(ctx,shape_OP_helpers::GetRegularOrVariantShape(ctx,0,&shape));
const int rank=shape.dims();
//写出“tf.shape(…)”的张量结果
对于(int i=0;i
这就像tf.shape
对其先前的操作所说的:
你可以告诉我你几分钟前得出的任何结论。我不在乎你在这一点上有多聪明,也不在乎你对形状的猜测付出了多少努力。看,我只是看看混凝土张量,它现在有了内容,我完成了
后果
这有一些重要的后果:
tf.shape
是张量,而tensorname.shape
不是
- 有些属性需要整数。因此无法使用张量
tf.shape
- 图形优化(如XLA)只能依赖于
tensorname.shape
- 如果您知道图像的形状(数据库中只有128x128x3个图像),则应设置形状,例如,使用
tf.reformate(img,[128,128,3]
您可能还对实现了哪一个感兴趣。尝试sess.run(my\u img).shape
或等效值。我相信我的img
只是一个符号,直到您使用sess.run运行它。输出应该有一个形状。谢谢!没错。如何创建张量来表示sess之前我的img的形状。run?使用tf.shape()
为什么要在sess之前使用该形状?运行
?通常,您只需将其作为一个符号,以便算法的其余部分可以自动调整自身以适应未来图像的新形状。是的,tf.shape()很好。谢谢你们!我想要这个形状是因为我想在运行会话之前构建图形,并且会有一些基于形状值的操作。