2018年1月24日 星期三

tensorflow-基礎語法

TensorFlow用張量這種資料結構來表示所有的資料。用一階張量來表示向量,如:v = [1.2, 2.3, 3.5] ,如二階張量表示矩陣,如:m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],可以看成是方括號嵌套的層數。


1.  編輯器

2.  編寫tensorflow代碼,實際上就是編寫py檔,最好找一個好用的編輯器,如果你用vimgedit比較順手,那也可以的啦。我們既然已經安裝了anaconda,那麼它裡面自帶一個還算不錯的編輯器,名叫spyder,用起來和matlab差不多,還可以在右上角查看變數的值。因此我一直使用這個編輯器。它的啟動方式也很簡單,直接在終端輸入spyder就行了。


Note:

Anaconda自帶的IDE spyder編輯python時,發現無法導入tensorflow模塊,我猜測應該時IDE的搜索路徑沒有包含tensorflow的路徑吧(未仔細研究),然後我在Anadconda的安裝路徑中找到了/ envs/tensorflow/lib/python2.7,並將該路徑中的site-packages檔夾中的所有檔拷貝到,Anaconda安裝路徑下的lib/python2.7/site-packages檔夾中,之後再次打開IDE ,發現已經可以import了!!!!

cd  anaconda
cp -rf  envs/tensorflow/lib/python2.7/site-packages/* lib/python2.7/site-packages/

2.  常數

3.  我們一般引入tensorflow都用語句

4.  import tensorflow as tf

5.  因此,以後文章中我就直接用tf來表示tensorflow了。

6.  tf中,常數的定義用語句:


a=tf.constant(10)

這就定義了一個值為10的常數a


3.  變數

4.  變數用Variable來定義,並且必須初始化,如:


x=tf.Variable(tf.ones([3,3]))
y=tf.Variable(tf.zeros([3,3]))

分別定義了一個3x3的全1矩陣x,和一個3x3的全0矩陣y01的值就是初始化。

變數定義完後,還必須顯式的執行一下初始化操作,即需要在後面加上一句:

init=tf.initialize_all_variables()

這句可不要忘了,否則會出錯。


4.  佔位符

5.  變數在定義時要初始化,但是如果有些變數剛開始我們並不知道它們的值,無法初始化,那怎麼辦呢?

6.  那就用佔位符來佔個位置,如:


x = tf.placeholder(tf.float32, [None, 784])

指定這個變數的類型和shape,以後再用feed的方式來輸入值。


5.  (graph)

6.  如果把下面的python語句改在tf語句,該怎麼寫呢:


x=3
y=2
z=x+y
print(z)

定義兩個變數,並將兩個數相加,輸出結果。如果在tf中直接像上面這樣寫,那就錯了。x,y,z分別是三個tensor對象,對象間的運算稱之為操作(op), tf不會去一條條地執行各個操作,而是把所有的操作都放入到一個圖(graph)中,圖中的每一個結點就是一個操作。然後行將整個graph的計算過程交給一個TensorFlowSession,Session可以運行整個計算過程,比起操作(operations)一條一條的執行效率高的多。

執行代碼如下:

import tensorflow as tf
x = tf.Variable(3)
y = tf.Variable(5)
z=x+y
init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(z))

其中sess.run()即是執行,注意要先執行變數初始化操作,再執行運算操作。

Session需要先創建,使用完後還需要釋放。因此我們使用with...as..語句,讓系統自動釋放。

例子1hello world

import tensorflow as tf
word=tf.constant('hello,world!')
    with tf.Session() as sess:
    print(sess.run(word))

例子2:加法和乘法

import tensorflow as tf
a = tf.placeholder(tf.int16)
b = tf.placeholder(tf.int16)
add = tf.add(a, b)
mul = tf.mul(a, b)

with tf.Session() as sess:
    print('a+b=',sess.run(add, feed_dict={a: 2, b: 3}))
    print('a*b=',sess.run(mul, feed_dict={a: 2, b: 3}))

此處使用feed_dict以字典的方式對多個變數輸入值。

例子3:矩陣乘法

import tensorflow as tf
a=tf.Variable(tf.ones([3,2]))
b=tf.Variable(tf.ones([2,3]))
product=tf.matmul(5*a,4*b)
init=tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(product))

其中

product=tf.matmul(5*a,4*b)

也可以改成

product=tf.matmul(tf.mul(5.0,a),tf.mul(4.0,b))

定義變數時,沒有指定資料類型,則默認為float32,因此是5.0而不是5

再看一個實例:

#coding:utf-8
import tensorflow as tf

# 創建一個變數state,初始值是0,名稱是counter
state = tf.Variable(0, name='counter')

# 定義常數 one
one = tf.constant(1)

# 定義加法步驟 (: 此步並沒有直接計算,再調用時才計算)
new_value = tf.add(state, one)

# State 更新成 new_value
update = tf.assign(state, new_value)



init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    print sess.run(state)
    print "第一次列印"
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))
        print(sess.run(one))


輸出結果是:
0
第一次列印
1
1
2
1
3
1


沒有留言:

張貼留言