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