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 / Tensorflow 中将(无,)批量维度重新引入张量?