PaddlePaddle學(xué)習(xí)筆記———手寫(xiě)數(shù)字識(shí)別

本系列將作為個(gè)人的paddle學(xué)習(xí)筆記暴构,關(guān)于paddle的安裝記錄后期會(huì)補(bǔ)充在這里。本文要介紹深度學(xué)習(xí)中的“hello world”赤拒,手寫(xiě)數(shù)字識(shí)別架曹。主要是對(duì)官方文檔和其他文章進(jìn)行學(xué)習(xí),并做一個(gè)小小的記錄抵赢,如有描述不準(zhǔn)確的地方期待大家指正欺劳。


背景介紹

手寫(xiě)數(shù)字識(shí)別作為機(jī)器學(xué)習(xí)(或深度學(xué)習(xí))的入門教程,一般使用的都是MINIST數(shù)據(jù)庫(kù)铅鲤。這一數(shù)據(jù)庫(kù)作為一個(gè)簡(jiǎn)單的計(jì)算機(jī)視覺(jué)數(shù)據(jù)集划提,包含了一系列手寫(xiě)數(shù)字和對(duì)應(yīng)的標(biāo)簽,并且每張圖片都進(jìn)行了很好的歸一化和居中處理邢享。作為新手鹏往,我們不必關(guān)注復(fù)雜的數(shù)據(jù)處理過(guò)程,只需試著理解分類過(guò)程跑通代碼即可骇塘。

模型訓(xùn)練步驟

paddle訓(xùn)練模型的過(guò)程可以分為以下幾個(gè)部分:
加載包--加載數(shù)據(jù)--搭建網(wǎng)絡(luò)結(jié)構(gòu)--訓(xùn)練模型--測(cè)試結(jié)果
官方文檔為了對(duì)比效果伊履,搭建了三種不同的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行訓(xùn)練:softmax韩容、多層感知機(jī)和CNN網(wǎng)絡(luò)結(jié)構(gòu)。

模型概覽

softmax回歸

最簡(jiǎn)單的softmax回歸模型是先將輸入層經(jīng)過(guò)一個(gè)全連接層得到的特征唐瀑,然后直接通過(guò)softmax 函數(shù)進(jìn)行多分類群凶。
輸入層的數(shù)據(jù)X傳到輸出層,在激活操作之前哄辣,會(huì)乘以相應(yīng)的權(quán)重 W 请梢,并加上偏置變量 b ,具體如下:

$ y_i = \text{softmax}(\sum_j W_{i,j}x_j + b_i) $
softmax回歸的網(wǎng)絡(luò)圖如下:
[圖片上傳失敗...(image-6f564-1517234805981)]
softmax模型搭建非常簡(jiǎn)單力穗,在一些小數(shù)據(jù)集上可以得到不太差的結(jié)果毅弧。

softmax函數(shù)

softmax函數(shù)在機(jī)器學(xué)習(xí)中有著廣泛的應(yīng)用,新入門的同學(xué)大概更熟悉sigmoid或relu睛廊,但softmax無(wú)疑也是一種十分好用的函數(shù)形真。從它的名字就可以看出這個(gè)函數(shù)的意義:max意味著每次都只取概率最大的情況,但完美主義未必能得到最好的結(jié)果超全,偉大的發(fā)現(xiàn)總是來(lái)自于偶然咆霜!因此我們希望可以在一群最大的值中偶爾得到一個(gè)小概率事件,這就不是max函數(shù)了嘶朱,我們稱之為sofemax蛾坯。
那么具體每一個(gè)取值的概率是多少呢:

假設(shè)我們有一個(gè)數(shù)組,V疏遏,Vi表示V中的第i個(gè)元素脉课,那么這個(gè)元素的softmax值就是[圖片上傳失敗...(image-27a936-1517234805981)]

多層感知器

softmax回歸模型只有輸入與輸出兩層網(wǎng)絡(luò),盡管它能得到不錯(cuò)的結(jié)果财异,但在追求更加精準(zhǔn)的識(shí)別效果時(shí)倘零,就需要增加在輸入輸出層之間添加更多的隱含層。
[圖片上傳失敗...(image-17af98-1517234805981)]
其中戳寸,每個(gè)隱含層中都包含著激活函數(shù)呈驶,常見(jiàn)的激活函數(shù)有sigmoid、tanh疫鹊、relu等等袖瞻。

卷積神經(jīng)網(wǎng)絡(luò)

