TensorFlow 和 Keras 中的符号张量是啥?

Posted

技术标签:

【中文标题】TensorFlow 和 Keras 中的符号张量是啥?【英文标题】:What are symbolic tensors in TensorFlow and Keras?TensorFlow 和 Keras 中的符号张量是什么? 【发布时间】:2020-04-29 14:27:19 【问题描述】:

TensorFlow 和 Keras 中的符号张量是什么?它们与其他张量有何不同?为什么它们甚至存在?它们在 TensorFlow 和 Keras 中出现在哪里?我们应该如何处理它们,或者在处理它们时会遇到什么问题?

过去,我遇到过与符号张量相关的某些问题,例如_SymbolicException,但文档没有描述这个概念。还有another post也问了这个问题,但是,在这篇文章中,我专注于这个特定的问题,以便以后可以将答案用作参考。

【问题讨论】:

【参考方案1】:

根据blog.tensorflow.org,符号张量与其他张量的不同之处在于它们不专门保存值。

让我们考虑一个简单的例子。

>>> a = tf.Variable(5, name="a")
>>> b = tf.Variable(7, name="b")
>>> c = (b**2 - a**3)**5
>>> print(c)

输出如下:

tf.Tensor(1759441920, shape=(), dtype=int32)

对于上述,值是专门以tf.Variable格式定义的,输出为Tensor格式。但是,张量必须包含一个值才能被视为这样。

符号张量的不同之处在于,定义张量不需要显式值,这对使用 TensorFlow 2.0 构建神经网络有影响,TensorFlow 2.0 现在使用 Keras 作为默认 API。

这是一个序列神经网络示例,用于构建预测酒店取消事件的分类模型(完整的 Jupyter Notebook here,如果有兴趣):

from tensorflow.keras import models
from tensorflow.keras import layers

model = models.Sequential()
model.add(layers.Dense(8, activation='relu', input_shape=(4,)))
model.add(layers.Dense(1, activation='sigmoid'))

这是一个符号定义的模型,因为网络中没有明确定义任何值。而是为输入变量创建一个框架,供网络读取,然后生成预测。

在这方面,Keras 变得非常流行,因为它允许使用符号张量构建图形,同时保持命令式布局。

【讨论】:

你说“这是一个符号定义的模型”。这与符号张量有什么关系?是的,这似乎很明显,但我想要一个准确的答案。 当然可以。从某种意义上说,它是相关的,符号张量不需要预定义的值,因此可以采用大量值。因此,符号定义模型是根据定义,张量是符号的模型。如果张量不是象征性的,那么如果不首先明确定义输入变量的值,就不可能运行神经网络。 我还有两个(或三个)问题。 1. 有没有办法以编程方式理解张量是否是符号的(类似于 Python 中的type(my_var) 用于获取变量的类型)? 2. 我已经阅读了您链接到的博客文章,其中提到在使用顺序和功能 API 构建模型时会出现符号张量。还有其他可以出现符号张量的情况吗? 3. TF 的占位符呢?占位符与符号张量有何不同,或者为什么符号张量不称为占位符? 1.根据 tensorflow.org 网站,“张量是操作输出之一的符号句柄。它不保存该操作输出的值,而是提供一种在 TensorFlow tf.compat 中计算这些值的方法.v1.Session。”这不仅仅是象征性与非象征性的情况——张量的目的首先是提供一个评估操作的框架。 2. 是的,但所描述的情况将是最常见的情况之一。 3.占位符与急切执行不兼容,因此两者不可互换。

以上是关于TensorFlow 和 Keras 中的符号张量是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Tensorflow 张量设置 Keras 层的输入?

从keras中的扩展张量制作输入特征图

如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?

ValueError:模型的输出张量必须是TensorFlow`Layer`的输出

为 Keras 中的某些张量元素分配新值

将张量的各个通道传递给 Keras 中的层