1.Tensorflow运行主流程
构建计算图(tf.Graph)->运行计算图
2.计算图构成
重要提示:tf.Tensors
不具有值,它们只是计算图中元素的手柄。
3.张量
tensorflow操作和传递的主要对象是 tf.Tensor
。tf.Tensor
对象表示一个部分定义的计算,最终会生成一个值。TensorFlow 程序首先会构建一个 tf.Tensor
对象图,详细说明如何基于其他可用张量计算每个张量,然后运行该图的某些部分以获得期望的结果。
张量属性
- 数据类型(如float32、int32和string)
- 形状
张量中的每个元素都具有相同的数据类型,且该数据类型一定是已知的。形状,即张量的维数和每个维度的大小,可能只有部分已知。如果其输入的形状也完全已知,则大多数操作会生成形状完全已知的张量,但在某些情况下,只能在执行图时获得张量的形状。
张量切片类似于numpy.在评估 张量result
时,会评估所有影响 张量result
的元素。
4.特殊张量
4.1变量tf.variable,创建、初始化和应用
tf.Variable
表示可通过对其运行操作来改变其值的张量.与tf.Tensor对象不同,tf.Variable存在于单个session.run调用的上下文之外。在Tensorflow内部,tf.Variable会存储持久性张量。具体op允许你读取和修改此张量的值。这些修改在多个tf.Session之间是可见的,因此对于一个tf.Variable,多个工作器可以看到相同的值。
创建变量tf.get_variable,只需提供名称和形状即可.默认情况下,此变量将具有 dtype
tf.float32
,其初始值将通过 tf.glorot_uniform_initializer
随机设置。
my_variable = tf.get_variable("my_variable", [1, 2, 3])
变量必须先初始化后才可使用。如果在低级别Tensorflow API中进行变成,则必须明确初始化变量。tf.contrib.slim
、tf.estimator.Estimator
和 Keras
等大多数高级框架在训练模型前会自动为您初始化变量。
要在训练开始前一次性初始化所有可训练变量,请调用 tf.global_variables_initializer()
。
4.2变量集合
Tensorflow提供了集合,他们是张量或其他对象的命名列表。
默认情况下,每个 tf.Variable
都放置在以下两个集合中:
tf.GraphKeys.GLOBAL_VARIABLES
- 可以在多台设备间共享的变量,tf.GraphKeys.TRAINABLE_VARIABLES
- TensorFlow 将计算其梯度的变量。
如果您不希望变量可训练,可以将其添加到 tf.GraphKeys.LOCAL_VARIABLES
集合中。例如,以下代码段展示了如何将名为 my_local
的变量添加到此集合中:
my_local = tf.get_variable("my_local", shape=(),
collections=[tf.GraphKeys.LOCAL_VARIABLES])
local变量在的集合, 用tf.local_variables_initializer()初始化
collections=[tf.GraphKeys.LOCAL_VARIABLES]
一般建立的变量(就是tf.Variable())在的集合,用tf.global_variables_initializer()初始化
collections=[tf.GraphKeys.VARIABLES]
match_filenames_once函数最后一行可以看到使用了local Variable,所以session里面要对local变量初始化,对全局变量初始化没用。
def match_filenames_once(pattern, name=None):
"""Save the list of files matching pattern, so it is only computed once.
Args:
pattern: A file pattern (glob), or 1D tensor of file patterns.
name: A name for the operations (optional).
Returns:
A variable that is initialized to the list of files matching the pattern(s).
"""
with ops.name_scope(name, "matching_filenames", [pattern]) as name:
return vs.variable(
name=name, initial_value=io_ops.matching_files(pattern),
trainable=False, validate_shape=False,
collections=[ops.GraphKeys.LOCAL_VARIABLES])
4.3共享变量
Tensorflow支持两种共享变量的方式:
- 显示传递tf.Variable对象
- 将tf.Variable对象隐式封装在tf.variable_scope对象内
变量作用域允许您在调用隐式创建和使用变量的函数时控制变量重用。作用域还允许您以分层和可理解的方式命名变量。