TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable—Jason niu

Posted 一个处女座的IT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable—Jason niu相关的知识,希望对你有一定的参考价值。

# tensorflow中的两种定义scope(命名变量)的方式tf.get_variable和tf.Variable。Tensorflow当中有两种途径生成变量 variable

import tensorflow as tf


#T1法  tf.name_scope()

with tf.name_scope("a_name_scope"):
    initializer = tf.constant_initializer(value=1)  #定义常量
    var1 = tf.get_variable(name=‘var1‘, shape=[1], dtype=tf.float32, initializer=initializer)  #创建变量
    var2 = tf.Variable(name=‘var2‘, initial_value=[2], dtype=tf.float32)
    var21 = tf.Variable(name=‘var2‘, initial_value=[2.1], dtype=tf.float32)
    var22 = tf.Variable(name=‘var2‘, initial_value=[2.2], dtype=tf.float32)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    #以下打印出每一种Variable的名字及其值
    print(var1.name)        # var1:0
    print(sess.run(var1))   # [ 1.]
    print(var2.name)        # a_name_scope/var2:0
    print(sess.run(var2))   # [ 2.]
    print(var21.name)       # a_name_scope/var2_1:0
    print(sess.run(var21))  # [ 2.0999999]
    print(var22.name)       # a_name_scope/var2_2:0
    print(sess.run(var22))  # [ 2.20000005]
#使用 tf.Variable()定义的时候, 虽然 name都一样, 但是为了不重复变量名, Tensorflow输出的变量名并不是一样的. 
#所以, 本质上 var2, var21, var22 并不是一样的变量.
#而另一方面, 使用tf.get_variable()定义的变量不会被tf.name_scope()当中的名字所影响.


print(‘以下输出的是T2第二种方法‘) 
#T2法  tf.variable_scope()
#如果想要达到重复利用变量的效果, 我们就要使用 tf.variable_scope(), 并搭配 tf.get_variable() 这种方式产生和提取变量. 
#不像 tf.Variable() 每次都会产生新的变量, tf.get_variable() 如果遇到了同样名字的变量时, 
#它会单纯的提取这个同样名字的变量(避免产生新变量). 而在重复使用的时候, 一定要在代码中强调 scope.reuse_variables(), 
#否则系统将会报错, 以为你只是单纯的不小心重复使用到了一个变量.
with tf.variable_scope("a_variable_scope") as scope:
    initializer = tf.constant_initializer(value=3)
    var3 = tf.get_variable(name=‘var3‘, shape=[1], dtype=tf.float32, initializer=initializer)
    scope.reuse_variables()
    var3_reuse = tf.get_variable(name=‘var3‘,)
    var4 = tf.Variable(name=‘var4‘, initial_value=[4], dtype=tf.float32)
    var4_reuse = tf.Variable(name=‘var4‘, initial_value=[4], dtype=tf.float32)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(var3.name)            # a_variable_scope/var3:0
    print(sess.run(var3))       # [ 3.]
    print(var3_reuse.name)      # a_variable_scope/var3:0
    print(sess.run(var3_reuse)) # [ 3.]
    print(var4.name)            # a_variable_scope/var4:0
    print(sess.run(var4))       # [ 4.]
    print(var4_reuse.name)      # a_variable_scope/var4_1:0
    print(sess.run(var4_reuse)) # [ 4.]

  

以上是关于TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable—Jason niu的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow 与 Keras 中的 RNN,tf.nn.dynamic_rnn() 的贬值

tf.nn.dynamic_rnn 中的排名错误

TF之RNN:matplotlib动态演示之基于顺序的RNN回归案例实现高效学习逐步逼近余弦曲线—Jason niu

张量流中的“tf.contrib.rnn.DropoutWrapper”到底是做啥的? (三题)

tf2.0 Keras:使用 RNN 的自定义张量流代码时无法保存权重

tf.contrib.rnn.static_rnn与tf.nn.dynamic_rnn区别