本系列將作為個(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%