2018/12/20

TensorFlow 安裝與測試

17 TensorFlow 安裝與測試

⬛ 安裝 TensorFlow with Jupyter Notebook
TensorFlow 官網安裝說明 for Windows
https://www.tensorflow.org/install/pip
指出的系統需求是Windows 7 or later (64-bit) ,Requires Python 3.4, 3.5, or 3.6。
 因先前安裝Anaconda時python的版本是3.7,但TensorFlow只支援到3.6,所以另建一個 Python 3.6 版的虛擬環境來執行 TensloFlow 。在Dos下輸入
 > conda create -n tensorflow pip python=3.6
這樣會建立一個名為tensorflow的虛擬環境,用來跑Python 3.6 和 tensorflow。
之後用activate tensorflow進到虛擬環境,若要安裝CPU-only版本,在Dos 下用
> pip install --ignore-installed --upgrade tensorflow
若要安裝GPU-suppose 版本,在Dos 下用
> pip install --ignore-installed --upgrade tensorflow-gpu
程式跑一陣子後應該就可安裝完成,並回到Dos模式,因要用jupyter notebook所以需在虛擬環境下再安裝notebook,可用下列指令
> pip install jupyter
裝完成後環境就大致完成,在虛擬環境下
> jupyter notebook 就會帶出notebook,這時在cell裡下
import sys
sys.version
# '3.6.6 | packaged by conda-forge | (default, Jul 26 2018, 11:48:23) 
#   [MSC v.1900 64 bit (AMD64)]'
上述是用來查看Python 的版本,因Tensorflow只支援到Python 3.6 版,而建立虛擬環境我們是選用3.6 版,查驗確認無誤。#號後面接的是執行後的回應。之後再下
import tensorflow as tf
tf.__version__
# '1.12.0'
可見已經安裝了TensorFlow 1.12版。之後退出Jupyter notebook 並在虛擬環境下安裝一些常用的套件,若這次沒裝的可在要用時再行安裝。
> pip install numpy scipy scikit-learn 
pip pillow matplotlib panda keras
之後再進入jupyter notebook 就可開始TensorFlow 的學習路程。

⬛ Hello Word
TensorFlow 和Keras是很常見到的deep learning (深度學習)的開發軟體,一般而言TensorFlow 比較低階,使用時需設定的細節較繁瑣,但功能較強大,而Keras 有點像是深度學習的套件,簡單幾行指令就可完成學習的模型。我們先由TensorFlow ( 以後討論有時縮寫成 tf )開始,稍後再來探討 Keras。

tf和其他程式語言一個不同的地方是程式中分成兩大階段,第一階段是先設計系統的model (模型) ,這是要建立系統的graph (連接圖),建好之後第二階是建立一個 Session (議程) 用以執行此連接圖並取得輸出。Tensor (張量)在物理及工程上是指用來表示純量、向量及其他張量之間的關係,但在程式語言裡就簡單的指如向量、矩陣等各種維度的量。flow是指流程,所以tf可以想像成很多張量所連接成的圖狀,而訊號在這些張量間流動。因而,可以想像在tf的連作方式是我們先把張量及其他元素連接好,再讓訊號流動,以達成深度學習的功能。

首先看一個Hello Word的例子
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
sess.close()
# b'Hello, TensorFlow!'
上例中是個最簡單的例子,設一個tf 的constant 變數,這是最簡單的graph,再來建立session,並使用session 的run method 傳回常數並用print列印,最後close session。Python 3.5字串預設是unicode,若是列印byte字串,其前會加個b’,表示是byte 字串,若不要印出b',
在run()方法之後再串接.decode方法就可以了。上面例子可看出,要執行前要先定義一個Session物件,再叫用.run方法。再一個較複雜的例子
import tensorflow as tf
a = tf.placeholder("float")
b = tf.placeholder("float")
add_op = tf.add(a, b)
mul_op = tf.multiply(a, b)
output_array = [[add_op, mul_op]]
with tf.Session() as sess:
    output= sess.run(output_array, feed_dict={a: 4, b: 2})
    print(output)
# [[6.0, 8.0]]
tf 中用的變數種類除前述的constant外,還有Variable() class的物件,此種是真正的變數,使用時需給初值及tensor 的 shape (外形),在機器學習的過程中就是要調整這種變數的量,以達到系統最佳化,所以這種變數是可訓練的。另還有上面例子中使用的placeholder() ,可稱為持位器,就是宣告了一個變數在記憶體中的某個位置,所以變數的shape及data tpye要先指定,而真正的但就等到要用時再傳到那個位置。上例中a,b宣告成placeholder,形態是float,之後再進行a,b的相加及相乘,並把結果用一個$2\times 1$的array 來存放,這是此例的graph。接下來建立session物件,run()方法中指定output_array,但需用到a,b兩個持位器的變數,其值必需帶入,程式是以feed_dict帶入,所引進的變數是以python 的dict 形態傳進,關鍵字'feed_dict='可省略。程式最後印出結果。 tensorflow 變數可宣告成常數,或是placeholder,此變數只給定一變數型態(類似給定位址)但並未具有任何值。

⬛ Tensor and Variable
每一tensor有三個量: rank (維度或秩)、 shape(亦即$m\times n$)、 type(型態,指儲存的資料的型態,是float, integer等)。用numpy 所產生的ndarray 並不是tf 裡的 tensor,要帶入給 tf 用時需要轉成 tf 的 tensor。可先產生一個𝑛維的array(陣列),再用 tf.convert_to_tensor 轉成 tf 的tensor 。用 .shape 和.dtype 屬性可看外形及資料型態
import tensorflow as tf
import numpy as np
arr_1d = np.array([1.3, 1, 4.0, 23.99])
print(arr_1d)
tensor_1d=tf.convert_to_tensor(arr_1d,dtype=tf.float64)
print(tensor_1d.shape)
print(tensor_1d.dtype)
with tf.Session() as sess:
    print(sess.run(tensor_1d))
    print(sess.run(tensor_1d[0]))
    print(sess.run(tensor_1d[2]))
