1)为什么tensorflow要Variable来定义变量,而不用直接采用python语言的方式定义变量?
变量有作用域,普通python变量分局部变量和全局变量,函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量。
tf.Variable定义的变量,可以看作图(Graph)作用域变量,相当有计算图中的一个节点(操作),可以这个变量和某个计算图绑定,这样可以通过计算图来共享这个变量,当我们为计算图某层权值参数定义为Variable时,不同的函数都可以访问该参数值,特别是优化函数,可以在训练时更新权值。
2)创建变量方法
w = tf.Variable(<initial-value>, name=<optional-name>)
创建变量的最佳方式是调用 tf.get_variable
函数。此函数要求您指定变量的名称。其他副本将使用此名称访问同一变量,以及在对模型设置检查点和导出模型时指定此变量的值。tf.get_variable
还允许您重复使用先前创建的同名变量,从而轻松定义重复利用层的模型。
my_variable = tf.get_variable("my_variable", [1, 2, 3])
先去集合中找有没有"my_variable"这个变量,如果有直接返回这个变量,如果没有,新建一个变量,并将其加入变量集中。
3)变量集合
新建Variable变量会默认放在这两个集合中
tf.GraphKeys.GLOBAL_VARIABLES
- 可以在多台设备间共享的变量,tf.GraphKeys.TRAINABLE_VARIABLES
- TensorFlow 将计算其梯度的变量。
如果不希望变量可训练,可以将其添加到 tf.GraphKeys.LOCAL_VARIABLES
集合中。
也可以使用自己的集合。集合名称可为任何字符串,且您无需显式创建集合。
4)初始化变量
要在训练开始前一次性初始化所有可训练变量,用 tf.global_variables_initializer()
。此函数会返回一个操作,负责初始化 tf.GraphKeys.GLOBAL_VARIABLES
集合中的所有变量。
5)使用变量
要为变量赋值,使用 assign
、assign_add
方法以及 tf.Variable
类中的友元
TensorFlow 支持两种共享变量的方式:
- 显式传递
tf.Variable
对象。 - 将
tf.Variable
对象隐式封装在tf.variable_scope
对象内。