国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)

這篇具有很好參考價(jià)值的文章主要介紹了CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

CNN結(jié)構(gòu)

CNN(卷積神經(jīng)網(wǎng)絡(luò))主要包括卷積層、池化層和全連接層。輸入數(shù)據(jù)經(jīng)過多個(gè)卷積層和池化層提取圖片信息后,最后經(jīng)過若干個(gè)全連接層獲得最終的輸出。
CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)CNN的實(shí)現(xiàn)主要包括以下步驟:

  1. 數(shù)據(jù)加載與預(yù)處理
  2. 模型搭建
  3. 定義損失函數(shù)、優(yōu)化器
  4. 模型訓(xùn)練
  5. 模型測(cè)試

以下基于Pytorch框架搭建一個(gè)CNN神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)手寫數(shù)字識(shí)別。

CNN實(shí)現(xiàn)

此處使用MNIST數(shù)據(jù)集,包含60000個(gè)訓(xùn)練樣本和10000個(gè)測(cè)試樣本。分為圖片和標(biāo)簽,每張圖片是一個(gè) 28 × 28 28 \times 28 28×28 的像素矩陣,標(biāo)簽是0~9一共10種數(shù)字。每個(gè)樣本的格式為[data, label]。

1. 導(dǎo)入相關(guān)庫

import numpy as np
import torch 
from torch import nn
from torchvision import datasets, transforms,utils
from PIL import Image
import matplotlib.pyplot as plt

2. 數(shù)據(jù)加載與預(yù)處理

# 定義超參數(shù)
batch_size = 128 # 每個(gè)批次(batch)的樣本數(shù)

# 對(duì)輸入的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理
# transforms.ToTensor() 將圖像數(shù)據(jù)轉(zhuǎn)換為 PyTorch 中的張量(tensor)格式,并將像素值縮放到 0-1 的范圍內(nèi)。
# 這是因?yàn)樯窠?jīng)網(wǎng)絡(luò)需要的輸入數(shù)據(jù)必須是張量格式,并且需要進(jìn)行歸一化處理,以提高模型的訓(xùn)練效果。
# transforms.Normalize(mean=[0.5],std=[0.5]) 將圖像像素值進(jìn)行標(biāo)準(zhǔn)化處理,使其均值為 0,標(biāo)準(zhǔn)差為 1。
# 輸入數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理可以提高模型的魯棒性和穩(wěn)定性,減少模型訓(xùn)練過程中的梯度爆炸和消失問題。
transform = transforms.Compose([transforms.ToTensor(),
                               transforms.Normalize(mean=[0.5],std=[0.5])])

# 加載MNIST數(shù)據(jù)集
train_dataset = torchvision.datasets.MNIST(root='./data', 
                                           train=True, 
                                           transform=transform, 
                                           download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', 
                                          train=False, 
                                          transform=transform, 
                                          download=True)
                                          
# 創(chuàng)建數(shù)據(jù)加載器(用于將數(shù)據(jù)分次放進(jìn)模型進(jìn)行訓(xùn)練)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
                                           batch_size=batch_size, 
                                           shuffle=True, # 裝載過程中隨機(jī)亂序
                                           num_workers=2) # 表示2個(gè)子進(jìn)程加載數(shù)據(jù)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, 
                                          batch_size=batch_size, 
                                          shuffle=False,
                                          num_workers=2) 

加載完數(shù)據(jù)后,可以得到60000個(gè)訓(xùn)練樣本和10000個(gè)測(cè)試樣本

print(len(train_dataset))
print(len(test_dataset))

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)

以及469個(gè)訓(xùn)練批次和79測(cè)試批次

# batch=128
# train_loader=60000/128 = 469 個(gè)batch
# test_loader=10000/128=79 個(gè)batch
print(len(train_loader))
print(len(test_loader))

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)

打印前5個(gè)手寫數(shù)字樣本看看

for i in range(0,5):
    oneimg,label = train_dataset[i]
    grid = utils.make_grid(oneimg)
    grid = grid.numpy().transpose(1,2,0) 
    std = [0.5]
    mean = [0.5]
    grid = grid * std + mean
    # 可視化圖像
    plt.subplot(1, 5, i+1)
    plt.imshow(grid)
    plt.axis('off')

