Pycharm目前是機器學習中最廣泛,最收歡迎的工具之一,它強大,具備親和力,正如它的名字同樣魅力無窮。Pycharm官網上有專業版和社區版,社區版是免費的,僅作數據科學方面的研究的話社區版也足夠開發使用了,Windows系統的下載地址爲:https://www.jetbrains.com/pycharm/download/#section=windows, 下載完成後就能夠安裝了,安裝無需作特別的設置,默認安裝就能夠了。html
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所示的紅色框中的安裝包。node
圖1-1python
圖1-2算法
圖1-3編程
下載完成後開始安裝,在正式安裝以前必定要記得勾選「Add Python 3.6 to PATH」,如圖1-4所示,意思是把python的安裝路徑加入到系統的環境變量中。接着可根據本身須要選擇默認安裝或自定義安裝,無論怎樣都要記住安裝路徑,方便後續相關設置。windows
圖1-4數組
圖1-5markdown
圖1-5所示的安裝成功後,咱們再來驗證一下是否真正安裝成功。打開cmd,輸入py,回車,能夠看到出現了python3.6版本的相關信息(圖1-6所示),證實安裝成功。接着查看一下python的安裝路徑是否已經加入到了系統的環境變量中,打開控制面板 > 全部控制面板項 > 系統 > 高級系統設置 > 高級 > 環境變量,能夠看到python的安裝路徑已經加入到了系統環境變量中,圖1-7所示。若是沒有路徑信息,多是安裝python3.6以前忘記勾選「Add Python 3.6 to PATH」這一步,這個時候就只能本身手動添加了,把你以前記住的安裝路徑在新建環境變量裏面填寫清楚就能夠了。dom
圖1-6機器學習
圖1-7
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的概念和用法,開始咱們的數據科學之旅。
在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] #聲明連續tensor linear_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)
的行爲。
變量是算法的參數,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()以前,變量都沒有被初始化。
佔位符是一個對象,你能夠對它賦予不一樣類型和維度的數據,它依賴於計算圖的結果,好比一個計算的指望輸出。佔位符猶如它的名字同樣僅僅爲要注入到計算圖中的數據佔據一個位置。聲明佔位符用tf.placeholder()
函數,如下是一個例子:
x = tf.placeholder(tf.float32, shape=[2,2]) y = tf.identity(x) x_vals = np.random.rand(2,2) sess.run(y, feed_dict={x: x_vals}) ---result [[ 0.11068643 0.57449234] [ 0.26858184 0.83333433]]
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 Nodes
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, {a: 3, b: 4.5})) print(sess.run(adder_node, {a: [1, 3], b: [2, 4]})) ---result 7.5 [ 3. 7.]
還能夠再上面的計算途中加入更多操做,見下代碼清單:
add_and_triple = adder_node * 3. print(sess.run(add_and_triple, {a: 3, b: 4.5})) ---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, {x: [1, 2, 3, 4]})) ---result [ 0. 0.30000001 0.60000002 0.90000004]
接下來咱們將計算圖變得更爲複雜,代碼清單以下:
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={x_data: x_val})) ---result [[ 102.] [ 66.] [ 58.]] [[ 114.] [ 78.] [ 70.]]
接下來咱們來看下代碼如何運行,placeholder 在運行時送入(feed in)數據,從計算圖中能夠看到,要執行Add操做,須要首先執行prod1,而後執行prod2,最後才執行Add操做。
許多的算法依賴於矩陣的操做,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.]] [[ 0.08475778 -0.81952369 -0.40169609] [-0.6406377 -0.67895085 -1.13811123]] [[ 5. 5. 5.] [ 5. 5. 5.]] [[ 0.30655277 0.81441486] [ 0.68046188 0.64171898] [ 0.76518583 0.10888731]] [[ 1. 2. 3.] [-3. -7. -1.] [ 0. 5. -2.]]
Tensor具備不少標準的運算符,如add()
,sub()
,mul()
,div()
等,除了這些標準的運算符外,Tensorflow給咱們提供了更多的運算符。如下是一個基礎的數學函數列表,全部的這些函數都是按元素操做。
運算符 | 描述 |
---|---|
abs() | 計算一個輸入tensor的絕對值 |
ceil() | 一個輸入tensor的頂函數 |
cos() | Cosine函數 C |
exp() | 底數爲e的指數函數,指數爲輸入的tensor |
floor() | 一個輸入tensor的底函數 |
inv() | 一個輸入tensor的倒數函數,(1/x) |
log() | 一個輸入tensor的天然對數 |
maximum() | 取兩個tensor中的最大的一個 |
minimum() | 取兩個tensor中的最小的一個 |
neg() | 對一個tensor取負值 |
pow() | 第一個tensor是第二個tensor的冪 |
round() | 舍入最接近的整數 |
rsqrt() | 計算一個tensor的平方根後求倒 |
sign() | 根據tensor的符號返回-1,0,1中的某個值 |
sin() | Sine函數 |
sqrt() | 計算一個輸入tensor的平方根 |
square() | 計算一個輸入的tensor的平方 |
下面還有一些值得咱們瞭解的函數,這些函數在機器學習中比較經常使用,Tensorflow已經包裝好了。
運算符 | 描述 |
---|---|
digamma() | 計算lgamma函數的導數 |
erf() | 計算tensor的高斯偏差 |
erfc() | 計算tensor的高斯互補偏差 |
lbeta() | 計算天然對數的beta函數的絕對值 |
lgamma() | 計算天然對數的gamma函數的絕對值 |
squared_difference() | 計算兩個tensor的偏差平方 |