TensoFlow 框架,如何快速上手去解決圖像處理,自然語言處理的問題呢呢?有一次去新浪面試,就問到TensorFlow 中的類與操作有什麼方法可以一眼看出來,答案在本文。
0
1
Variable
a = tf.Variable(2, name="scalar") # create variable a with scalar value
b = tf.Variable([2, 3], name="vector") # create variable b as a vector
c = tf.Variable([[0, 1], [2, 3]], name="matrix") # create variable c as a 2x2 matrix
# create variable W as 784 x 10 tensor, filled with zeros
W = tf.Variable(tf.zeros([784,10]))
02
Variable vs constant
Variable 是tensorflow的一個類,裡面封裝了很多operations,簡稱ops,所以它是大寫的,而tensorflow的op是小寫的。
又知constant是一個operation,簡寫為op,所以它小寫了。
初始化Variable
在01節中,創建了a,b,c,w4個Variable對象,在tensorflow中,創建的這些對象,必須要經過初始化才能使用。
最簡單直接的初始化所有變量的方法:
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
初始化指定變量:
#初始化變量a和b
init_ab = tf.variables_initializer([a, b], name="init_ab")
with tf.Session() as sess:
sess.run(init_ab)
初始化一個變量:
W = tf.Variable(tf.zeros([784,10]))
with tf.Session() as sess:
sess.run(W.initializer)
04
eval
對比兩片代碼,pieceA, pieceB :
pieceA
# W is a random 700 x 100 variable object
W = tf.Variable(tf.truncated_normal([700, 10]))
with tf.Session() as sess:
sess.run(W.initializer)
print W
>> Tensor("Variable/read:0", shape=(700, 10), dtype=float32)
pieceB
# W is a random 700 x 100 variable object
W = tf.Variable(tf.truncated_normal([700, 10]))
with tf.Session() as sess:
sess.run(W.initializer)
print W.eval()
>> [[-0.76781619 -0.67020458 1.15333688 ..., -0.98434633 -1.25692499 -0.90904623]
[-0.36763489 -0.65037876 -1.52936983 ..., 0.19320194 -0.38379928 0.44387451]
[ 0.12510735 -0.82649058 0.4321366 ..., -0.3816964 0.70466036 1.33211911] ...,
[ 0.9203397 -0.99590844 0.76853162 ..., -0.74290705 0.37568584 0.64072722] ]
So, you can guess what eval() functions!
05
Variable的操作接口:assign()
一個問題:
W = tf.Variable(10)
W.assign(100)
with tf.Session() as sess:
sess.run(W.initializer)
print W.eval()
打印的結果,是10,還是100???
10
Why?
一條tensorflow的規則:
W.assign(100) 並不會給W賦值,assign()是一個op,所以它返回一個op object,需要在Session中run這個op object,才會賦值給W.
Just like this:
W = tf.Variable(10)
assign_op = W.assign(100)
with tf.Session() as sess:
sess.run(W.initializer)
sess.run(assign_op)
print W.eval() # >> 100
帶下劃線的代碼可以省略,因為assign_op可以完成賦初始值操作。事實上, initializer op 是一個特殊的assign op.
Go on:
# create a variable whose original value is 2
my_var = tf.Variable(2, name="my_var")
# assign a * 2 to a and call that op a_times_two
my_var_times_two = my_var.assign(2 * my_var)
with tf.Session() as sess:
sess.run(my_var.initializer)
sess.run(my_var_times_two) # >> 4
sess.run(my_var_times_two) # >> 8
sess.run(my_var_times_two) # >> 16
大家可以體會,為什麼執行一次,就會加倍。
進而,體會assign()返回的assign_op的意義。