05.16 「關鍵點」TensorFlow 可以這樣區分類與操作?「附例子」

「關鍵點」TensorFlow 可以這樣區分類與操作?「附例子」

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,所以它小寫了。

03

初始化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的意義。


分享到:


相關文章: