1. 程式人生 > >TensorFlow——變數OP

TensorFlow——變數OP

一、變數

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)