Tensorflow開發環境配置及其基本概念
訪問flyai.club,一鍵創建你的人工智慧項目
作者 | 帥蟲哥
http://www.cnblogs.com/vipyoumay/p/7474435.html
1. 安裝Tensorflow開發環境
1.1. 安裝pycharm
Pycharm目前是機器學習中最普遍,最收歡迎的工具之一,它強大,具有親和力,正如它的名字一樣魅力無窮。Pycharm官網上有專業版和社區版,社區版是免費的,僅做數據科學方面的研究的話社區版也足夠開發使用了,Windows系統的下載地址為:https://www.jetbrains.com/pycharm/download/#section=windows, 下載完成後就可以安裝了,安裝無需做特別的設置,默認安裝就可以了。
1.2. 安裝python3.6
tensorflow需要運行在python3.4及以上版本,在這個問題上我就出錯過一次。之前我電腦上的python版本為2.7,一開始我沒有注意到這種情況,我就直接在pycharm中打開File > Default Setting > Project Interpreter,查找tensorflow然後點擊安裝,結果報錯了(如圖1-1,1-2所示),錯誤的提示信息也讓人摸不著頭腦,查閱了一些資料猛的才發現是我的python版本出了問題,於是毫不猶豫的去下載python3.6(目前已更新到3.6.2版本了),下載地址為官網:https://www.python.org/getit/, 注意python3.6版本已經不支持Win32位的系統了,只有Win64位的安裝包,下載如圖1-3所示的紅色框中的安裝包。
圖1-1
圖1-2
圖1-3
下載完成後開始安裝,在正式安裝之前一定要記得勾選「Add Python 3.6 to PATH」,如圖1-4所示,意思是把python的安裝路徑加入到系統的環境變數中。接著可根據自己需要選擇默認安裝或自定義安裝,不管怎樣都要記住安裝路徑,方便後續相關設置。
圖1-4
圖1-5
圖1-5所示的安裝成功後,我們再來驗證一下是否真正安裝成功。打開cmd,輸入py,回車,可以看到出現了python3.6版本的相關信息(圖1-6所示),證明安裝成功。接著查看一下python的安裝路徑是否已經加入到了系統的環境變數中,打開控制面板 > 所有控制面板項 > 系統 > 高級系統設置 > 高級 > 環境變數,可以看到python的安裝路徑已經加入到了系統環境變數中,圖1-7所示。如果沒有路徑信息,可能是安裝python3.6之前忘記勾選「Add Python 3.6 to PATH」這一步,這個時候就只能自己手動添加了,把你之前記住的安裝路徑在新建環境變數裡面填寫清楚就可以了。
圖1-6
圖1-7
1.3. 安裝Tensorflow
Pycharm,以及Python3.6都安裝完畢,接著打開Pycharm,在File > Default Setting > Project Interpreter中點擊設置圖片按鈕,選擇Create VirtualEnv,如圖1-8所示,表示新建一個虛擬環境。建立虛擬環境的目的是為了方便以後便捷、快速的安裝各種庫或插件,以及以後的程序執行等都在該虛擬環境下運行。點擊「Create VirtualEnv」後跳出新建虛擬環境對話框,圖1-9所示,在「Name」處為虛擬環境命名,「Location」是指虛擬環境的安裝路徑,注意不要與python3.6的安裝目錄相同,「Base interpreter」處選擇python3.6的安裝目錄下的python.exe文件,設置完成後,Pycharm會為你新建好一個3.6版本的虛擬環境,如圖1-10所示。
圖1-8
圖1-9
圖1-10
初始建立好的虛擬環境已經有pip工具了,接著還是按照最初的步驟安裝Tensorflow。點擊圖1-10上綠色的「+」號鍵,表示新安裝一個庫或插件,然後在出現的搜索框中搜索tensorflow,找到後點擊「Install Package」就好了,圖1-11所示,而不需要你親自碼代碼 pip install tensorflow,真的是方面快捷。
圖1-11
提示安裝完成後,我們最後來驗證是否真正安裝成功,File > New Project,新建一個名字為tensorflow的項目,圖1-12,注意「Interpreter」處已經有了剛剛建立的虛擬環境,在該虛擬環境下新建一個項目,並開展相關的數據挖掘工作就是我們以後將要做的事情了。接著在該項目下新建一個test.py的文件,輸入import tensorflow,沒有報錯的話證明Tensorflow安裝成功。
圖1-12
至此,我們的工具,環境都已經安裝,配置好了,下面的章節我們將了解Tensorflow的概念和用法,開始我們的數據科學之旅。
2. Tensorflow基本概念
2.1. 聲明Tensor
在Tensorflow中,tensor是數據的核心單元,也可以稱作向量或多維向量,一個tensor組成了一個任意維數的數組的初始值模型,而一個tensor的秩(rank)是就是它的維數,這裡有一些例子。
3 #秩為0的tensor,是一個標量,shape[][1., 2., 3.]
#秩為1的tensor,是一個向量,shape[3][1., 2., 3.], [4., 5., 6.]]
#秩為2的tensor,是一個矩陣,shape[2,3][[[1., 2., 3.]], [[7., 8., 9.]]]
#秩為3的tensor,shape[2, 1, 3]
如何聲明一個tensor?請參見如下代碼。
import tensorflow as tf
#聲明固定tensor
zero_tsr = tf.zeros([2, 3]) #聲明一個2行3列矩陣,矩陣元素全為0
filled_tsr = tf.fill([4, 3], 42) #聲明一個4行3列的矩陣,矩陣元素全部為42
constant_tsr = tf.constant([1, 2, 3]) #聲明一個常量,行向量[1 2 3]
#聲明連續tensorl
inear_tsr = tf.range(start=6, limit=15, delta=3) #[6, 9, 12]
#聲明隨機tensor
randnorm_tsr = tf.random_normal([2, 3], mean=0.0, stddev=1.0) #[[ 0.68031377 1.2489816 -1.50686061], [-1.37892687 -1.04466891 -1.21666121]]
注意,tf.constant()函數可以用來把一個值傳播給一個數組,比如通過這樣的聲明tf.constant(42, [4, 3])來模擬tf.fill([4, 3], 42)的行為。
2.2. 變數和佔位符
2.2.1. 變數
變數是演算法的參數,Tensorflow追蹤這些變數並在演算法中優化他們。Variable()函數用來聲明一個變數,並把一個tensor作為輸入,同時輸出一個變數。使用該函數僅僅是聲明了變數,我們還需要初始化變數,以下代碼是關於如果聲明和初始化一個變數的例子。
my_var = tf.Variable(tf.zeros([2,3]))
init = tf.global_variables_initializer()
print(sess.run(init))
print(sess.run(my_var))
---result
[[ 0. 0. 0.]
[ 0. 0. 0.]]
這裡請注意一個問題,當你調用tf.constant()函數的時候,聲明的常量就已經被初始化了,它們的值永遠不變。而相反,當你調用tf.Variable()函數的時候,變數並沒有被初始化,為了初始化所有的變數,你必須要運行一次如下代碼:
init = tf.global_variables_initializer()sess.run(init)
#init是初始化所有的全局變數,在沒有調用sess.run()之前,變數都沒有被初始化。
2.2.2. 佔位符
佔位符是一個對象,你可以對它賦予不同類型和維度的數據,它依賴於計算圖的結果,比如一個計算的期望輸出。佔位符猶如它的名字一樣僅僅為要注入到計算圖中的數據佔據一個位置。聲明佔位符用tf.placeholder()函數,以下是一個例子:
x = tf.placeholder(tf.float32, shape=[2,2])
y = tf.identity(x)
sess.run(y, feed_dict=)
---result
2.3. 計算圖(The Computational Graph)
Tensorflow是一個通過計算圖的形式來表述計算的編程系統,計算圖也叫數據流圖,可以把計算圖看做是一種有向圖,Tensorflow中的每一個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關係。Tensorflow在創建Tensor的同時,並沒有把任何值都加入到計算圖中。
看如下代碼清單:
import tensorflow as tf
node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
print(node1, node2)
---result
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
可以看到輸出的並不是我們所期望的3.0 和 4.0 數字,而是一個node,通過sesson可計算出node的實際值。
sess = tf.Session()
print(sess.run([node1, node2]))
---result
[3.0, 4.0]
我們還可以通過操作符構建各種複雜的Tesnor Nodesnode3 = tf.add(node1, node2)
node3 = tf.add(node1, node2)
print("node3:", node3)
print("sess.run(node3):", sess.run(node3))
---result
node3: Tensor("Add:0", shape=(), dtype=float32)
sess.run(node3):7.0
上面的計算我們都是建立在靜態的數據上,Tensorflow還提供了palceholder用於後期輸入值的一個佔位符
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + provides a shortcut for tf.add(a, b)
print(sess.run(adder_node, ))
print(sess.run(adder_node, ))
---result7.5
[ 3. 7.]
還可以再上面的計算途中加入更多操作,見下代碼清單:
add_and_triple = adder_node * 3.
print(sess.run(add_and_triple, ))
---result
22.5
在機器學習中,我們希望看到一個可隨意輸入的模型,就像上面代碼清單一樣,為讓模型可以訓練,我們需要能夠修改圖獲得新的輸出。Variables允許添加可訓練參數,如果使用如下代碼清單:
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W * x + b
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(linear_model, ))
---result
接下來我們將計算圖變得更為複雜,代碼清單如下:
sess = tf.Session()
my_array = np.array([[1., 3., 5., 7., 9.], [-2., 0., 2., 4., 6.], [-6., -3., 0., 3., 6.]])
x_vals = np.array([my_array, my_array + 1])
x_data = tf.placeholder(tf.float32, shape=(3, 5))
m1 = tf.constant([[1.], [0.], [-1.], [2.], [4.]])
m2 = tf.constant([[2.]])
a1 = tf.constant([[10.]])
prod1 = tf.matmul(x_data, m1)
prod2 = tf.matmul(prod1, m2)
add1 = tf.add(prod2, a1)
for x_val in x_vals:
print(sess.run(add1, feed_dict=))
---result
[[ 102.]
[ 66.]
[ 58.]]
[[ 114.]
[ 78.]
[ 70.]]
接下來我們來看下代碼如何運行,placeholder 在運行時送入(feed in)數據,從計算圖中可以看到,要執行Add操作,需要首先執行prod1,然後執行prod2,最後才執行Add操作。
2.4. 矩陣操作
許多的演算法依賴於矩陣的操作,Tensorflow給我們提供了非常方便,快捷的矩陣運算。
# 生成對角線矩陣
identity_matrix = tf.diag([1.0, 1.0, 1.0])
# 隨機填充2行3列矩陣
A = tf.truncated_normal([2, 3])
# 填充5 到一個2行3列矩陣
B = tf.fill([2, 3], 5.0)
# 填充三行兩列的隨機數矩陣
C = tf.random_uniform([3, 2])
# 將numpy的矩陣轉換
D = tf.convert_to_tensor(np.array([[1., 2., 3.], [-3., -7., -1.], [0., 5., -2.]]))sess = tf.Session()
print(sess.run(identity_matrix))
print(sess.run(A))
print(sess.run(B))
print(sess.run(C))
print(sess.run(D))
---result
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
[[ 5. 5. 5.]
[ 5. 5. 5.]]
[[ 1. 2. 3.]
[-3. -7. -1.]
[ 0. 5. -2.]]
2.5. 聲明運算符
Tensor具有很多標準的運算符,如add(),sub(),mul(),div()等,除了這些標準的運算符外,Tensorflow給我們提供了更多的運算符。以下是一個基礎的數學函數列表,所有的這些函數都是按元素操作。
下面還有一些值得我們了解的函數,這些函數在機器學習中比較常用,Tensorflow已經包裝好了。
— End —
TAG:FlyAI |