日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于神经网络的图像识别

發(fā)布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于神经网络的图像识别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

一、目的

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ù)兩部分,分別包含 6000010000 條手寫數(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)簽就是[000

0001000]

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ù)三

?

部分,分別包含 500001000010000 條手寫數(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ù)可以取三個值中的一個,分別是 trainvalideval

選擇的模式不同,讀取的數(shù)據(jù)集也不同,為了兼容后面的代碼,讀取后的變量都

?

相同,都是 imgslabels;

在數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。