去年買(mǎi)了幾本關(guān)于張量流的書(shū),今年看的時(shí)候發(fā)現(xiàn)樣本代碼里用的一些API已經(jīng)過(guò)時(shí)了??磥?lái)維護(hù)一個(gè)更新的張量流教程還是有意義的。這是寫(xiě)這個(gè)系列的開(kāi)始。

快餐教程系列希望盡可能降低門(mén)檻,少說(shuō)話,講透。

為了讓大家一開(kāi)始就看到美好的一幕,而不是停留在基礎(chǔ)知識(shí)的長(zhǎng)時(shí)間積累上,參考網(wǎng)上的一些教程,我們?cè)陂_(kāi)始直接展示一個(gè)用張量流實(shí)現(xiàn)MNIST手寫(xiě)識(shí)別的例子。然后慢慢說(shuō)基礎(chǔ)。

Tensorflow安裝快速教程

由于Python是跨平臺(tái)語(yǔ)言,所以在所有系統(tǒng)上安裝張量流相對(duì)容易。后面再說(shuō)GPU加速。

Tensorflow安裝在Linux平臺(tái)上

我們以Ubuntu版為例,先安裝python3和pip3。Pip是python的包管理工具。

1sudo apt installpython3

2sudo apt installpython3-pip

張量流可以通過(guò)管道3安裝:

1 ip3 installtensorflow-升級(jí)

MacOS安裝tensorflow

建議自制安裝python。

1brewinstall python3

安裝python3后,通過(guò)pip3安裝張量流。

1 ip3 installtensorflow-升級(jí)

張量流安裝在Windows平臺(tái)上

建議在Windows平臺(tái)上通過(guò)Anaconda安裝Tensorflow。

然后打開(kāi)Anaconda提示符,輸入:

1conda create-n tensorflow pip

2激活張量流

3pip安裝-忽略-安裝-升級(jí)tensorflow

這樣就安裝了張量流。

讓我們快速舉個(gè)例子來(lái)嘗試一下:

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)

也就是說(shuō),這是一個(gè)乘法張量,需要通過(guò)Session.run來(lái)執(zhí)行。

入門(mén)捷徑:線性回歸

我們先來(lái)看看最簡(jiǎn)單的機(jī)器學(xué)習(xí)模型,一個(gè)線性回歸的例子。

線性回歸的模型是矩陣乘法:

1tf .乘法

然后,我們調(diào)用張量流計(jì)算梯度下降函數(shù)TF?;疖?chē)。梯度下降優(yōu)化器實(shí)現(xiàn)優(yōu)化。

讓我們看看這個(gè)示例代碼。只有三十多行,邏輯還是很清晰的。

這個(gè)例子來(lái)自丹尼爾在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線性評(píng)估,非常簡(jiǎn)單

9w = tf。變量

10y_model = model

11cost = tf.square #以平方誤差為優(yōu)化目標(biāo)

12train _ op = TF。train . gradientdeponentoptimizer。最小化#梯度下降優(yōu)化

13#開(kāi)始創(chuàng)建會(huì)話!

14帶tf。會(huì)話作為會(huì)話:

15#需要先初始化全局變量,這是Tensorflow的要求

16tf . global _ variables _ initializer。運(yùn)行

17對(duì)于范圍內(nèi)的I:

18for in :

19sess.run

20print)

我最終會(huì)得到一個(gè)接近2的值,比如我這次運(yùn)行的值是1.9183811

手寫(xiě)識(shí)別在許多方面

線性回歸是不夠的,所以我們一步開(kāi)始手寫(xiě)識(shí)別。

我們以深度學(xué)習(xí)三巨頭之一Yann Lecun教授的MNIST數(shù)據(jù)為例。如上圖所示,MNIST的數(shù)據(jù)是一個(gè)28x28的圖像,并且標(biāo)記了它的值應(yīng)該是多少。

線性模型:邏輯回歸

首先不考慮3721,我們用線性模型分類。

算上評(píng)論和空行加起來(lái)大概30行,就可以解決手寫(xiě)識(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ì)議評(píng)估:

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)過(guò)100輪訓(xùn)練,我們的準(zhǔn)確率是92.36%。

無(wú)腦淺層神經(jīng)網(wǎng)絡(luò)

我們用最簡(jiǎn)單的線性模型,用經(jīng)典的神經(jīng)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)這個(gè)功能。神經(jīng)網(wǎng)絡(luò)圖如下圖所示。

讓我們構(gòu)建一個(gè)隱藏層,使用最傳統(tǒng)的sigmoid函數(shù)作為激活函數(shù)。它的核心邏輯是矩陣乘法,沒(méi)什么技巧在里面。

1h = tf.nn.sigmoid)

2returntf.matmul

完整的代碼如下,還有40多行,不長(zhǎng):

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ì)議評(píng)估:

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回歸!

請(qǐng)注意,我們模型核心的兩行代碼完全是無(wú)腦的,連接成一個(gè)隱藏的層,里面沒(méi)有任何技術(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é)生。所以我們還是隱藏層,寫(xiě)一個(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á)能力沒(méi)有大的提升。不是深度學(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對(duì)于I范圍:

30開(kāi)始,結(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ò)出來(lái)的。與之前的無(wú)腦模型相比,這個(gè)模型確實(shí)更加復(fù)雜。它涉及卷積層和匯集層。這個(gè)需要后面詳細(xì)說(shuō)。

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對(duì)于I范圍:

50training_batch = ,batch_size),

51范圍+1,批次大小))

52開(kāi)始、結(jié)束于培訓(xùn)_批次:

53 ess . run

55測(cè)試_指數(shù)= np.arange) #獲取測(cè)試批次

56np . random . shuffle

57 test _ indexs = test _ indexs

58print ==

59sess.run)

我們來(lái)看看這次的運(yùn)營(yíng)數(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í)別的手寫(xiě)識(shí)別問(wèn)題,準(zhǔn)確率可以達(dá)到這個(gè)級(jí)別。

作者博客鏈接:

https://blog.csdn.net/lusing/article/details/79965160

-結(jié)束-

有自己的個(gè)性化機(jī)器人!

1.《安裝tensorflow 連載 | Tensorflow教程一:30行代碼搞定手寫(xiě)識(shí)別》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。

2.《安裝tensorflow 連載 | Tensorflow教程一:30行代碼搞定手寫(xiě)識(shí)別》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/junshi/1690658.html