[ 1.3   1.    4.   23.99]
(4,)
<dtype: 'float64'>
[ 1.3   1.    4.   23.99]
1.3
4.0
上例中先產生一個一維的陣列,再轉成tf 的 tensor,再列印相關參數。需注意的是如只要列印tensor的外形或dtype時,不需用到session run,但如要列印內容時就需要用run的方法。

在tf 裡常見value, shape dimension,等字,其中shape 和dimension有時會搞混。value是指一個(組)給定的值,當要宣告一個變數時,要給定值可用括號或方括號格式輸入,如下程式
import tensorflow as tf
sess = tf.InteractiveSession()
rv = tf.constant(((1,2,3),(4,5,6)))
print(rv.shape)
print(rv.eval())
sess.close()
#(2, 3)
#[[1 2 3]
# [4 5 6]]
或者可用
import tensorflow as tf
sess = tf.InteractiveSession()
rv = tf.constant([[1,2,3],[4,5,6]])
print(rv.shape)
print(rv.eval())
sess.close()
#(2, 3)
#[[1 2 3]
# [4 5 6]]
上面兩個例子中一個是用括號另個是用方括號格式輸入數值,但一般習慣是用方括號。另程式中使用sess = tf.InteractiveSession()的好處是當宣告後可再之後的程式中的任何位置使用run 方法。使 用前先用sess.close()是要關掉之前有同名稱的session以確保變數不混亂。shape 指的是一個tensor 的外,如上兩例中的shape 是$2\times 3$,但dimension 是2。要宣告如全0、全1、或是隨機值的tensor時需指shape,tf才知到要配入多大的 tensor,若只指定dimensions,tf並不知道每一維含有多少元素,如上例中的shape 是(2,3),所以若要產生一個相同外形的tensor就要指定shape為(2,3),如
import tensorflow as tf
sess = tf.InteractiveSession()
my_tensor = tf.random_normal((2,3))
print(my_tensor.shape)
print(my_tensor.eval())
sess.close()
#(2, 3)
#[[ 0.58983636 -0.3081955  -1.0226754 ]
# [ 0.9014508  -2.2361975  -1.6274402 ]]
上列是產生一個常態分佈的tensor。現在的程式語言編輯軟體都有auto complete的功能,如在上例中打字到第3行的tf.random時按下鍵盤的Tab鍵就會帶出如下圖
auto complete
帶出的選單中所列的是可以接上的合語法的程式碼,這樣可少打一些字。

tf.Variable(_)是要產生可以用來訓練的變數,如神經網路裡要用Backpropagation調整的係數,要宣告Variable物件時要給定初值,最常用的是給隨機值,一般可先產生個tensor,再把tensor的值當為Variable 的初值,如下程式
import tensorflow as tf
sess = tf.InteractiveSession()
tensor_1 = tf.random_normal((2,3))
my_var = tf.Variable(initial_value = tensor_1)
print(my_var)
sess.close()
<tf.Variable 'Variable_6:0' shape=(2, 3) dtype=float32_ref>
上例中如果企圖用print(my_var.eval())印出my_var的佄報錯說Variable 沒有初始化,所以需改成
import tensorflow as tf
sess = tf.InteractiveSession()
tensor_1 = tf.random_normal((2,3))
my_var = tf.Variable(initial_value = tensor_1)
init = tf.global_variables_initializer()
sess.run(init)
print(my_var.eval())
sess.close()
#[-1.3067722   1.0955395  -0.8759342 ]
# [-0.01822465  0.4211547  -0.01513049]]
加上第5行是設定一個初始化所有變數的物件,第6行run 這物件初始化變數,之後便可用eval()求值。

⬛ TensorBoard: (windows platform)
TensorBoard為一圖形介面工具,利於程式開發
import tensorflow as tf
a = tf.constant(10,name="a")
b = tf.constant(90,name="b")
y = tf.Variable(a+b*2, name="y")
model = tf.global_variables_initializer()
with tf.Session() as session:
    merged = tf.summary.merge_all()
    writer = tf.summary.FileWriter("/tmp/tensorflowlogs", session.graph)
    session.run(model)
    print(session.run(y))
#190
上列程式中在constant()的參數中加上如name='a'是指定變數在連接圖裡的名稱為'a',程式執行$y=a+2\times b$所以會得190。第7行是把各彙整的節湊合在一起,第8行是在指定的目錄上寫下seesion.graph,因我工作於D:,所以 是在 D:/tmp/tensorflowlogs的目錄,寫下的檔案為events.out.tfevents.1545307708.LAOWEIZ-PC。要看這個檔需啟用tensorboard server,所以再開啟一個cmd視窗,進入虛擬環境,下
 > tensorboard --logdir=/tmp/tensorflowlogs 
注意回應最後一行
tensorboard server
注意回應最後行,http://(your computer name):6006,我的電腦名稱是laoweiz-PC,所以我把網址http://laoweiz-PC:6006貼到瀏覽器就可查看圖形,如
tensorboard
如果在cmd 用下列指令
> tensorboard --logdir=/tmp/tensorflowlogs --host=127.0.0.1
則會得到下圖回應
127.0.0.1:6006
這時可用http://127.0.0.1:6006在瀏覽器上查看圖形,因127.0.0.1就是localhost,所以網址用localhost:6006 也可以。圖形內容的解讀以後再來研究。

沒有留言:

張貼留言