卷積神經(jīng)網(wǎng)絡(luò)(CNN),是一種專門用來(lái)處理具有類似網(wǎng)格結(jié)構(gòu)的數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)拆吆,例如圖像數(shù)據(jù)(可以看作二位的像素網(wǎng)格)聋迎。它與FC不同的地方在于,CNN的上下層神經(jīng)元并不都能直接連接枣耀,而是通過(guò)“卷積核”作為中介霉晕,通過(guò)“核”的共享大大減少了隱含層的參數(shù)。簡(jiǎn)單的CNN是一系列層,并且每個(gè)層都通過(guò)一個(gè)可微函數(shù)將一個(gè)量轉(zhuǎn)化為另一個(gè)量娄昆,通常用三個(gè)主要類型的層去構(gòu)建CNN結(jié)構(gòu)佩微,包括卷積層(Convolutional Layer)、池化層(Pooling Layer)和全連接層(FC)萌焰。卷積網(wǎng)絡(luò)在諸多應(yīng)用領(lǐng)域有很好的應(yīng)用效果哺眯,特別是在大型圖像處理的場(chǎng)景表現(xiàn)格外出色。
本次手寫(xiě)數(shù)字識(shí)別使用的是卷積神經(jīng)網(wǎng)絡(luò)是LeNet-5扒俯,下圖展示了它的結(jié)構(gòu):輸入二維圖像奶卓,經(jīng)過(guò)兩次卷積,再經(jīng)過(guò)全連接撼玄,最后使用softmax分類作為輸出層夺姑。
[圖片上傳失敗...(image-387dd7-1517234805981)]

卷積與池化層的內(nèi)容下次補(bǔ)充

paddle實(shí)現(xiàn)

加載包

import paddle.v2 as paddle

分別定義三個(gè)分類器:
softmax

def softmax_regression(img):
    predict = paddle.layer.fc(input=img,
                              size=10,
                              act=paddle.activation.Softmax())
    return predict

多層感知器

def multilayer_perceptron(img):
    # 第一個(gè)全連接層,激活函數(shù)為ReLU
    hidden1 = paddle.layer.fc(input=img, size=128, act=paddle.activation.Relu())
    # 第二個(gè)全連接層掌猛,激活函數(shù)為ReLU
    hidden2 = paddle.layer.fc(input=hidden1,
                              size=64,
                              act=paddle.activation.Relu())
    # 以softmax為激活函數(shù)的全連接輸出層盏浙,輸出層的大小必須為數(shù)字的個(gè)數(shù)10
    predict = paddle.layer.fc(input=hidden2,
                              size=10,
                              act=paddle.activation.Softmax())
    return predict

CNN

def convolutional_neural_network(img):
    # 第一個(gè)卷積-池化層
    conv_pool_1 = paddle.networks.simple_img_conv_pool(
        input=img,
        filter_size=5,
        num_filters=20,
        num_channel=1,
        pool_size=2,
        pool_stride=2,
        act=paddle.activation.Relu())
    # 第二個(gè)卷積-池化層
    conv_pool_2 = paddle.networks.simple_img_conv_pool(
        input=conv_pool_1,
        filter_size=5,
        num_filters=50,
        num_channel=20,
        pool_size=2,
        pool_stride=2,
        act=paddle.activation.Relu())
    # 以softmax為激活函數(shù)的全連接輸出層,輸出層的大小必須為數(shù)字的個(gè)數(shù)10
    predict = paddle.layer.fc(input=conv_pool_2,
                              size=10,
                              act=paddle.activation.Softmax())
    return predict

通過(guò)layer.data調(diào)用來(lái)獲取數(shù)據(jù)荔茬,然后調(diào)用分類器得到結(jié)果废膘,計(jì)算其損失函數(shù)(分類問(wèn)題常使用交叉熵函數(shù))

# 該模型運(yùn)行在單個(gè)CPU上
paddle.init(use_gpu=False, trainer_count=1)

images = paddle.layer.data(
    name='pixel', type=paddle.data_type.dense_vector(784))
label = paddle.layer.data(
    name='label', type=paddle.data_type.integer_value(10))

# predict = softmax_regression(images) # Softmax回歸
# predict = multilayer_perceptron(images) #多層感知器
predict = convolutional_neural_network(images) #LeNet5卷積神經(jīng)網(wǎng)絡(luò)

cost = paddle.layer.classification_cost(input=predict, label=label)
parameters = paddle.parameters.create(cost)

optimizer = paddle.optimizer.Momentum(
    learning_rate=0.1 / 128.0,
    momentum=0.9,
    regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 128))

