去年買了幾本關(guān)于張量流的書,今年看的時(shí)候發(fā)現(xiàn)樣本代碼里用的一些API已經(jīng)過時(shí)了??磥砭S護(hù)一個(gè)更新的張量流教程還是有意義的。這是寫這個(gè)系列的開始。
快餐教程系列希望盡可能降低門檻,少說話,講透。
為了讓大家一開始就看到美好的一幕,而不是停留在基礎(chǔ)知識(shí)的長時(shí)間積累上,參考網(wǎng)上的一些教程,我們在開始直接展示一個(gè)用張量流實(shí)現(xiàn)MNIST手寫識(shí)別的例子。然后慢慢說基礎(chǔ)。
Tensorflow安裝快速教程
由于Python是跨平臺(tái)語言,所以在所有系統(tǒng)上安裝張量流相對容易。后面再說GPU加速。
Tensorflow安裝在Linux平臺(tái)上
我們以Ubuntu版為例,先安裝python3和pip3。Pip是python的包管理工具。
1sudo apt installpython3
2sudo apt installpython3-pip
張量流可以通過管道3安裝:
1 ip3 installtensorflow-升級(jí)
MacOS安裝tensorflow
建議自制安裝python。
1brewinstall python3
安裝python3后,通過pip3安裝張量流。
1 ip3 installtensorflow-升級(jí)
張量流安裝在Windows平臺(tái)上
建議在Windows平臺(tái)上通過Anaconda安裝Tensorflow。
然后打開Anaconda提示符,輸入:
1conda create-n tensorflow pip
2激活張量流
3pip安裝-忽略-安裝-升級(jí)tensorflow
這樣就安裝了張量流。
讓我們快速舉個(gè)例子來嘗試一下:
1將張量流作為tf導(dǎo)入
2a = tf .常數(shù)
3b = tf .常數(shù)
4c = a * b
5sess = tf。會(huì)話
6print)
輸出為2。
張量流,顧名思義,是由張量張量流組成的運(yùn)算。
操作需要運(yùn)行會(huì)話。如果打印,您將獲得
1傳感器,dtype=int32)
也就是說,這是一個(gè)乘法張量,需要通過Session.run來執(zhí)行。
入門捷徑:線性回歸
我們先來看看最簡單的機(jī)器學(xué)習(xí)模型,一個(gè)線性回歸的例子。
線性回歸的模型是矩陣乘法:
1tf .乘法
然后,我們調(diào)用張量流計(jì)算梯度下降函數(shù)TF?;疖?。梯度下降優(yōu)化器實(shí)現(xiàn)優(yōu)化。
讓我們看看這個(gè)示例代碼。只有三十多行,邏輯還是很清晰的。
這個(gè)例子來自丹尼爾在github上的作品:https://github.com/nlintz/TensorFlow-Tutorials,不是我的原作。
1將張量流作為tf導(dǎo)入
2將numpy導(dǎo)入為np
3trX = np.linspace
4 try = 2 * Trx+NP . random . randn* 0.33 #在線性值附近創(chuàng)建一些隨機(jī)值
5X = tf.placeholder
6Y = tf.placeholder
7def型號(hào):
8返回TF。多重 # x * w線性評估,非常簡單
9w = tf。變量
10y_model = model
11cost = tf.square #以平方誤差為優(yōu)化目標(biāo)
12train _ op = TF。train . gradientdeponentoptimizer。最小化#梯度下降優(yōu)化
13#開始創(chuàng)建會(huì)話!
14帶tf。會(huì)話作為會(huì)話:
15#需要先初始化全局變量,這是Tensorflow的要求
16tf . global _ variables _ initializer。運(yùn)行
17對于范圍內(nèi)的I:
18for in :
19sess.run
20print)
我最終會(huì)得到一個(gè)接近2的值,比如我這次運(yùn)行的值是1.9183811
手寫識(shí)別在許多方面
線性回歸是不夠的,所以我們一步開始手寫識(shí)別。
我們以深度學(xué)習(xí)三巨頭之一Yann Lecun教授的MNIST數(shù)據(jù)為例。如上圖所示,MNIST的數(shù)據(jù)是一個(gè)28x28的圖像,并且標(biāo)記了它的值應(yīng)該是多少。
線性模型:邏輯回歸
首先不考慮3721,我們用線性模型分類。
算上評論和空行加起來大概30行,就可以解決手寫識(shí)別的難題了!看看代碼:
1importtensorflow astf
2importnumpy asnp
3 front sensorflow . examples . tutorials . mnist importinput _ data
4定義重量:
5returntf。變量)
6defmodel:
7returntf.matmul #模型或矩陣乘法
8 NIST = input _ data . read _ data _ set
9trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels
10X = tf.placeholder
11Y = tf.placeholder
12w = init_weights
13py_x =型號(hào)
14成本= TF。reduce _ mean ) #計(jì)算錯(cuò)誤
15 train _ op = TF . train . GradientDescentoptimizer。最小化#構(gòu)造優(yōu)化器
16predict_op = tf.argmax
17withtf。會(huì)議評估:
18tf . global _ variables _ initializer。運(yùn)行
19 ori in range:
20forstart,end in,128),range+1,128)):
21 ess . run
22print ==
23 ess . run)
經(jīng)過100輪訓(xùn)練,我們的準(zhǔn)確率是92.36%。
無腦淺層神經(jīng)網(wǎng)絡(luò)
我們用最簡單的線性模型,用經(jīng)典的神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)這個(gè)功能。神經(jīng)網(wǎng)絡(luò)圖如下圖所示。
讓我們構(gòu)建一個(gè)隱藏層,使用最傳統(tǒng)的sigmoid函數(shù)作為激活函數(shù)。它的核心邏輯是矩陣乘法,沒什么技巧在里面。
1h = tf.nn.sigmoid)
2returntf.matmul
完整的代碼如下,還有40多行,不長:
1importtensorflow astf
2importnumpy asnp
3 front sensorflow . examples . tutorials . mnist importinput _ data
4#所有連接隨機(jī)生成權(quán)重
5定義重量:
6returntf。變量)
7defmodel:
8h = tf.nn.sigmoid)
9returntf.matmul
10 NIST = input _ data . read _ data _ set
11trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels
12X = tf.placeholder
13Y = tf.placeholder
14w_h = init_weights
15w_o = init_weights
16py_x =型號(hào)
17成本= TF。reduce _ mean ) #計(jì)算錯(cuò)誤損失
18 train _ op = TF . train . GradientDescentoptimizer。最小化#構(gòu)建優(yōu)化器
19predict_op = tf.argmax
20withtf。會(huì)議評估:
21tf . global _ variables _ initializer。運(yùn)行
22 fori inrange:
23 forstart,end in,128),range+1,128)):
24 sess.run
25 print =
26 sess.run)
第一輪操作,我這次準(zhǔn)確率只有69.11%,第二次提高到82.29%。最終結(jié)果是95.41%,強(qiáng)于Logistic回歸!
請注意,我們模型核心的兩行代碼完全是無腦的,連接成一個(gè)隱藏的層,里面沒有任何技術(shù)。完全取決于神經(jīng)網(wǎng)絡(luò)的建模能力。
深度學(xué)習(xí)時(shí)代的方案——ReLU與輟學(xué)秀頭像
上次技術(shù)含量有點(diǎn)低?,F(xiàn)在是深度學(xué)習(xí)的時(shí)候,我們?nèi)〉昧撕艽蟮倪M(jìn)步。比如我們知道sigmoid函數(shù)應(yīng)該用ReLU函數(shù)代替。
我們也知道我們將成為一名輟學(xué)生。所以我們還是隱藏層,寫一個(gè)更現(xiàn)代的模型:
1X = TF . nn . drop
2h = tf.nn.relu)
3h = tf.nn.dropout
4h2 = tf.nn.relu
5h2 = tf.nn.dropout
6returntf.matmul
除了ReLU和drop,我們還是只有一個(gè)隱藏層,表達(dá)能力沒有大的提升。不是深度學(xué)習(xí)。
1將張量流作為tf導(dǎo)入
2將numpy導(dǎo)入為np
3 from tensorflow . examples . tutorials . mnist import input _ data
4def init_weights:
5返回tf。變量)
6def模型:
7X = tf.nn .壓差
8h = tf.nn.relu)
9h = tf.nn.dropout
10h2 = tf.nn.relu
11 H2 = TF . nn . drop
12return tf.matmul
13 NIST = input _ data . read _ data _ set
14trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels
15X = tf.placeholder
16Y = tf.placeholder
17w _ h = init _ weight
18w _ H2 = init _ weight
19w_o = init_weights
20p _ keep _ input = TF . placeholder
21p _ keep _ hidden = TF . placeholder
22py_x = model
23 cost = TF . reduce _ mean)
24 train _ op = TF . train . rmsproptimizer。最小化
25predict_op = tf.argmax
26帶tf。會(huì)話作為會(huì)話:
27#你需要初始化所有變量
28tf . global _ variables _ initializer。運(yùn)行
29對于I范圍:
30開始,結(jié)束于,128),范圍+1,128)):
33ss . run
33print ==
34 ess . run)
從結(jié)果可以看出,第二次準(zhǔn)確率在96%以上。此后一直徘徊在98.4%左右。只有ReLU和from將準(zhǔn)確率從95%提高到98%以上。
卷積神經(jīng)網(wǎng)絡(luò)的出現(xiàn)
CNN,深度學(xué)習(xí)的真正武器,是卷積神經(jīng)網(wǎng)絡(luò)出來的。與之前的無腦模型相比,這個(gè)模型確實(shí)更加復(fù)雜。它涉及卷積層和匯集層。這個(gè)需要后面詳細(xì)說。
1將張量流作為tf導(dǎo)入
2將numpy導(dǎo)入為np
3 from tensorflow . examples . tutorials . mnist import input _ data
4批處理大小= 128
5test_size = 256
6def init_weights:
7返回tf。變量)
8def型號(hào):
9l1a = tf.nn.relu
10s三叉戟=,填充='SAME '))
11l1 = tf.nn.max_pool
12叉=,填充= '相同')
13l 1 = TF . nn . drop
14l 2a = TF . nn . relu
15步=,填充='SAME '))
16l2 = tf.nn.max_pool
17步=,填充= '相同')
18 L2 = TF . nn . drop
19l3a = TF . nn . relu
20步=,填充='SAME '))
21 l3 = tf.nn.max_pool
22個(gè)字符=,填充= '相同')
23l 3 = TF . resform。as_list]) #整形為
24 L3 = TF . nn . drop
25 l4 = tf.nn.relu)
26l 4 = TF . nn . drop
27pyx = tf.matmul
28返回pyx
29 NIST = input _ data . read _ data _ set
30trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels
31trX = trX.reshape # 28x28x1 input img31trX = TRx . resform # 28x28x1輸入img
32teX = teX.reshape # 28x28x1 input img32teX = TEx . resform # 28x28x1輸入img
33X = tf.placeholder
34Y = tf.placeholder
35w = init_weights # 3x3x1 conv,32路輸出
36w2 = init_weights # 3x3x32 conv,64路輸出
37w3 = init_weights # 3x3x32 conv,128個(gè)輸出
38w4 = init_weights # FC 128 * 4 * 4輸入,625輸出
39w_o = init_weights # FC 625輸入,10輸出
40p _ keep _ conv = TF . placeholder
41p _ keep _ hidden = TF . placeholder
42py_x = model
43 cost = TF . reduce _ mean)
44 train _ op = TF . train . rmsproptimizer。最小化
45predict_op = tf.argmax
46帶tf。會(huì)話作為會(huì)話:
你需要初始化所有的變量
48tf . global _ variables _ initializer。運(yùn)行
49對于I范圍:
50training_batch = ,batch_size),
51范圍+1,批次大小))
52開始、結(jié)束于培訓(xùn)_批次:
53 ess . run
55測試_指數(shù)= np.arange) #獲取測試批次
56np . random . shuffle
57 test _ indexs = test _ indexs
58print ==
59sess.run)
我們來看看這次的運(yùn)營數(shù)據(jù):
10 0.95703125
21 0.9921875
32 0.9921875
43 0.98046875
54 0.97265625
65 0.98828125
76 0.99609375
在第六輪中,它獲得了99.6%的高分,與ReLU和Dropout隱藏層的98.4%的神經(jīng)網(wǎng)絡(luò)相比有了很大的提高。因?yàn)樵降胶竺骐y度越大。
第16輪,我跑出了100%的準(zhǔn)確率:
17 0.99609375
28 0.99609375
39 0.98828125
410 0.98828125
511 0.9921875
612 0.98046875
713 0.99609375
814 0.9921875
915 0.99609375
1016 1.0
綜上所述,借助Tensorflow和機(jī)器學(xué)習(xí)工具,我們只有幾十行代碼,解決了這個(gè)級(jí)別的手寫識(shí)別問題,準(zhǔn)確率可以達(dá)到這個(gè)級(jí)別。
作者博客鏈接:
https://blog.csdn.net/lusing/article/details/79965160
-結(jié)束-
有自己的個(gè)性化機(jī)器人!
1.《tensorflow安裝 連載 | Tensorflow教程一:30行代碼搞定手寫識(shí)別》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《tensorflow安裝 連載 | Tensorflow教程一:30行代碼搞定手寫識(shí)別》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請保留本站內(nèi)容來源地址,http://f99ss.com/keji/1690662.html