plt.show()

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)
這里用了 make_grid() 函數(shù)將多張圖像拼接成一張網(wǎng)格圖像,并調(diào)整了網(wǎng)格圖像的形狀,使得它可以直接作為 imshow() 函數(shù)的輸入。這種方式可以在一張圖中同時(shí)顯示多張圖像,比單獨(dú)顯示每張圖像更加方便,常用于可視化深度學(xué)習(xí)中的卷積神經(jīng)網(wǎng)絡(luò)(CNN)中的特征圖、卷積核等信息。
在 PyTorch 中,默認(rèn)的圖像張量格式是 (channel, height, width),即通道維度在第一個(gè)維度。 torchvision.transforms.ToTensor() 函數(shù)會(huì)將 PIL 圖像對(duì)象轉(zhuǎn)換為 PyTorch 張量,并將通道維度放在第一個(gè)維度。因此,當(dāng)我們使用 ToTensor() 函數(shù)加載圖像數(shù)據(jù)時(shí),得到的 PyTorch 張量的格式就是 (channel, height, width)。代碼中的 oneimg.numpy().transpose(1,2,0) 就是將 PyTorch 張量 oneimg 轉(zhuǎn)換為 NumPy 數(shù)組,然后通過 transpose 函數(shù)將圖像數(shù)組中的通道維度從第一個(gè)維度(channel-first)調(diào)整為最后一個(gè)維度(channel-last),即將 (channel, height, width) 調(diào)整為 (height, width, channel),以便于 Matplotlib 庫正確處理通道信息。

2. 模型搭建

我們將使用Pytorch構(gòu)建一個(gè)如下圖所示的CNN,包含兩個(gè)卷積層,和全連接層,并使用Relu作為激活函數(shù)。
CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)
接下來看以下不同層的參數(shù)。

卷積層: Connv2d

  • in_channels ——輸入數(shù)據(jù)的通道數(shù)目
  • out_channels ——卷積產(chǎn)生的通道數(shù)目
  • kernel_size ——卷積核的尺寸
  • stride——步長(zhǎng)
  • padding——輸入數(shù)據(jù)的邊緣填充0的層數(shù)

池化層: MaxPool2d

  • kernel_siez ——池化核大小
  • stride——步長(zhǎng)
  • padding——輸入數(shù)據(jù)的邊緣填充0的層數(shù)

全連接層: Linear

  • in_features:輸入特征數(shù)
  • out_features:輸出特征數(shù)

代碼實(shí)現(xiàn)如下:

class CNN(nn.Module):
    # 定義網(wǎng)絡(luò)結(jié)構(gòu)
    def __init__(self):
        super(CNN, self).__init__()
        # 圖片是灰度圖片,只有一個(gè)通道
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, 
                               kernel_size=5, stride=1, padding=2)
        self.relu1 = nn.ReLU()
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, 
                               kernel_size=5, stride=1, padding=2)
        self.relu2 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(in_features=7*7*32, out_features=256)
        self.relu3 = nn.ReLU()
        self.fc2 = nn.Linear(in_features=256, out_features=10)
	
    # 定義前向傳播過程的計(jì)算函數(shù)
    def forward(self, x):
        # 第一層卷積、激活函數(shù)和池化
        x = self.conv1(x)
        x = self.relu1(x)
        x = self.pool1(x)
        # 第二層卷積、激活函數(shù)和池化
        x = self.conv2(x)
        x = self.relu2(x)
        x = self.pool2(x)
        # 將數(shù)據(jù)平展成一維
        x = x.view(-1, 7*7*32)
        # 第一層全連接層
        x = self.fc1(x)
        x = self.relu3(x)
        # 第二層全連接層
        x = self.fc2(x)
        return x

定義損失函數(shù)和優(yōu)化函數(shù)

import torch.optim as optim

learning_rate = 0.001 # 學(xué)習(xí)率

