在 Tensorflow 的 C++ TensorShape API 中,Python 的 None 是啥等价物?
Posted
技术标签:
【中文标题】在 Tensorflow 的 C++ TensorShape API 中,Python 的 None 是啥等价物?【英文标题】:In Tensorflow's C++ TensorShape API, what is the equivalent of Python's None?在 Tensorflow 的 C++ TensorShape API 中,Python 的 None 是什么等价物? 【发布时间】:2015-12-20 03:52:46 【问题描述】:假设我有一个用Tensorflow的Python API创建的张量,如下,
x = tf.placeholder("float", shape=[None, inputLen])
我想在 C++ 中创建一个等效的 tensorflow::Tensor,这样我就可以运行一个以 x 作为输入的训练图。我应该如何处理输入形状的第一个维度,它在 C++ 中是 tensorflow::TensorShape 类型?
如果我这样做:
tensorflow::TensorShape inputShape;
inputShape.AddDim(0);
inputShape.AddDim(inputLen);
它似乎不起作用,因为 num_elements 变为 0,这不是我期望的 inputLen 的值。
【问题讨论】:
【参考方案1】:更新:现在有一个tensorflow::PartialTensorShape
类可以表示具有未知尺寸或未知等级的形状。值-1
用于表示未知值(即None
在Python 中表示的内容)。它用于 C++ 形状推断代码中,可以在形状类型的 attr 或 tf.TensorShape
proto 中指定。
TL;DR: C++ 中没有等价物,因为 TensorFlow 的 C++ 部分只在运行时检查完全定义的形状;而 Python 部分在图形构建时检查形状,此时它们可能没有完全定义。
在 C++ tensorflow::TensorShape
类中没有 tf.Dimension(None)
的等价物(即未知维度)。这是因为 (C++) tensorflow::TensorShape
类描述了 (C++) tensorflow::Tensor
的形状,它表示张量的 具体 值,因此必须具有完全定义的形状。 Python tf.Tensor
类表示一个符号张量——表示尚未运行的操作的输出——因此它可以具有一维或多维未知的形状。
如果您使用C++ API 来提供占位符,您应该简单地创建一个新的tensorflow::Tensor
,为您提供给占位符的每个不同值(在Session::Run()
调用中)具有完全定义的形状。但请注意,C++ API 不会检查占位符的形状,因此您应该手动确保形状与占位符的预期形状匹配。
如果您正在使用 C++ API 构建图形,并且您想定义一个在一维或多维中具有未知大小的占位符,您应该定义一个占位符节点及其 shape
attr设置为tensorflow::TensorShape()
。虽然这相当于一个标量,但由于历史原因,这被视为完全不受约束的形状。
【讨论】:
运行类似 tensorflow::Tensor X(tensorflow::DT_FLOAT, tensorflow::PartialTensorShape(-1, 32)) 的东西不起作用。如何将 PartialTensorShape 与张量结合使用? @Francesco 你知道你是如何使用 PartialTensorShape 的吗?tensorflow::Tensor
构造函数需要一个TensorShape
对象,因为它负责为张量分配内存,因此必须完全定义所有维度。以上是关于在 Tensorflow 的 C++ TensorShape API 中,Python 的 None 是啥等价物?的主要内容,如果未能解决你的问题,请参考以下文章