(第一章第五部分)TensorFlow框架之變量OP

 

系列博客連接:html

(一)TensorFlow框架介紹:https://www.cnblogs.com/kongweisi/p/11038395.htmlpython

(二)TensorFlow框架之圖與TensorBoard:https://www.cnblogs.com/kongweisi/p/11038517.html網絡

(三)TensorFlow框架之會話:https://www.cnblogs.com/kongweisi/p/11038550.html框架

(四)TensorFlow框架之張量:https://www.cnblogs.com/kongweisi/p/11039237.htmldom

 

本文概述:url

  • 說明變量op的特殊做用
  • 說明變量op的trainable參數的做用
  • 應用global_variables_initializer實現變量op的初始化

 

一、變量

TensorFlow變量是表示程序處理的共享持久狀態的最佳方法。變量經過 tf.Variable OP類以及tf.get_variable()類進行操做。spa

變量的特色:.net

  • 存儲持久化
  • 可修改值
  • 可指定被訓練

1.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
# 特殊的建立張量OP
# 一、必須手動初始化

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)
   # 或者直接這麼作 sess.run(tf.global_variables_initializer())

1.2 變量OP的方法

 

給變量賦值一個新的值,返回一個新的變量code

  • 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]])
# 初始化變量OP
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))

關於變量的被訓練,我會在後面的線性迴歸案例當中介紹orm

二、命名空間與共享變量

共享變量的主要用途在一些網絡當中的參數共享, 因爲在TensorFlow當中,只要咱們定義的不一樣OP, 即便name參數指定同樣,但實際上也並非同一個變量。

若是想要達到重複利用變量的效果,咱們就要使用tf.variable_scope()結合tf.get_variable()一塊兒使用

2.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.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>

2.2 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)

注意:TensorFlow和python不一樣, 它是維護一個全部OP名字的列表,不是以取的最前面的名字(自定義的接收結果,python變量)區分。

共享變量就至關於全局變量。

相關文章
相關標籤/搜索