# 定義損失函數(shù),計(jì)算模型的輸出與目標(biāo)標(biāo)簽之間的交叉熵?fù)p失
criterion = nn.CrossEntropyLoss()
# 訓(xùn)練過程通常采用反向傳播來更新模型參數(shù),這里使用的是SDG(隨機(jī)梯度下降)優(yōu)化器
# momentum 表示動(dòng)量因子,可以加速優(yōu)化過程并提高模型的泛化性能。
optimizer = optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9)
#也可以選擇Adam優(yōu)化方法
# optimizer = torch.optim.Adam(net.parameters(),lr=1e-2)

3. 模型訓(xùn)練

model = CNN() # 實(shí)例化CNN模型
num_epochs = 10 # 定義迭代次數(shù)

# 如果可用的話使用 GPU 進(jìn)行訓(xùn)練,否則使用 CPU 進(jìn)行訓(xùn)練。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 將神經(jīng)網(wǎng)絡(luò)模型 net 移動(dòng)到指定的設(shè)備上。
model = model.to(device)
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images,labels) in enumerate(train_loader):
        images=images.to(device)
        labels=labels.to(device)
        optimizer.zero_grad() # 清空上一個(gè)batch的梯度信息
        # 將輸入數(shù)據(jù) inputs 喂入神經(jīng)網(wǎng)絡(luò)模型 net 中進(jìn)行前向計(jì)算,得到模型的輸出結(jié)果 outputs。
        outputs=model(images) 
        # 使用交叉熵?fù)p失函數(shù) criterion 計(jì)算模型輸出 outputs 與標(biāo)簽數(shù)據(jù) labels 之間的損失值 loss。
        loss=criterion(outputs,labels)
        # 使用反向傳播算法計(jì)算模型參數(shù)的梯度信息,并使用優(yōu)化器 optimizer 對(duì)模型參數(shù)進(jìn)行更新。
        loss.backward()
         # 更新梯度
        optimizer.step()
        # 輸出訓(xùn)練結(jié)果
        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))

print('Finished Training')

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)

保存模型

# 模型保存
PATH = './mnist_net.pth'
torch.save(model.state_dict(), PATH)

4. 模型測(cè)試

# 測(cè)試CNN模型
with torch.no_grad(): # 進(jìn)行評(píng)測(cè)的時(shí)候網(wǎng)絡(luò)不更新梯度
    correct = 0
    total = 0
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0
        correct += (predicted == labels).sum().item()
    print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total))

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)
這里訓(xùn)練的模型準(zhǔn)確率達(dá)到了98%,非常高,如果還想繼續(xù)提高模型準(zhǔn)確率,可以調(diào)整迭代次數(shù)、學(xué)習(xí)率等參數(shù)或者修改CNN網(wǎng)絡(luò)結(jié)構(gòu)實(shí)現(xiàn)。

可視化檢驗(yàn)一個(gè)批次測(cè)試數(shù)據(jù)的準(zhǔn)確性

# 將 test_loader 轉(zhuǎn)換為一個(gè)可迭代對(duì)象 dataiter
dataiter = iter(test_loader)
# 使用 next(dataiter) 獲取 test_loader 中的下一個(gè) batch 的圖像數(shù)據(jù)和標(biāo)簽數(shù)據(jù)
images, labels = next(dataiter)

# print images
test_img = utils.make_grid(images)
test_img = test_img.numpy().transpose(1,2,0)
std = [0.5]
mean =  [0.5]
test_img = test_img*std+0.5
plt.imshow(test_img)
plt.show()
plt.savefig('./mnist_net.png')
print('GroundTruth: ', ' '.join('%d' % labels[j] for j in range(128)))

CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)

參考來源:
使用Pytorch框架的CNN網(wǎng)絡(luò)實(shí)現(xiàn)手寫數(shù)字(MNIST)識(shí)別
PyTorch初探MNIST數(shù)據(jù)集文章來源地址http://www.zghlxwxcb.cn/news/detail-438972.html

