基于PaddlePaddle的LeNet神經網絡MNIST數據集分類

      網友投稿 1008 2025-04-04

      文章目錄


      1.前言

      2.算法設計

      2.1任務流程

      2.2 LeNet簡述

      2.3 算法設計

      2.3.1 引入相關的包

      2.3.2 讀取數據集

      2.3.3 歸一化數據集

      2.3.4 取出一個數據瞅瞅

      2.3.5 定義LeNet網絡

      2.3.6 封裝模型并配置

      2.3.6.1 Adam優化器

      2.3.6.2 損失函數

      2.3.6.3 精確度

      2.3.7 訓練模型

      2.3.8 使用模型預測

      2.4 不同參數對預測精度的影響

      2.4.1 重新封裝模型

      2.4.2 學習率對預測精度的影響

      2.4.3 訓練的輪數對預測精度的影響

      2.4.4 數據的批大小對預測精度的影響

      3. 總結

      1.前言

      MNIST是一個手寫體數字的圖片數據集,MNIST是深度學習領域標準、易用的成熟數據集,該數據集來由美國國家標準與技術研究所(National Institute of Standards and Technology (NIST))發起整理,一共統計了來自250個不同的人手寫數字圖片,其中50%是高中生,50%來自人口普查局的工作人員。該數據集的收集目的是希望通過算法,實現對手寫數字的識別。

      1998年,Yan LeCun 等人發表了論文《Gradient-Based LearningApplied to Document Recognition》,首次提出了LeNet-5 網絡,利用上述數據集實現了手寫字體的識別。

      Mnist數據集官網:http://yann.lecun.com/exdb/mnist/

      在上述文件中,訓練集一共包含了 60,000 張圖像和標簽,而測試集一共包含了 10,000 張圖像和標簽。測試集中前5000個來自最初NIST項目的訓練集,后5000個來自最初NIST項目的測試集。前5000個比后5000個要規整,這是因為前5000個數據來自于美國人口普查局的員工,而后5000個來自于大學生。

      如今在深度學習領域,卷積神經網絡占據了至關重要的地位,從最早LeCun提出的簡單LeNet,到如今ImageNet大賽上的優勝模型VGGNet、GoogLeNet、ResNet等,人們在圖像分類領域,利用卷積神經網絡得到了一系列驚人的結果。

      2.算法設計

      2.1任務流程

      本次使用飛槳框架來完成手寫數字識別模型任務,其預測模型任務的流程為:

      數據處理:從本地或者URL讀取數據,并完成預處理操作(如數據校驗,格式轉化等),保證模型可讀取。

      模型設計:網絡結構設計,相當于模型的假設空間,即模型能夠表達的關系集合。

      訓練配置:設定模型采用帶尋解算法,即優化器,并指定計算資源。

      訓練過程:循環調用訓練過程,每輪都包括前向計算,損失函數(優化目標)和反向傳播三個步驟。

      模型保存:將訓練好的模型保存,模型預測時調用。

      2.2 LeNet簡述

      LeNet是一種用于手寫體字符識別的非常高效的卷積神經網絡。

      出自論文《Gradient-Based Learning Applied to Document Recognition》

      由深度學習三巨頭之一的Yan LeCun提出,他同時也是卷積神經網絡CNN之父

      LeNet主要用來進行手寫字符的識別與分類,并在美國的銀行中投入了使用。

      其實現確立了CNN的結構,現在神經網絡中的許多內容在LeNet的網絡結構中都能看到。

      2.3 算法設計

      # 打印飛槳版本 import paddle print(paddle.__version__)

      1

      2

      3

      2.3.1 引入相關的包

      from paddle.vision.transforms import Compose, Normalize import numpy as np import matplotlib.pyplot as plt import paddle import paddle.nn.functional as F from paddle.metric import Accuracy

      1

      2

      3

      4

      5

      6

      2.3.2 讀取數據集

      手寫數字的MNIST數據集,包含60,000個用于訓練的示例和10,000個用于測試的示例。這些數字已經過尺寸標準化并位于圖像中心,圖像是固定大小(28x28像素),其值為0到1。

      飛槳提供了多個封裝好的數據集API,涵蓋計算機視覺、自然語言處理、推薦系統等多個領域,幫助開發者快速完成深度學習任務。

      如在手寫數字識別任務中,通過paddle.vision.datasets.MNIST可以直接獲取處理好的MNIST訓練集、測試集.

      飛槳API支持如下常見的學術數據集:

      mnist

      cifar

      Conll05

      Imdb

      Imikolov

      Movielens

      Sentiment

      uci_housing

      wmt14

      wmt16

      通過paddle.vision.datasets.MNIST API設置數據讀取器,代碼如下所示。

      train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform) test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)

      1

      2

      2.3.3 歸一化數據集

      使用paddle.vision.transforms.Normalize 對圖像進行歸一化。

      圖像歸一化處理支持兩種方式:

      用統一的均值和標準差值對圖像的每個通道進行歸一化處理;

      對每個通道指定不同的均值和標準差值進行歸一化處理。

      計算過程:output[channel] = (input[channel] - mean[channel]) / std[channel]

      以下代碼實現了數據集歸一化的過程。

      transform = Compose([Normalize(mean=[127.5], std=[127.5], data_format='CHW')])

      1

      2

      3

      mean ()中填入用于每個通道歸一化的均值。

      std () 用于每個通道歸一化的標準差值。

      to_rgb (bool, optional) - 是否轉換為 rgb 的格式。默認值:False。

      transform = Compose([Normalize(mean=[127.5], std=[127.5], data_format='CHW')]) # 使用transform對數據集做歸一化 print('download training data and load training data') train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform) test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform) print('load finished')

      1

      2

      3

      4

      5

      基于PaddlePaddle的LeNet神經網絡MNIST數據集分類

      6

      7

      8

      9

      2.3.4 取出一個數據瞅瞅

      train_data0, train_label_0 = train_dataset[0][0],train_dataset[0][1] train_data0 = train_data0.reshape([28,28]) plt.figure(figsize=(2,2)) plt.imshow(train_data0, cmap=plt.cm.binary) print('train_data0 label is: ' + str(train_label_0)) print("圖像數據形狀和對應數據為:", train_data0.shape) print("圖像標簽形狀和對應數據為:", train_label_0.shape, train_label_0) print("\n打印第一個batch的第一個圖像,對應標簽數字為{}".format(train_label_0)) #print(train_data0)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      2.3.5 定義LeNet網絡

      paddle.nn 文檔目錄下包含飛槳框架支持的神經網絡層和相關函數的相關API

      本次使用paddle.nn下的Conv2D、MaxPool2D、Linear等完成LeNet的構建。

      class LeNet(paddle.nn.Layer): def __init__(self): super(LeNet, self).__init__() # 定義卷積層,輸出特征通道in_channels設置為1,out_channels設置為6,卷積核的大小kernel_size為5,卷積步長stride=1,padding=2 self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2) # 定義池化層,池化核的大小kernel_size為2,池化步長為2 self.max_pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) # 定義卷積層,輸出特征通道in_channels設置為6,out_channels設置為16,卷積核的大小kernel_size為5,卷積步長stride=1 self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=5, stride=1) # 定義池化層,池化核的大小kernel_size為2,池化步長為2 self.max_pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) # 定義一層全連接層,輸入維度16*5*5,輸出維度是120 self.linear1 = paddle.nn.Linear(in_features=16*5*5, out_features=120) # 定義一層全連接層,輸入維度120,輸出維度是84 self.linear2 = paddle.nn.Linear(in_features=120, out_features=84) # 定義一層全連接層,輸入維度84,輸出維度是10 self.linear3 = paddle.nn.Linear(in_features=84, out_features=10) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.max_pool1(x) x = self.conv2(x) x = F.relu(x) x = self.max_pool2(x) x = paddle.flatten(x, start_axis=1,stop_axis=-1) x = self.linear1(x) x = F.relu(x) x = self.linear2(x) x = F.relu(x) x = self.linear3(x) return x

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      2.3.6 封裝模型并配置

      Adam優化器可以在paddle.optimizer.Adam中定義

      Adam優化器出自Adam論文的第二節,能夠利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。

      其參數更新的計算公式如下:

      論文鏈接:https://arxiv.org/abs/1412.6980

      在優化器中可以自定義學習率learning_rate (),用于參數更新的計算。可以是一個浮點型值或者一個_LRScheduler類,默認值為0.001。

      損失函數使用交叉熵損失函數CrossEntropyLoss(),計算輸入input和標簽label間的交叉熵損失 ,它結合了 LogSoftmax和NLLLoss 的OP計算,可用于訓練一個n類分類器。

      如果提供 weight 參數的話,它是一個 1-D 的tensor, 每個值對應每個類別的權重。

      該損失函數的數學計算公式如下:

      當 weight 不為 none 時,損失函數的數學計算公式為:

      使用 paddle.metric.Accuracy() 計算精確度。

      model = paddle.Model(LeNet()) # 用Model封裝模型 optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) # 配置模型 model.prepare( optim, paddle.nn.CrossEntropyLoss(), Accuracy() )

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      2.3.7 訓練模型

      使用model.fit進行模型訓練

      下面的代碼中可以定義epochs和batch_size等。

      Verbosre = 1表示使用進度條的方式打印日志。

      # 訓練模型 model.fit(train_dataset, epochs=2, batch_size=64, verbose=1 )

      1

      2

      3

      4

      5

      6

      7

      2.3.8 使用模型預測

      model.evaluate(test_dataset, batch_size=64, verbose=1)

      1

      2

      2.4 不同參數對預測精度的影響

      本次探究learning_rate,epochs,batch_size三個參數對預測精度的影響

      2.4.1 重新封裝模型

      重新封裝模型使得可以傳入參數learning_rate,epochs,batch_size

      def MLtest(learning_rate,epochs,batch_size): print("======start=========") print("this learningrate is--->",learning_rate) print("this epochs is--->",epochs) print("this batch_size is--->",batch_size) model = paddle.Model(LeNet()) # 用Model封裝模型 optim = paddle.optimizer.Adam(learning_rate=learning_rate, parameters=model.parameters()) # 配置模型 model.prepare( optim, paddle.nn.CrossEntropyLoss(), Accuracy() ) model.fit(train_dataset, epochs=epochs, batch_size=batch_size, verbose=1 ) acc = model.evaluate(test_dataset, batch_size=64, verbose=1) accuracy.append(acc['acc']) print(acc['acc']) print("=======end==========")

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      2.4.2 學習率對預測精度的影響

      learning_rate=[x*0.001 for x in range(1,20)] accuracy = [] for i in learning_rate: MLtest(i,epochs=2,batch_size=64)

      1

      2

      3

      4

      在以上代碼中,設定epochs為2,batch_size為64

      learning_rate的值我們用列表生成式來生成

      learning_rate=[x*0.001 for x in range(1,20)] print(learning_rate)

      1

      2

      learning_rate=[x*0.001 for x in range(1,20)] print(learning_rate)

      1

      2

      # 別把epochs設置太大,要不然有你跑的 learning_rate=[x*0.001 for x in range(1,20)] accuracy = [] for i in learning_rate: MLtest(i,epochs=2,batch_size=64) plt.plot(learning_rate,accuracy) plt.xlabel('learning_rate') plt.ylabel('accuracy') plt.title('Influence of learning rate on prediction accuracy') plt.show()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      2.4.3 訓練的輪數對預測精度的影響

      epochs = [x for x in range(1,30) ] accuracy = [] for i in epochs: MLtest(learning_rate=0.001,epochs=i,batch_size=64)

      1

      2

      3

      4

      在以上代碼中,設定learning_rate為0.001,batch_size為64,epochs的值我們用列表生成式來生成

      epochs = [x for x in range(1,30) ]

      1

      【警告!警告!警告!】

      這一部分測試代碼的運行時間應該是最長的

      請務必開啟至尊算力

      同時做好打了好幾局王者榮耀還沒運行完的準備

      epochs = [x for x in range(1,30) ] print(epochs)

      1

      2

      epochs = [x for x in range(1,30) ] accuracy = [] for i in epochs: MLtest(learning_rate=0.001,epochs=i,batch_size=64) plt.plot(epochs,accuracy) plt.xlabel('epochs') plt.ylabel('accuracy') plt.title('Influence of epochs on prediction accuracy') plt.show()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      2.4.4 數據的批大小對預測精度的影響

      batch_size = [x for x in range(50,100)] accuracy = [] for i in batch_size: MLtest(learning_rate=0.001,epochs=2,batch_size=i)

      1

      2

      3

      4

      在以上代碼中,設定learning_rate為0.001,epochs為2,batch_size的值我們用列表生成式來生成

      batch_size = [x for x in range(50,100)]

      1

      batch_size = [x for x in range(50,100)] accuracy = [] for i in batch_size: MLtest(learning_rate=0.001,epochs=2,batch_size=i) plt.plot(batch_size,accuracy) plt.xlabel('batch_size') plt.ylabel('accuracy') plt.title('Influence of batch_size on prediction accuracy') plt.show()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      3. 總結

      本次探究learning_rate,epochs,batch_size三個參數對預測精度的影響。

      通過運行的結果可見,參數的調整是人工智能模型訓練過程中較為重要的一個部分。

      好的參數能夠大大減少模型運行的速度,也能帶來較高的精確率。

      神經網絡

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎么讓工具欄固定顯示(word工具欄固定顯示)
      下一篇:怎樣保護工作薄
      相關文章
      亚洲精品理论电影在线观看| 亚洲国产AV无码一区二区三区| 亚洲av午夜电影在线观看| 色偷偷亚洲女人天堂观看欧| 亚洲最大成人网色香蕉| 亚洲高清免费在线观看| 亚洲蜜芽在线精品一区| 亚洲视频一区在线播放| 亚洲精品在线观看视频| 亚洲自偷自偷精品| 亚洲性色高清完整版在线观看| 亚洲精彩视频在线观看| 亚洲日本香蕉视频观看视频| 亚洲精品国产肉丝袜久久| 亚洲无限乱码一二三四区| 亚洲大片免费观看| 97se亚洲国产综合自在线| 亚洲а∨天堂久久精品9966| 亚洲精品无播放器在线播放| 亚洲AV色欲色欲WWW| 亚洲AV无码国产一区二区三区| 色偷偷噜噜噜亚洲男人| 日韩精品亚洲专区在线观看| 亚洲欧洲国产成人综合在线观看| 国产亚洲精品精品国产亚洲综合| 亚洲色偷拍另类无码专区| 亚洲精品高清国产一线久久| 久久久久无码精品亚洲日韩 | 国产产在线精品亚洲AAVV| 国产综合激情在线亚洲第一页| 亚洲精品无码久久不卡| 国产亚洲AV夜间福利香蕉149| 久久亚洲国产中v天仙www | 久久国产精品亚洲综合 | 久久精品国产亚洲AV嫖农村妇女| 亚洲成人网在线观看| 国产亚洲精品bv在线观看| 久久精品熟女亚洲av麻豆| 亚洲日韩国产精品乱| 亚洲国产精品高清久久久| 亚洲狠狠ady亚洲精品大秀|