python之tensorflow的variable本質解析

tensorflow採用C實現,variable就是C語言的變量,tensorflow規定變量必須初始化其實是減少變量的不確定性,在C語言裏面,變量可以不初始化,但爲初始化的變量的值不可預估
看代碼:
a=tf.Variable([0,0,0]) //這其實就相當於C的變量的定義,int a[3];
b=tf.assign(a,[1,2,3]) //這其實就是變量的賦值,a[3]={1,2,3};

看完整代碼:
import tensorflow as tf

a=tf.Variable([0,0,0])
op1=tf.assign(a,[1,2,3])
op2=tf.assign(a,[4,5,6])

with tf.Session() as sess:
print(op1)
print(op2)
print(sess.run(op1))
print(sess.run(op2))

輸出爲:
Tensor(“Assign:0”, shape=(3,), dtype=int32_ref)
Tensor(“Assign_1:0”, shape=(3,), dtype=int32_ref)
[1 2 3]
[4 5 6]
這裏的assign()函數的作用是給tensorflow裏面的C變量賦值,而run()函數作用於賦值操作時,就是執行操作,作用於variable對象時把tensorflow裏面的C數據類型提取出來轉換爲numpy對象使用,就是return一個numpy對象,其實變量a在run()前和run後並沒有發生變化,請看代碼:
import tensorflow as tf

a=tf.Variable([0,0,0])
op1=tf.assign(a,[1,2,3])
op2=tf.assign(a,[4,5,6])
print(a)
with tf.Session() as sess:
print(op1)
print(op2)
print(sess.run(op1))
print(sess.run(op2))
print(a)
輸出爲:
<tf.Variable ‘Variable:0’ shape=(3,) dtype=int32_ref>
Tensor(“Assign:0”, shape=(3,), dtype=int32_ref)
Tensor(“Assign_1:0”, shape=(3,), dtype=int32_ref)
[1 2 3]
[4 5 6]
<tf.Variable ‘Variable:0’ shape=(3,) dtype=int32_ref>
變量a在run前和run後都是一個tensorflow的variable對象,並沒有發生變化,run()作用於variable對象時就是return一個numpy對象,注意賦值操作也要run一下才會執行,其實我搞不懂爲什麼要這樣設計???
注意,tensorflow的坑來了,請看下面代碼:
import tensorflow as tf

a=tf.Variable([0,0,0])
op1=tf.assign(a,[1,2,3])
op2=tf.assign(a,[4,5,6])

with tf.Session() as sess:
print(op1)
print(op2)
print(sess.run(op1))
print(type(sess.run(op2)))

with tf.Session() as sess:
sess.run(a)
上面代碼會報錯:Attempting to use uninitialized value Variable,明明已經初始化了呀???
其實兩個sess是不同的,我們第一個sess執行的賦值操作,而第二個沒有,不同的sess使用同一variable時,都要先執行賦值操作才能使用,請看代碼:
import tensorflow as tf

a=tf.Variable([0,0,0])
op1=tf.assign(a,[1,2,3])
op2=tf.assign(a,[4,5,6])

with tf.Session() as sess:
print(sess)

with tf.Session() as sess:
print(sess)
輸出:
<tensorflow.python.client.session.Session object at 0x0000000009C7FE10>
<tensorflow.python.client.session.Session object at 0x0000000009C7FE48>
其實我不明白爲什麼要這樣設計,完全可以把Session設計成單例模式的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章