基于神经网络的图像识别
?
一、目的
1. 了解深度學(xué)習(xí)的基本原理;
2. 能夠使用 PaddleHub 深度學(xué)習(xí)開源工具進(jìn)行圖像識別;
3. 能夠使用 PaddlePaddle 訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型;
4. 能夠使用 Paddle 完成手寫實(shí)驗(yàn).
5. 能夠使用 keras 訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。
二、環(huán)境配置:
? Anaconda
? PaddlePaddle (PaddlePaddle-gpu)
? PaddleHub
? Tensorflow2.0.0
? Keras2.3.1
? Pycharm
4.1 Tensorflow 簡介
TensorFlow 是 Google 開發(fā)的一款神經(jīng)網(wǎng)絡(luò)的 Python 外部的結(jié)構(gòu)包,也是一個
采用數(shù)據(jù)流圖來進(jìn)行數(shù)值計算的開源軟件庫.TensorFlow 讓我們可以先繪制計算
結(jié)構(gòu)圖,也可以稱是一系列可人機(jī)交互的計算操作,然后把編輯好的Python文件轉(zhuǎn)
換成更高效的 C++,并在后端進(jìn)行計算。TensorFlow 無可厚非地能被認(rèn)定為神經(jīng)
網(wǎng)絡(luò)中最好用的庫之一。它擅長的任務(wù)就是訓(xùn)練深度神經(jīng)網(wǎng)絡(luò).通過使用
?
TensorFlow 我們就可以快速的入門神經(jīng)網(wǎng)絡(luò),大大降低了深度學(xué)習(xí)(也就是深度
神經(jīng)網(wǎng)絡(luò))的開發(fā)成本和開發(fā)難度。TensorFlow 的開源性,讓所有人都能使用
并且維護(hù),鞏固它。使它能迅速更新,提升。
因?yàn)?/span> TensorFlow 是采用數(shù)據(jù)流圖(data flow graphs)來計算,所以首先我們
得創(chuàng)建一個數(shù)據(jù)流流圖,然后再將我們的數(shù)據(jù)(數(shù)據(jù)以張量(tensor)的形式存在)
放在數(shù)據(jù)流圖中計算。節(jié)點(diǎn)(Nodes)在圖中表示數(shù)學(xué)操作,圖中的線(edges)則
表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。訓(xùn)練模型時 tensor 會不
斷的從數(shù)據(jù)流圖中的一個節(jié)點(diǎn) flow 到另一節(jié)點(diǎn),這就是 TensorFlow 名字的由來。
Tensor 張量意義:張量有很多種,零階張量為純量或者標(biāo)量,一階張量為向
量,二階張量為矩陣,以此類推。
?
4.2 Keras 簡介
4.2.1 Keras 簡單介紹
Keras 是一個開放源碼的高級深度學(xué)習(xí)程序庫,是一個用 Python 編寫的高級
神經(jīng)網(wǎng)絡(luò) API,能夠運(yùn)行在 TensorFlow 或 Theano 之上。其主要作者和維護(hù)者是
Google 公司的工程師,以 MIT 開放源碼方式授權(quán)。Keras 使用最少的程序代碼、
花費(fèi)最少的時間就可以建立深度學(xué)習(xí)模型,進(jìn)行訓(xùn)練、評估準(zhǔn)確率,并進(jìn)行預(yù)測。
相對來說,使用 TensorFlow 這樣低級的鏈接庫雖然可以完全控制各種深度學(xué)習(xí)
模型的細(xì)節(jié),但是需要編寫更多的程序代碼,花費(fèi)更多時間進(jìn)行開發(fā)。
?
Keras 的開發(fā)重點(diǎn)是支持快速的實(shí)驗(yàn),能夠把你的 idea 迅速轉(zhuǎn)換為結(jié)果。
?
4.2.2 為什么選擇 Keras
1.Keras 被工業(yè)界和學(xué)術(shù)界廣泛采用;
2.Keras 模型可以輕松部署在更廣泛的平臺;
3.Keras 支持多個后端引擎;
4.Keras 擁有強(qiáng)大的多 GPU 和分布式訓(xùn)練支持;
5.Keras 的發(fā)展得到深度學(xué)習(xí)生態(tài)系統(tǒng)中的關(guān)鍵公司的支持。
4.3 Tensorflow 和 Keras 的安裝
在配置好 anaconda 環(huán)境,可以直接使用 pip 的情況下,這里注意激活了虛擬
環(huán)境。使用 pip 下載 TensorFlow2.0.0 庫和 Keras2.3.1 庫。
4.3.1 Tensorflow 的安裝
?
?
?
4.3.2 Keras 的安裝
?
?
?
?
4.3.3 Tensorflow 和 keras 的安裝測試
① 點(diǎn)擊 開始,選擇 運(yùn)行 (也可以快捷鍵 win+R),進(jìn)入 cmd
?
?
?
或者進(jìn)入 anaconda prompt,開始菜單進(jìn)入,選擇。
?
?
?
② 激活虛擬環(huán)境 paddle37
?
輸入命令:activate paddle37
③ 進(jìn)入 python 環(huán)境
?
④ 導(dǎo)入 keras 命令:import keras
?
出現(xiàn)如圖所示,表示 keras 安裝運(yùn)行成功。
?
利用 Keras 進(jìn)行一個程序的測試
使用 Keras 運(yùn)行一個簡單例子,用來對 IMDB 的正負(fù)電影評論進(jìn)行分類。
import keras
from keras import models
from keras import layers
from keras.datasets import imdb
import numpy as np
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
def vectorize_sequences(sequences, dimension=10000):
# Create an all-zero matrix of shape (len(sequences), dimension)
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1. # set specific indices of results[i] to 1s
return results
# Our vectorized training data
x_train = vectorize_sequences(train_data)
# Our vectorized test data
x_test = vectorize_sequences(test_data)
# Our vectorized labels
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
?
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])
model.fit(x_train, y_train, epochs=4, batch_size=512)
result = model.evaluate(x_test, y_test)
print(result)
結(jié)果如下:
?
本文介紹的 Keras 的 CPU 版本的安裝,推薦大家以后盡可能使用 GPU 版本,提高運(yùn)算速度。
?跑完本代碼發(fā)現(xiàn),CPU 版本下某些模型的訓(xùn)練時間還是比較長的。例如使
用 VGG 預(yù)訓(xùn)練模型,對 Kaggle 貓狗分類問題進(jìn)行訓(xùn)練,并微調(diào) VGG 頂層
參數(shù),整個訓(xùn)練時間達(dá)到了 5 個小時左右。
?如果安裝 GPU 版本,需要額外安裝 CUDA Toolkit + cuDNN。需要特別注
意的是 CUDA+cuDNN 的版本。因?yàn)槊總€人的 GPU 顯卡型號和安裝版本不盡
相同,所以本文不再贅述。
沒有 GPU,本代碼基本也能跑得通,就是大型模型的訓(xùn)練速度比較慢。
?
2利用 Keras 實(shí)現(xiàn) CNN 實(shí)現(xiàn)手寫數(shù)字識別
4.5.1 加載 keras 與“手寫數(shù)字識別”實(shí)驗(yàn)相關(guān)的類庫。
?
4.5.2 加載數(shù)據(jù)集
?
?
本實(shí)驗(yàn)使用的 mnist 數(shù)據(jù)集可以使用 Keras 直接加載。文件內(nèi)容包括:訓(xùn)練數(shù)
據(jù)、測試數(shù)據(jù)兩部分,分別包含 60000、10000 條手寫數(shù)字?jǐn)?shù)據(jù),每個樣本都是
28*28 像素的。
4.5.3 數(shù)據(jù)預(yù)處理
?
?
使用 keras 必須聲明輸入圖像深度的尺寸,例如,具有所有 3 個 RGB 通道
的全色圖像的深度為 3。本實(shí)驗(yàn)中,我們將深度定為 1,將數(shù)據(jù)集從形狀
(n,rows,cols)轉(zhuǎn)換為(n,rows,cols,channels)。并將數(shù)據(jù)的大小除以 255 進(jìn)行歸
一化。進(jìn)行歸一化的原因:在不同的評價指標(biāo)中,量綱單位往往不同,變化區(qū)間
?
處于不同的數(shù)量級,若不進(jìn)行歸一化,會導(dǎo)致某些指標(biāo)被忽視,從而影響到數(shù)據(jù)
分析的結(jié)果。歸一化本身就是把需要的數(shù)據(jù)經(jīng)過一定的處理限制在一定的范圍
內(nèi)。np_utils.to_categorical 是將標(biāo)簽轉(zhuǎn)換為熱值碼,我們需要將 0-9 共十個數(shù)字
標(biāo)簽轉(zhuǎn)化成 onehot 標(biāo)簽,例如:數(shù)字標(biāo)簽“6”轉(zhuǎn)化為 onehot 標(biāo)簽就是[0,0,0,
0,0,0,1,0,0,0]。
4.5.4 構(gòu)建網(wǎng)絡(luò)
?
?
?
卷積神經(jīng)網(wǎng)絡(luò)由多個卷積層和池化層組成,如下所示。卷積層負(fù)責(zé)對輸入進(jìn)
行掃描以生成更抽象的特征表示,池化層對這些特征表示進(jìn)行過濾,保留最關(guān)鍵
的特征信息。
?
2. 編譯、訓(xùn)練、評估、保存模型
?
編譯模型時,聲明損失函數(shù)采用交叉熵和優(yōu)化器(SGD,Adam 等),接著,
傳入訓(xùn)練集數(shù)據(jù)進(jìn)行訓(xùn)練,batch 大小設(shè)置為 32,訓(xùn)練周期設(shè)為 3,接下來,傳
入測試集數(shù)據(jù)對模型進(jìn)行評估,最后將訓(xùn)練好的模型保存為 h5 格式的模型文件。
3. 訓(xùn)練結(jié)果 模型訓(xùn)練結(jié)果:
?
模型評估結(jié)果:
?
?
?3 利用 Paddle 實(shí)現(xiàn)手寫識別
?
4.6.1 神經(jīng)網(wǎng)絡(luò)
神經(jīng)網(wǎng)絡(luò)(Neural Network) 是一種計算機(jī)模型或者數(shù)學(xué)模型,是存在于計算
機(jī)的神經(jīng)系統(tǒng),由大量的神經(jīng)元相連接并進(jìn)行計算,在外界信息的基礎(chǔ)上,改變
內(nèi)部的結(jié)構(gòu),常用來對輸入和輸出之間復(fù)雜的關(guān)系進(jìn)行建模。
下圖就是一個神經(jīng)網(wǎng)絡(luò)系統(tǒng),它有很多層組成。輸入層(Input Layer)負(fù)責(zé)
接受信息。輸出層(Output Layer)是計算機(jī)對這個輸入信息的判斷結(jié)果。中間
的隱藏層(Hidden Layer)是對輸入信息的傳遞和加工處理。
?
4.6.2 如何訓(xùn)練神經(jīng)網(wǎng)絡(luò)
每個神經(jīng)元都有屬于它的激活函數(shù)(activation function),用這些函數(shù)給計
首先需要很多數(shù)據(jù)。比如它要判斷一張圖片是不是貓,就要輸入上千萬張帶
有標(biāo)簽的貓貓狗狗的圖片,然后再訓(xùn)練上千萬次。其次,錯誤的結(jié)果也可以幫助
神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,經(jīng)網(wǎng)絡(luò)將會對比正確答案和錯誤答案之間的區(qū)別,然后把這
個區(qū)別反向的傳遞回去,對每個相應(yīng)的神經(jīng)元向爭取的方向進(jìn)行一點(diǎn)點(diǎn)的改變。
那么在下一次訓(xùn)練的時候就可以用已經(jīng)改進(jìn)過的神經(jīng)元去得到稍微準(zhǔn)確的結(jié)構(gòu)。
每個神經(jīng)元都有屬于它的激活函數(shù)(activation function),用這些函數(shù)給計算
機(jī)一個刺激行為。在第一次給計算機(jī)看貓的圖片時,只有部分的神經(jīng)元被激活,
被激活的神經(jīng)元所傳遞的信息是對輸出結(jié)果最有價值的信息。如果輸出的結(jié)果被
判定為是狗,也就是說是錯誤的,那么就會修改神經(jīng)元,一些容易被激活的神經(jīng)
元會變得遲鈍,另外一些神經(jīng)元會變得敏感,這樣一次次的訓(xùn)練下去,所有神經(jīng)
元的參數(shù)都在被改變,它們變得對重要的信息越來越敏感。
?
?
4.6.3 梯度下降(Gradient Descent)
?
?
運(yùn)用神經(jīng)網(wǎng)絡(luò)的時候,必然會用到誤差方程(Cost Function):
Cost=(predicted-real)^2=(Wx-y)^2,
用來計算預(yù)測出來的值和我們實(shí)際的值的差別.梯度是當(dāng)前 Cost 的斜率,
Cost 誤差最小的地方就是 cost 曲線最低的地方,而當(dāng)前所知道的是自己所在位
置的一個下降方向,則朝向當(dāng)前方向繼續(xù)下降,直至梯度線“躺平”,此時就得到
了 Wx-y 參數(shù)的最理想值。
4.6.4 卷積神經(jīng)網(wǎng)絡(luò) CNN
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)是一類包含卷積計算
且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò),是深度學(xué)習(xí)的代表算法之一。卷積神經(jīng)網(wǎng)絡(luò)仿
造生物的視知覺(( visual perception)機(jī)制構(gòu)建,能夠進(jìn)行平移不變分類。對卷
積神經(jīng)網(wǎng)絡(luò)的研究始于二十世紀(jì) 80 至 90 年代,LeNet-5 是較早出現(xiàn)的卷積神經(jīng)
網(wǎng)絡(luò)。
加入采用全連接網(wǎng)絡(luò)進(jìn)行圖像分類:
?
① CNN 特點(diǎn)之一:局部卷積
可以把卷積想象成作用于矩陣的一個滑動窗口函數(shù)。滑動窗口又稱作卷積
核、濾波器或是特征檢測器。
對于給定的輸入圖像,輸出特征圖中每個像素實(shí)際上是輸入圖像中局部區(qū)域
中像素的加權(quán)平均,其權(quán)值由卷積核定義。
卷積具體實(shí)例:
?
?
② CNN 特點(diǎn)之二:多卷積核
為了充分提取特征,可以使用多個卷積核
每個卷積核都會對輸入圖像進(jìn)行卷積處理,生成另一幅圖像。不同卷積核生
成的不同圖像可以理解為是該輸入圖像的不同通道。
③ CNN 特點(diǎn)之三:池化處理
池化處理也叫作降采樣處理(down-pooling),是對不同位置的特征進(jìn)行聚合
統(tǒng)計。通常是取對應(yīng)位置的最大值(最大池化)、平均值平均池化)等。
池化的優(yōu)點(diǎn):1.降維 2.克服過擬合 3.在圖像識別領(lǐng)域,池化還能提供平移和
旋轉(zhuǎn)不變性。
④ CNN 特點(diǎn)之四:多層處理
?
?
一般而言,在圖像處理中,一層卷積及降采樣往往只學(xué)到了局部的特征。層
數(shù)越多,學(xué)到的特征越全局化。因此通過這樣的多層處理,低級的特征組合形成
更高級的特征表示。
4.6.5 MNIST 數(shù)據(jù)集
Mnist 數(shù)據(jù)集分為兩部分,分別含有 50000 張訓(xùn)練圖片和 10000 張測試圖片。
每一張圖片包含 28*28 個像素。Mnist 數(shù)據(jù)集把代表一張圖片的二維數(shù)據(jù)轉(zhuǎn)
開成一個向量,長度為 28*28=784。因此在 Mnist 的訓(xùn)練數(shù)據(jù)集中訓(xùn)練圖片是一
個形狀為[50000, 784]的張量,第一個維度數(shù)字用來索引圖片,第二個維度數(shù)字
用來索引每張圖片中的像素點(diǎn),圖片里的某個像素的強(qiáng)度值介于-1-1 之間。
4.6.6 步驟
① 在配置好 anaconda 環(huán)境,可以直接使用 pip 的情況下,使用 pip 下載
paddlepaddle 庫和paddlepaddle-hub 庫。
② 加載飛漿平臺與“手寫數(shù)字識別”實(shí)驗(yàn)相關(guān)的類庫。
③ 數(shù)據(jù)讀取與數(shù)據(jù)集劃分
本實(shí)驗(yàn)使用的mnist 數(shù)據(jù)集以json 格式存儲在本地。
在'./"目錄下讀取文件名稱為'mnist.json.gz'的 MINST 手寫數(shù)字識別數(shù)據(jù),文
件格式是壓縮后的 json 文件。文件內(nèi)容包括:訓(xùn)練數(shù)據(jù)、驗(yàn)證數(shù)據(jù)、測試數(shù)據(jù)三
?
部分,分別包含 50000、10000、10000 條手寫數(shù)字?jǐn)?shù)據(jù)和兩個元素列表。以訓(xùn)練
集數(shù)據(jù)為例,它為兩個元素的列表為[traim_imgs, train_labels]。
train_imgs:一個維度為[50000,784]的二維列表,包含 50000 張圖片。每張圖
片用一個長度為 784 的向量表示,內(nèi)容是 28*28 尺寸的像素灰度值(黑白圖片)。
train_labels:一個維度為[50000,]的列表,表示這些圖片對應(yīng)的分類標(biāo)簽,即
0-9 之間的一個數(shù)字。
接下來將數(shù)據(jù)讀取出來:
?
?
④ 定義數(shù)據(jù)讀取函數(shù)
飛槳提供分批次讀取數(shù)據(jù)函數(shù) paddle.batch,該接口是一個 reader 的裝飾器,
返回的 reader 將輸入的 reader 的數(shù)據(jù)打包,成指定的 batch_size 大小的批處理數(shù)據(jù)
(batched.data)。
在定義數(shù)據(jù)讀取函數(shù)中,我們需要做很多事情,包括但不限于:
打亂數(shù)據(jù),保證每輪訓(xùn)練讀取的數(shù)據(jù)順序不同。
數(shù)據(jù)類型轉(zhuǎn)換。
?
?
?
?
上面代碼中 mode 參數(shù)可以取三個值中的一個,分別是 train、valid、eval,
選擇的模式不同,讀取的數(shù)據(jù)集也不同,為了兼容后面的代碼,讀取后的變量都
?
相同,都是 imgs、labels;
在數(shù)據(jù)生成器中,只有在 mode 為 train 的情況下我們才考慮把讀取的數(shù)據(jù)打
亂;接下來是數(shù)據(jù)格式處理,目標(biāo)類型是 shape[1,28,28],1 表示灰度圖,數(shù)據(jù)類型
為 float32;通過 yield 關(guān)鍵字返回一個 batch 的數(shù)據(jù);在最后一個 index_list 中,如
果 imgs_list 長度不滿足一個 batch,這時 imgs_list 長度不為零,會直接跳出 for
循環(huán),被后面的 len(imgs_list)攔截,形成一個小的 mini-batch。
為機(jī)器校驗(yàn)代碼,如果數(shù)據(jù)集中的圖片數(shù)量和標(biāo)簽數(shù)量不等,說明數(shù)據(jù)邏輯
存在問題。可以使用 assert 語句校驗(yàn)圖像數(shù)量和標(biāo)簽數(shù)據(jù)是否一致。
人工校驗(yàn)方法:首先打印數(shù)據(jù)輸出結(jié)果,觀察是否是設(shè)置的格式。再從訓(xùn)練
的結(jié)果驗(yàn)證數(shù)據(jù)處理和讀取的有效性。實(shí)現(xiàn)數(shù)據(jù)處理和加載函數(shù)后,我們可以調(diào)
用它讀取一次數(shù)據(jù),觀察數(shù)據(jù)的 shape 和類型是否與函數(shù)中設(shè)置的一致。
⑤ 定義模型結(jié)構(gòu)
?
?
?
?
卷積神經(jīng)網(wǎng)絡(luò)由多個卷積層和池化層組成,如下所示。卷積層負(fù)責(zé)對輸入進(jìn)
行掃描以生成更抽象的特征表示,池化層對這些特征表示進(jìn)行過濾,保留最關(guān)鍵
的特征信息。
線性模型的局限性:只通過線性變換,任意層的全連接神經(jīng)網(wǎng)絡(luò)和單層神經(jīng)
網(wǎng)絡(luò)的表達(dá)能力并沒有任何區(qū)別,線性模型能解決的問題是有限的。激活函數(shù)的
目的是去線性化,如果將每一個神經(jīng)元的輸出通過一個非線性函數(shù),那么整個神
經(jīng)網(wǎng)絡(luò)的模型也就不再是線性的了,這個非線性函數(shù)就是激活函數(shù)。
評價某個激活函數(shù)是否有用時,需要考慮的因素有:
1)該函數(shù)應(yīng)是單調(diào)的, 這樣輸出便會隨著輸入的增長而增長,從而使利用梯度
下降法尋找局部極值點(diǎn)成為可能.
2)該函數(shù)應(yīng)是可微分的,以保證該函數(shù)定義域內(nèi)的任意一點(diǎn)上導(dǎo)數(shù)都存在,從
而使得梯度下降法能夠正常使用來自這類激活函數(shù)的輸出。
?
relu 函數(shù)
?
relu 函數(shù)是個非常常用的激活函數(shù),其公式為:f(x) = max(0, x),即,大于 0
的為其本身,否則為 0
.
Tanh 函數(shù)
其公式為:y =(exp(x)-exp(-x))/(exp(x)+exp(-x)) = (1 - exp(-2x)) / (1 +
exp(-2x)),導(dǎo)數(shù):df(x)/dx=1-f(x)^2
在具體的例子中,如卷積神經(jīng)網(wǎng)絡(luò) Convolutional neural networks 的卷積層
中,一般使用的激勵函數(shù)是 relu.在循環(huán)神經(jīng)網(wǎng)絡(luò)中 recurrent neural networks,一般
使用的是 tanh 或者是 relu。
Softmax 函數(shù)
Softmax 函數(shù),又稱歸一指數(shù)函數(shù),多用于分類過程,它將多個神經(jīng)元的輸出,
映射到(0.1)區(qū)間內(nèi)。F.softmax 的作用是,輸出每一個預(yù)測標(biāo)簽(0-9)的的概
率,并且十個預(yù)測標(biāo)簽的概率之和為 1。
?
⑥ 訓(xùn)練模型
?
?
?
通過 paddle.set_device API,設(shè)置在 GPU 上訓(xùn)練還是 CPU 上訓(xùn)練。參數(shù)
device (str):此參數(shù)確定特定的運(yùn)行設(shè)備,可以是 cpu、 gpu:x 或者是 xpu:x。其
中,x 是 GPU 或 XPU 的編號。當(dāng) device 是 cpu 時,程序在 CPU 上運(yùn)行;當(dāng) device
是 gpu:x 時,程序在 GPU 上運(yùn)行。
opt = paddle.optimizer.SGD(learning_rate=0.01,
weight_decay=paddle.regularizer.L2Decay(coeff=0.1),
parameters=model.parameters())
在深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型中,通常使用標(biāo)準(zhǔn)的隨機(jī)梯度下降算法 SGD 更新
參數(shù),學(xué)習(xí)率 learning_rate 代表參數(shù)更新幅度的大小,即步長。當(dāng)學(xué)習(xí)率最優(yōu)
時,模型的有效容量最大,最終能達(dá)到的效果最好。學(xué)習(xí)率和深度學(xué)習(xí)任務(wù)類型
有關(guān),合適的學(xué)習(xí)率往往需要大量的實(shí)驗(yàn)和調(diào)參經(jīng)驗(yàn)。探索學(xué)習(xí)率最優(yōu)值時需要
注意如下兩點(diǎn):
學(xué)習(xí)率不是越小越好。學(xué)習(xí)率越小,損失函數(shù)的變化速度越慢,意味著需要
花費(fèi)更長的時間進(jìn)行收斂。
學(xué)習(xí)率不是越大越好。只根據(jù)總樣本集中的一個批次計算梯度,抽樣誤差會
導(dǎo)致計算出的梯度不是全局最優(yōu)的方向,且存在波動。在接近最優(yōu)解時,過大的
學(xué)習(xí)率會導(dǎo)致參數(shù)在最優(yōu)解附近震蕩,損失難以收斂。
加入正則化項(xiàng),避免模型過擬合。
過擬合現(xiàn)象:對于樣本量有限、但需要使用強(qiáng)大模型的復(fù)雜任務(wù),模型很容
易出現(xiàn)過擬合的表現(xiàn),即在訓(xùn)練集上的損失小,在驗(yàn)證集或測試集上的損失較大。
過擬合原因:模型過于敏感,而訓(xùn)練數(shù)據(jù)量太少或其中的噪音太多。
正則化項(xiàng):為了防止模型過擬合,在沒有擴(kuò)充樣本量的可能下,只能降低模
型的復(fù)雜度,可以通過限制參數(shù)的數(shù)量或可能取值(參數(shù)值盡量小)實(shí)現(xiàn)。在模
型的優(yōu)化目標(biāo)(損失)中人為加入對參數(shù)規(guī)模的懲罰項(xiàng)。當(dāng)參數(shù)越多或取值越大
?
時,該懲罰項(xiàng)就越大。通過調(diào)整懲罰項(xiàng)的權(quán)重系數(shù),可以使模型在“盡量減少訓(xùn)
練損失”和“保持模型的泛化能力”之間取得平衡。
正則化項(xiàng)的存在,增加了模型在訓(xùn)練集上的損失。飛槳支持為所有參數(shù)加上
統(tǒng)一的正則化項(xiàng),也支持為特定的參數(shù)添加正則化項(xiàng)。前者的實(shí)現(xiàn)如下代碼所示,
僅在優(yōu)化器中設(shè)置weight_decay 參數(shù)即可實(shí)現(xiàn)。使用參數(shù)coeff 調(diào)節(jié)正則化項(xiàng)的
權(quán)重,權(quán)重越大時,對模型復(fù)雜度的懲罰越高。
cross_entropy()為計算交差熵函數(shù),常用于分類問題,神經(jīng)網(wǎng)絡(luò)的輸出層為
“輸出十個標(biāo)簽的概率”模式,因此,正確解標(biāo)簽對應(yīng)的輸出越大,交叉熵的值越
接近0;當(dāng)輸出為1 時,交叉熵誤差為0。反之,如果正確解標(biāo)簽對應(yīng)的輸出越
小,則交叉熵的值越大。
paddle.save(model.state_dict(), 'mnist_regul12.pdparams')為輸出參數(shù)模型函 數(shù),可以用于后續(xù)加載繼續(xù)訓(xùn)練。
⑦ 結(jié)果可視化
?
可視化分析:
訓(xùn)練模型時,經(jīng)常需要觀察模型的評價指標(biāo),分析模型的優(yōu)化過程,以確保
訓(xùn)練是有效的。可選用這兩種工具:Matplotlib 庫和VisualDL。在此處,僅展示
Matplotlib 的畫法。
Matplotlib 庫:Matplotlib 庫是 Python 中使用的最多的 2D 圖形繪圖庫,
它有一套完全仿照 MATLAB 的函數(shù)形式的繪圖接口,使用輕量級的 PLT 庫
(Matplotlib)作圖是非常簡單的。
VisualDL:如果期望使用更加專業(yè)的作圖工具,可以嘗試VisualDL,飛槳
可視化分析工具。VisualDL 能夠有效地展示飛槳在運(yùn)行過程中的計算圖、各種
指標(biāo)變化趨勢和數(shù)據(jù)信息。
?
使用 Matplotlib 庫繪制損失隨訓(xùn)練下降的曲線圖。將訓(xùn)練的批次編號作為 X
軸坐標(biāo),該批次的訓(xùn)練損失作為 Y 軸坐標(biāo)。訓(xùn)練開始前,聲明兩個列表變量存
儲對應(yīng)的批次編號(iters=[])和訓(xùn)練損失(losses=[]),隨著訓(xùn)練的進(jìn)行,將 iter 和
losses 兩個列表填滿。訓(xùn)練結(jié)束后,將兩份數(shù)據(jù)以參數(shù)形式導(dǎo)入 PLT 的橫縱坐標(biāo)。
最后,調(diào)用 plt.plot()函數(shù)即可完成作圖。
?
結(jié)果如下所示:
?
?
總結(jié)
以上是生活随笔為你收集整理的基于神经网络的图像识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python使用pytesseract进
- 下一篇: 图像识别入门概述