到了這里,關(guān)于CNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(Pytorch)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • pytorch集智-5手寫數(shù)字識(shí)別器-卷積神經(jīng)網(wǎng)絡(luò)

    pytorch集智-5手寫數(shù)字識(shí)別器-卷積神經(jīng)網(wǎng)絡(luò)

    簡(jiǎn)稱:CNN,convolutional neural network 應(yīng)用場(chǎng)景:圖像識(shí)別與分類(CNN),看圖說話(CNN+RNN)等 優(yōu)越性:和多層感知機(jī)相比,cnn可以識(shí)別獨(dú)特的模式,可以自動(dòng)從數(shù)據(jù)中提取特征。一般機(jī)器學(xué)習(xí)需要特征工程,cnn可以自動(dòng)識(shí)別,極大代替或取代了特征工程 和多層感知機(jī)原理不同

    2024年01月19日
    瀏覽(24)
  • 真的不能再詳細(xì)了,2W字保姆級(jí)帶你一步步用Pytorch搭建卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)MNIST手寫數(shù)字識(shí)別

    真的不能再詳細(xì)了,2W字保姆級(jí)帶你一步步用Pytorch搭建卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)MNIST手寫數(shù)字識(shí)別

    目錄 一、引言(環(huán)境) ?二、正文 1. 代碼基本情況介紹 2. MNIST數(shù)據(jù)集介紹?? ? ?? ?3. 代碼輸出結(jié)果介紹 數(shù)據(jù)集取樣: 訓(xùn)練信息輸出: 前三次訓(xùn)練成果以及預(yù)測(cè): 八次訓(xùn)練的結(jié)果: ?4. 代碼拆解講解 基本的參數(shù)設(shè)定 MNIST數(shù)據(jù)集下載、保存與加載 神經(jīng)網(wǎng)絡(luò)模型 訓(xùn)練前的準(zhǔn)

    2023年04月20日
    瀏覽(29)
  • 用PyTorch實(shí)現(xiàn)MNIST手寫數(shù)字識(shí)別(最新,非常詳細(xì))

    用PyTorch實(shí)現(xiàn)MNIST手寫數(shù)字識(shí)別(最新,非常詳細(xì))

    本文基于 PyTorch 框架,采用 CNN卷積神經(jīng)網(wǎng)絡(luò) 實(shí)現(xiàn) MNIST 手寫數(shù)字識(shí)別,僅在 CPU 上運(yùn)行。 已分別實(shí)現(xiàn)使用Linear純線性層、CNN卷積神經(jīng)網(wǎng)絡(luò)、Inception網(wǎng)絡(luò)、和Residual殘差網(wǎng)絡(luò)四種結(jié)構(gòu)對(duì)MNIST數(shù)據(jù)集進(jìn)行手寫數(shù)字識(shí)別,并對(duì)其識(shí)別準(zhǔn)確率進(jìn)行比較分析。(另外三種還未發(fā)布) 看完

    2024年02月06日
    瀏覽(24)
  • 機(jī)器學(xué)習(xí)第一周:用卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)Mnist手寫數(shù)字識(shí)別(付基礎(chǔ)知識(shí)解釋)

    MNIST 數(shù)據(jù)集是一個(gè)手寫數(shù)字識(shí)別數(shù)據(jù)集,包含了 60000 張訓(xùn)練圖像和 10000 張測(cè)試圖像,每張圖像都是 28x28 像素的灰度圖像。 在這個(gè)代碼中,我們首先使用了 numpy 庫中的 np.random.seed() 方法來設(shè)置隨機(jī)種子,以確保結(jié)果可重復(fù)。 然后,我們使用了 Keras 中的 mnist.load_data() 方法來

    2024年02月08日
    瀏覽(29)
  • 在樹莓派上實(shí)現(xiàn)numpy的conv2d卷積神經(jīng)網(wǎng)絡(luò)做圖像分類,加載pytorch的模型參數(shù),推理mnist手寫數(shù)字識(shí)別,并使用多進(jìn)程加速

    在樹莓派上實(shí)現(xiàn)numpy的conv2d卷積神經(jīng)網(wǎng)絡(luò)做圖像分類,加載pytorch的模型參數(shù),推理mnist手寫數(shù)字識(shí)別,并使用多進(jìn)程加速

    這幾天又在玩樹莓派,先是搞了個(gè)物聯(lián)網(wǎng),又在嘗試在樹莓派上搞一些簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),這次搞得是卷積識(shí)別mnist手寫數(shù)字識(shí)別 訓(xùn)練代碼在電腦上,cpu就能訓(xùn)練,很快的: 然后需要自己在dataset里導(dǎo)出一些圖片:我保存在了mnist_pi文件夾下,“_”后面的是標(biāo)簽,主要是在pc端導(dǎo)

    2024年02月07日
    瀏覽(33)
  • 手寫數(shù)字識(shí)別-基于卷積神經(jīng)網(wǎng)絡(luò)

    手寫數(shù)字識(shí)別-基于卷積神經(jīng)網(wǎng)絡(luò)

    ??歡迎來到機(jī)器學(xué)習(xí)的世界? ??博客主頁:卿云閣 ???歡迎關(guān)注??點(diǎn)贊??收藏??留言?? ??本文由卿云閣原創(chuàng)! ??本階段屬于練氣階段,希望各位仙友順利完成突破 ??首發(fā)時(shí)間:??2021年6月5日?? ??希望可以和大家一起完成進(jìn)階之路! ??作者水平很有限,如果發(fā)

    2024年02月10日
    瀏覽(18)
  • python與深度學(xué)習(xí)(六):CNN和手寫數(shù)字識(shí)別二

    python與深度學(xué)習(xí)(六):CNN和手寫數(shù)字識(shí)別二

    本篇文章是對(duì)上篇文章訓(xùn)練的模型進(jìn)行測(cè)試。首先是將訓(xùn)練好的模型進(jìn)行重新加載,然后采用opencv對(duì)圖片進(jìn)行加載,最后將加載好的圖片輸送給模型并且顯示結(jié)果。 在這里導(dǎo)入需要的第三方庫如cv2,如果沒有,則需要自行下載。 把MNIST數(shù)據(jù)集進(jìn)行加載,并且把訓(xùn)練好的模型也

    2024年02月15日
    瀏覽(25)
  • [Pytorch]手寫數(shù)字識(shí)別——真·手寫!

    Github網(wǎng)址:https://github.com/diaoquesang/pytorchTutorials/tree/main 本教程創(chuàng)建于2023/7/31,幾乎所有代碼都有對(duì)應(yīng)的注釋,幫助初學(xué)者理解dataset、dataloader、transform的封裝,初步體驗(yàn)調(diào)參的過程,初步掌握opencv、pandas、os等庫的使用,??純手?jǐn)]手寫數(shù)字識(shí)別項(xiàng)目(為減少代碼量簡(jiǎn)化了部分

    2024年02月14日
    瀏覽(25)
  • 【Pytorch+torchvision】MNIST手寫數(shù)字識(shí)別

    【Pytorch+torchvision】MNIST手寫數(shù)字識(shí)別

    深度學(xué)習(xí)入門項(xiàng)目,含代碼詳細(xì)解析 在本文中,我們將在 PyTorch 中構(gòu)建一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò),并使用 MNIST數(shù)據(jù)集 訓(xùn)練它識(shí)別手寫數(shù)字。?MNIST包含70,000張手寫數(shù)字圖像: 60,000張用于培訓(xùn),10,000張用于測(cè)試。圖像是 灰度(即通道數(shù)為1) , 28x28像素 ,并且居中的,以減少預(yù)

    2024年02月14日
    瀏覽(20)
  • 【Pytorch】計(jì)算機(jī)視覺項(xiàng)目——卷積神經(jīng)網(wǎng)絡(luò)CNN模型識(shí)別圖像分類

    【Pytorch】計(jì)算機(jī)視覺項(xiàng)目——卷積神經(jīng)網(wǎng)絡(luò)CNN模型識(shí)別圖像分類

    在上一篇筆記《【Pytorch】整體工作流程代碼詳解(新手入門)》中介紹了Pytorch的整體工作流程,本文繼續(xù)說明如何使用Pytorch搭建卷積神經(jīng)網(wǎng)絡(luò)(CNN模型)來給圖像分類。 其他相關(guān)文章: 深度學(xué)習(xí)入門筆記:總結(jié)了一些神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)概念。 TensorFlow專欄:《計(jì)算機(jī)視覺入門

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包