日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

使用paddlepaddle進行手寫數字識別

作者:修煉之路 更新時間: 2022-02-13 編程語言

導讀

MNIST手寫數字數據集作為深度學習入門的數據集是我們經常都會使用到的,包含了0~9共10個數字類別的圖片,每張圖片的大小為28X28,一共包含了60000張訓練集圖片和10000張測試集圖片。

使用PaddlePadlle進行手寫數字識別

  • 導包
import paddle
from paddle.vision.transforms import Normalize
  • 加載MNIST數據集
#數據的歸一化處理
transform = Normalize(mean=[127.5],std=[127.5],data_format="CHW")

#加載MNIST的訓練數據集
train_mnist_dataset = paddle.vision.datasets.MNIST(mode="train",transform=transform)
#加載MNIST的測試數據集
test_mnist_dataset = paddle.vision.datasets.MNIST(mode="test",transform=transform)
  • 展示手寫數字的圖片
import numpy as np
import matplotlib.pyplot as plt

#獲取MNIST數據的圖片和對應的標簽
mnist_image,mnist_label = train_mnist_dataset[0][0],train_mnist_dataset[0][1]
#調整MNIST圖片的大小
mnist_image = mnist_image.reshape((28,28))
plt.figure(figsize=(2,2))
plt.imshow(mnist_image,cmap=plt.cm.binary)

在這里插入圖片描述

  • 使用paddlepaddle定義神經網絡模型

這里我們先使用一個比較簡單的3層感知機來構建一個模型,第一層全連接層的輸出是256,第二層全連接層的輸出是128,第三層全連接層的輸出是10,正好對應10個不同的數字類別

class PerceptronMNIST(paddle.nn.Layer):
    def __init__(self,in_features,classes_num):
        super(PerceptronMNIST,self).__init__()
        #將輸出數據的shape由(-1,1,28,28)變為(-1,784)
        self.flatten = paddle.nn.Flatten()
        #感知機的第一層全連接層
        self.fc1 = paddle.nn.Linear(in_features=in_features,out_features=256)
        #激活函數
        self.relu1 = paddle.nn.ReLU()
        #感知機的第二層全連接層
        self.fc2 = paddle.nn.Linear(in_features=256,out_features=128)
        #激活函數
        self.relu2 = paddle.nn.ReLU()
        #感知機的第三層全連接層
        self.fc3 = paddle.nn.Linear(in_features=128,out_features=classes_num)
    
    def forward(self,x):

        x = self.flatten(x)
        x = self.fc1(x)
        x = self.relu1(x)
        x = self.fc2(x)
        x = self.relu2(x)
        x = self.fc3(x)

        return x
  • 打印網絡模型的結構
    #使用PaddlePaddle封裝模型
    model = paddle.Model(PerceptronMNIST(in_features=28*28,classes_num=10))
    #輸出網絡的結構
    model.summary((-1,1,28,28))

在這里插入圖片描述

  • 定義優化算法和Loss
#配置模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),#使用Adam優化算法
              paddle.nn.CrossEntropyLoss(),#使用CrossEntropyLoss作為損失函數
              paddle.metric.Accuracy())#使用Accuracy計算精度
  • 訓練模型
model.fit(train_mnist_dataset,#設置訓練數據
          epochs=10,          #定義訓練的epochs
          batch_size=128,     #設置batch_size
          verbose=1)          #設置日志的輸出格式

在這里插入圖片描述

  • 評估模型
model.evaluate(test_mnist_dataset,verbose=1)

在這里插入圖片描述

  • 模型預測
results = model.predict(test_mnist_dataset)
#獲取概率最大的label
pred_label = np.argsort(results)
print("圖片的預測標簽為:{}".format(pred_label[0][0][-1][0]))

原文鏈接:https://blog.csdn.net/sinat_29957455/article/details/122849841

欄目分類
最近更新