Fork me on GitHub

variable_scope的用法

variable_scope的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#author:victor
#import module
import tensorflow as tf
tf.reset_default_graph()

tf.set_random_seed(1)#reproducible

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)
var4=tf.Variable(name='var4',initial_value=[4],dtype=tf.float32)
var4_reuse=tf.Variable(name='var4',initial_value=[4],dtype=tf.float32)
#想要重复利用必须这么写:
scope.reuse_variables()#如果不加这一句会报错,报Variable a_variable_scope/var3 already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope
var3_reuse=tf.get_variable(name='var3')
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(var3.name)#a_variable_scope/var3:0,variable_scope加上
print(sess.run(var4))

print(var4.name)#a_variable_scope/var4:0,variable_scope加上
print(sess.run(var4))

print(var4_reuse.name)#a_variable_scope/var4_1:0,variable_scope加上,重复利用的时候,并不是打印出var4:0,而是创建了一个新的var4_1
print(sess.run(var4_reuse))

print(var3_reuse.name)#a_variable_scope/var3:0,可以看到和var3一样了,为什么要重复利用呢?
#因为同一个variable可能需要在不同的地方使用,
#通常在RNN循环神经网络中,有一个重复循环的机制。通常在RNN中用到reuse_variable,通常Train RNN和Test RNN的神经网络结构不一样,但是其中的参数可能一样的,所以就会用到reuse variable...
print(sess.run(var3_reuse))



"""
比如RNN结构
"""
class TrainConfig:
batch_size=20
time_steps=20
input_size=10
output_size=2
cell_size=11
learning_rate=0.01
#但是RNN的test,有可能的time_steps改成1,但是不会用Train里的time_steps
#所以就会用到reuse variable的time_steps
class TestConfig(TrainConfig):
time_steps=1

使用variable_scope的效果:

variable_scope