【TensorFlow】变量管理tf.get_variables/tf.Variable/tf.variable_scope的应用(七)
声明:参考自TensorFlow实战
TensorFlow中通过变量名称获取变量的机制主要是通过tf.get_variables/tf.Variable/tf.variable_scope函数实现的,且通过tf.get_variables()和tf.Variable()来创建变量是等价的。
变量作用域机制在TensorFlow中主要由两部分组成:
tf.get_variable(name, shape, initializer): 通过所给的名字创建或是返回一个变量.
tf.variable_scope(scope_name): 通过 tf.get_variable()为变量名指定命名空间.
tf.get_variable()和tf.Variable()最大的区别在于指定变量名称的参数。tf.Variable()的变量名称是一个可选参数,通过name=” 给出,但是tf.get_variable()的变量名称是一个必填参数。如果tf.get_variable()获取一个已经创建的变量,需要通过tf.variable_scope()函数生成一个上下文管理器,并明确指定tf.get_variable()将直接获取已经生成的变量。
tf.get_variable函数调用时提供的维度(shape)信息以及初始化方法(initializer )的参数和tf.Variable函数调用时提供的初始化过程中的参数也类似。
TensorFlow提供的initializer 初始化函数和随机数和常量生成函数是一一对应的:
tf.constant_initializer:将变量初始化为给定的常量
tf.random_normal_initializer:将变量初始化为满足正态分布的随机值
tf.truncated_normal_initializer:将变量初始化为满足正态分布的随机值,托福备考但是如果随机值出来的偏离程度超过两个标准差,则重新随机。
tf.random_uniform_initializer:将变量初始化为满足平均分布的随机值
tf.zeros_initializer:将变量全设置为0
tf.ones_initializer:将变量全设置为1
通过tf.variable_scope函数可以控制tf.get_variable函数的语义。当reuse=True时,这个上下文管理器内所有的tf.get_variable都会直接获取已经创建的变量。如果变量不存在,则会报错。相反,如果reuse=None或者reuse=False,tf.get_variable将创建新的变量,,若同名的变量已经存在则报错。
tf.variable_scope嵌套样例:
tf.variable_scope函数生成的上下文管理器也会创建一个TensorFlow中的命名空间,在这个命名空间内创建的变量名称都会带上这个空间名作为前缀,因此tf.variable_scope函数可以管理变量命名空间。
通过tf.variable_scope和tf.get_variable函数,对前向传播算法做修改。
原算法:
改进算法:
使用上述代码就不需要将所有的变量作为参数传递到不同的函数中。当神经网络更加复杂、雅思考试内容参数更多时,使用这样的方式会大大提高程序的可读性。
以上均是单独实现,主要是由于没有更改空间名,直接一起运行会报错,下面提供完整版的范例:
最后注意点:以上均在spider脚本运行,所以如果重复运行,会报错:
处理的方式就是每运行完脚本后,restart kernel重启运算核。至于缘由,目前还不太清楚,应该是脚本运行完后,变量会储存在这个脚本里面,再次运行就会出现错误。

浙公网安备 33010602011771号