TensorFlow——變數OP
阿新 • • 發佈:2018-12-10
一、變數
TensorFlow變數是表示程式處理的共享持久狀態的最佳方法。變數通過 tf.Variable OP類以及tf.get_variable()類進行操作。變數的特點
- 儲存持久化
- 可修改值
- 可指定被訓練
1. 建立變數
- tf.Variable(initial_value=None,trainable=True,collections=None,name=None)
- initial_value:初始化的值
- trainable:是否被訓練
- collections:新變數將新增到列出的圖的集合中collections,預設為[GraphKeys.GLOBAL_VARIABLES],如果trainable是True變數也被新增到圖形集合 GraphKeys.TRAINABLE_VARIABLES
var = tf.Variable(tf.random_normal([2, 2], mean=0.0, stddev=1.0), name="var", trainable=True)
with tf.Session() as sess:
sess.run(var)
- 變數需要顯式初始化,才能執行值
# 新增一個初始化變數的OP
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
# 執行初始化變數的OP
sess.run(init_op)
2.變數OP的方法
- new_var = assign(value)
- 給變數賦值一個新的值
- new_var = assign_add(delta)
var = tf.Variable(tf.random_normal([2, 2], mean=0.0, stddev=1.0), name="var", trainable=True) var1 = var.assign([[2, 3], [4, 5]]) init_op = tf.global_variables_initializer() va = var.assign_add([[1, 3], [4, 5]]) with tf.Session() as sess: # 執行初始化op sess.run(init_op) print(sess.run(va)) print(sess.run(var))
關於變數的被訓練,我們在後面的線性迴歸案例當中介紹
二、名稱空間與共享變數
共享變數的主要用途在一些網路當中的引數共享, 由於在TensorFlow當中,如果定義的OP的name引數指定一樣,其實並不是同一個變數。如果想要達到重複利用變數的效果,我們就要使用tf.variable_scope()
結合tf.get_variable()
一起使用
1.定義一個相同名字的變數
var = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
var_double = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
<tf.Variable 'var:0' shape=() dtype=float32_ref>
<tf.Variable 'var_1:0' shape=() dtype=float32_ref>
2. 使用tf.variable_scope()修改OP名稱空間
會在OP的名字前面增加名稱空間的指定名字
with tf.variable_scope("name"):
var = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
var_double = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
<tf.Variable 'name/var:0' shape=() dtype=float32_ref>
<tf.Variable 'name/var_1:0' shape=() dtype=float32_ref>
3. tf.get_variable共享變數
通過tf.get_variable的初始化與Variable引數一樣,但是要是實現共享需要開啟tf.variable_scope("name")中的reuse=tf.AUTO_REUSE引數
# 開啟共享引數
# 或者
# with tf.variable_scope("name") as scope:
# 在需要使用共享變數的前面定義: scope.reuse_variables()
with tf.variable_scope("name", reuse=tf.AUTO_REUSE):
var = tf.Variable(initial_value=4.0, name="var", dtype=tf.float32)
var_double = tf.Variable(initial_value=4.0, name="var", dtype=tf.float32)
var1 = tf.get_variable(initializer=tf.random_normal([2, 2], mean=0.0, stddev=1.0),
name="var1",
dtype=tf.float32)
var1_double = tf.get_variable(initializer=tf.random_normal([2, 2], mean=0.0, stddev=1.0),
name="var1",
dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1)
print(var1_double)