在 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 是啥等价物?的主要内容,如果未能解决你的问题,请参考以下文章

Tensor--tensorflow的数据类型

如何在tensorflow中判断tensor(张量)的值

tensorflow::Tensor 到 python Tensor 或 numpy.nd_array

tensorflow打印tensor的值

如何设置 Tensorflow Lite C++ 的输入

如何理解TensorFlow中的tensor