trainer = paddle.trainer.SGD(cost=cost,
                             parameters=parameters,
                             update_equation=optimizer)

輸出訓(xùn)練結(jié)果

from paddle.v2.plot import Ploter

train_title = "Train cost"
test_title = "Test cost"
cost_ploter = Ploter(train_title, test_title)

step = 0

# event_handler to plot a figure
def event_handler_plot(event):
    global step
    if isinstance(event, paddle.event.EndIteration):
        if step % 100 == 0:
            cost_ploter.append(train_title, step, event.cost)
            cost_ploter.plot()
        step += 1
    if isinstance(event, paddle.event.EndPass):
        # save parameters
        with open('params_pass_%d.tar' % event.pass_id, 'w') as f:
            trainer.save_parameter_to_tar(f)

        result = trainer.test(reader=paddle.batch(
            paddle.dataset.mnist.test(), batch_size=128))
        cost_ploter.append(test_title, step, result.cost)
lists = []

def event_handler(event):
    if isinstance(event, paddle.event.EndIteration):
        if event.batch_id % 100 == 0:
            print "Pass %d, Batch %d, Cost %f, %s" % (
                event.pass_id, event.batch_id, event.cost, event.metrics)
    if isinstance(event, paddle.event.EndPass):
        # save parameters
        with open('params_pass_%d.tar' % event.pass_id, 'w') as f:
            trainer.save_parameter_to_tar(f)

        result = trainer.test(reader=paddle.batch(
            paddle.dataset.mnist.test(), batch_size=128))
        print "Test with Pass %d, Cost %f, %s\n" % (
            event.pass_id, result.cost, result.metrics)
        lists.append((event.pass_id, result.cost,
                      result.metrics['classification_error_evaluator']))
trainer.train(
    reader=paddle.batch(
        paddle.reader.shuffle(
            paddle.dataset.mnist.train(), buf_size=8192),
        batch_size=128),
    event_handler=event_handler_plot,
    num_passes=5)

打印日志如下:

# Pass 0, Batch 0, Cost 2.780790, {'classification_error_evaluator': 0.9453125}
# Pass 0, Batch 100, Cost 0.635356, {'classification_error_evaluator': 0.2109375}
# Pass 0, Batch 200, Cost 0.326094, {'classification_error_evaluator': 0.1328125}
# Pass 0, Batch 300, Cost 0.361920, {'classification_error_evaluator': 0.1015625}
# Pass 0, Batch 400, Cost 0.410101, {'classification_error_evaluator': 0.125}
# Test with Pass 0, Cost 0.326659, {'classification_error_evaluator': 0.09470000118017197}

訓(xùn)練之后,檢查模型預(yù)測(cè)準(zhǔn)確度慕蔚,一般 softmax回歸模型的分類準(zhǔn)確率為約為 92.34%丐黄,多層感知器為97.66%,卷積神經(jīng)網(wǎng)絡(luò)可以達(dá)到 99.20%

參考資料

  1. paddle官方文檔
  2. 【深度學(xué)習(xí)系列】PaddlePaddle之手寫(xiě)數(shù)字識(shí)別
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孔飒,一起剝皮案震驚了整個(gè)濱河市灌闺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坏瞄,老刑警劉巖桂对,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸠匀,居然都是意外死亡接校,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門狮崩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鹿寻,你說(shuō)我怎么就攤上這事睦柴。” “怎么了毡熏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵坦敌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狱窘,這世上最難降的妖魔是什么杜顺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮蘸炸,結(jié)果婚禮上躬络,老公的妹妹穿的比我還像新娘。我一直安慰自己搭儒,他們只是感情好穷当,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著淹禾,像睡著了一般馁菜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铃岔,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天汪疮,我揣著相機(jī)與錄音,去河邊找鬼毁习。 笑死智嚷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜓洪。 我是一名探鬼主播纤勒,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隆檀!你這毒婦竟也來(lái)了摇天?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恐仑,失蹤者是張志新(化名)和其女友劉穎泉坐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體裳仆,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腕让,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歧斟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯丸。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖静袖,靈堂內(nèi)的尸體忽然破棺而出觉鼻,到底是詐尸還是另有隱情,我是刑警寧澤队橙,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布坠陈,位于F島的核電站萨惑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仇矾。R本人自食惡果不足惜庸蔼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贮匕。 院中可真熱鬧姐仅,春花似錦、人聲如沸粗合。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隙疚。三九已至壤追,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間供屉,已是汗流浹背行冰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伶丐,地道東北人悼做。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哗魂,于是被迫代替她去往敵國(guó)和親肛走。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容