【深度学习】实验16 使用CNN完成MNIST手写体识别(PyTorch)

简介: 【深度学习】实验16 使用CNN完成MNIST手写体识别(PyTorch)

使用CNN完成MNIST手写体识别(PyTorch)

卷积神经网络(Convolutional Neural Network,简称CNN)是一种专门用于处理图像、语音、自然语言等数据的深度学习模型。CNN的特点是可以通过卷积运算提取出图像、语音等数据中的特征,从而实现对这些数据进行分类、识别等任务。


CNN的基本结构包括卷积层、池化层和全连接层。其中卷积层是CNN的核心部分,它可以通过卷积核(或滤波器)对输入数据进行卷积运算,从而提取出数据中的空间特征,如边缘、角等。卷积层的输出经过池化层的降采样处理,可以减少参数数量,提高模型的泛化能力。全连接层则将池化层输出的特征向量连接起来,通过权重矩阵进行分类、识别等任务。


CNN的训练过程通常采用反向传播算法来更新网络中的权重参数。反向传播算法可以根据损失函数的导数来逐层计算各层的误差,从而调整各层的权重参数,使得模型对训练数据的拟合效果更好。


CNN在图像识别、目标检测、人脸识别等领域都有广泛应用。其中经典的卷积神经网络模型包括LeNet、AlexNet、VGG、GoogLeNet和ResNet等。这些模型在不同的任务中都取得了很好的效果,为深度学习领域的发展做出了重要贡献。


总的来说,卷积神经网络是一种能够有效处理图像、语音等数据的深度学习模型,在计算机视觉、语音识别等领域具有广泛的应用前景。

1. 导入PyTorch库

import torch
import numpy as np
from torch import nn
from torch.utils.data import DataLoader
from torch.autograd import Variable
from torchvision.datasets import mnist
from torchvision import transforms
from torch import optim

2. 定义CNN类

# 定义CNN
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, 16, kernel_size=3),
            nn.BatchNorm2d(16),
            nn.ReLU(inplace=True)
        )
        self.layer2 = nn.Sequential(
            nn.Conv2d(16, 32, kernel_size=3),
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.layer3 = nn.Sequential(
            nn.Conv2d(32, 64, kernel_size=3),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True)
        )
        self.layer4 = nn.Sequential(
            nn.Conv2d(64, 128, kernel_size=3),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,stride=2)
        )
        self.fc = nn.Sequential(
            nn.Linear(128 * 4 * 4, 1024),
            nn.ReLU(inplace=True),
            nn.Linear(1024, 128),
            nn.ReLU(inplace=True),
            nn.Linear(128, 10)
        )
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x
# 数据集转换
data_tf = transforms.Compose(
    [transforms.ToTensor(),
    transforms.Normalize([0.5], [0.5])]
)

3. 下载数据集

# 使用内置函数下载mnist数据集
train_set = mnist.MNIST('./data', train=True, transform=data_tf, download=True)
test_set = mnist.MNIST('./data', train=False, transform=data_tf, download=True)
train_set, test_set
   (Dataset MNIST
        Number of datapoints: 60000
        Root location: ./data
        Split: Train
        StandardTransform
    Transform: Compose(
                   ToTensor()
                   Normalize(mean=[0.5], std=[0.5])
               ), Dataset MNIST
        Number of datapoints: 10000
        Root location: ./data
        Split: Test
        StandardTransform
    Transform: Compose(
                   ToTensor()
                   Normalize(mean=[0.5], std=[0.5])
               ))
# 划分训练集与测试集
train_data = DataLoader(train_set, batch_size=100, shuffle=True)
test_data = DataLoader(test_set, batch_size=100, shuffle=False)
train_data, test_data
   (<torch.utils.data.dataloader.DataLoader at 0x7f43c81d6eb8>,
    <torch.utils.data.dataloader.DataLoader at 0x7f43c81d6e10>)

4. 训练模型

# 调用卷积神经网络
net = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), 1e-1)
# 开始训练
losses = []
acces = []
eval_losses = []
eval_acces = []
nums_epoch = 1
print("开始训练......")
for epoch in range(nums_epoch):
    print("Test:" + str(epoch))
    train_loss = 0
    train_acc = 0
    net = net.train()
    i = 0
    for img, label in train_data:
        i +=1
        print("第" + str(i) + "批训练")
        img = Variable(img)
        label =Variable(label)
        # 前向传播
        out = net(img)
        loss = criterion(out, label)
        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # 记录误差
        train_loss += loss.item()
        # 计算分类的准确率
        _, pred = out.max(1)
        num_correct = (pred ==label).sum().item()
        acc = num_correct / img.shape[0]
        # 记录准确率
        train_acc += acc
    losses.append(train_loss / len(train_data))
    acces.append(train_acc / len(train_data))
    eval_loss = 0
    eval_acc = 0
    # 测试集不训练
    for img, label in test_data:
        img = Variable(img)
        label = Variable(label)
        # 前向传播
        out = net(img)
        loss = criterion(out, label)
        # 记录误差
        eval_loss += loss.item()
        # 计算分类的准确率
        _, pred = out.max(1)
        num_correct = (pred == label).sum().item()
        acc = num_correct / img.shape[0]
        # 记录准确率
        eval_acc += acc
    eval_losses.append(eval_loss / len(test_data))
    eval_acces.append(eval_acc / len(test_data))
    print('Epoch {}: \nTrain Loss: {} Train Accuracy: {} \nTest Loss: {} Test Accuarcy: {}'.format(
    epoch + 1, train_loss / len(train_data), train_acc / len(train_data),
    eval_loss / len(test_data), eval_acc / len(test_data)))
   开始训练......
   Test:0
   第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批训练
   第34批训练
   第35批训练
   第36批训练
   第37批训练
   第38批训练
   第39批训练
   第40批训练
   第41批训练
   第42批训练
   第43批训练
   第44批训练
   第45批训练
   第46批训练
   第47批训练
   第48批训练
   第49批训练
   第50批训练
   第51批训练
   第52批训练
   第53批训练
   第54批训练
   第55批训练
   第56批训练
   第57批训练
   第58批训练
   第59批训练
   第60批训练
   第61批训练
   第62批训练
   第63批训练
   第64批训练
   第65批训练
   第66批训练
   第67批训练
   第68批训练
   第69批训练
   第70批训练
   第71批训练
   第72批训练
   第73批训练
   第74批训练
   第75批训练
   第76批训练
   第77批训练
   第78批训练
   第79批训练
   第80批训练
   第81批训练
   第82批训练
   第83批训练
   第84批训练
   第85批训练
   第86批训练
   第87批训练
   第88批训练
   第89批训练
   第90批训练
   第91批训练
   第92批训练
   第93批训练
   第94批训练
   第95批训练
   第96批训练
   第97批训练
   第98批训练
   第99批训练
   第100批训练
   第101批训练
   第102批训练
   第103批训练
   第104批训练
   第105批训练
   第106批训练
   第107批训练
   第108批训练
   第109批训练
   第110批训练
   第111批训练
   第112批训练
   第113批训练
   第114批训练
   第115批训练
   第116批训练
   第117批训练
   第118批训练
   第119批训练
   第120批训练
   第121批训练
   第122批训练
   第123批训练
   第124批训练
   第125批训练
   第126批训练
   第127批训练
   第128批训练
   第129批训练
   第130批训练
   第131批训练
   第132批训练
   第133批训练
   第134批训练
   第135批训练
   第136批训练
   第137批训练
   第138批训练
   第139批训练
   第140批训练
   第141批训练
   第142批训练
   第143批训练
   第144批训练
   第145批训练
   第146批训练
   第147批训练
   第148批训练
   第149批训练
   第150批训练
   第151批训练
   第152批训练
   第153批训练
   第154批训练
   第155批训练
   第156批训练
   第157批训练
   第158批训练
   第159批训练
   第160批训练
   第161批训练
   第162批训练
   第163批训练
   第164批训练
   第165批训练
   第166批训练
   第167批训练
   第168批训练
   第169批训练
   第170批训练
   第171批训练
   第172批训练
   第173批训练
   第174批训练
   第175批训练
   第176批训练
   第177批训练
   第178批训练
   第179批训练
   第180批训练
   第181批训练
   第182批训练
   第183批训练
   第184批训练
   第185批训练
   第186批训练
   第187批训练
   第188批训练
   第189批训练
   第190批训练
   第191批训练
   第192批训练
   第193批训练
   第194批训练
   第195批训练
   第196批训练
   第197批训练
   第198批训练
   第199批训练
   第200批训练
   第201批训练
   第202批训练
   第203批训练
   第204批训练
   第205批训练
   第206批训练
   第207批训练
   第208批训练
   第209批训练
   第210批训练
   第211批训练
   第212批训练
   第213批训练
   第214批训练
   第215批训练
   第216批训练
   第217批训练
   第218批训练
   第219批训练
   第220批训练
   第221批训练
   第222批训练
   第223批训练
   第224批训练
   第225批训练
   第226批训练
   第227批训练
   第228批训练
   第229批训练
   第230批训练
   第231批训练
   第232批训练
   第233批训练
   第234批训练
   第235批训练
   第236批训练
   第237批训练
   第238批训练
   第239批训练
   第240批训练
   第241批训练
   第242批训练
   第243批训练
   第244批训练
   第245批训练
   第246批训练
   第247批训练
   第248批训练
   第249批训练
   第250批训练
   第251批训练
   第252批训练
   第253批训练
   第254批训练
   第255批训练
   第256批训练
   第257批训练
   第258批训练
   第259批训练
   第260批训练
   第261批训练
   第262批训练
   第263批训练
   第264批训练
   第265批训练
   第266批训练
   第267批训练
   第268批训练
   第269批训练
   第270批训练
   第271批训练
   第272批训练
   第273批训练
   第274批训练
   第275批训练
   第276批训练
   第277批训练
   第278批训练
   第279批训练
   第280批训练
   第281批训练
   第282批训练
   第283批训练
   第284批训练
   第285批训练
   第286批训练
   第287批训练
   第288批训练
   第289批训练
   第290批训练
   第291批训练
   第292批训练
   第293批训练
   第294批训练
   第295批训练
   第296批训练
   第297批训练
   第298批训练
   第299批训练
   第300批训练
   第301批训练
   第302批训练
   第303批训练
   第304批训练
   第305批训练
   第306批训练
   第307批训练
   第308批训练
   第309批训练
   第310批训练
   第311批训练
   第312批训练
   第313批训练
   第314批训练
   第315批训练
   第316批训练
   第317批训练
   第318批训练
   第319批训练
   第320批训练
   第321批训练
   第322批训练
   第323批训练
   第324批训练
   第325批训练
   第326批训练
   第327批训练
   第328批训练
   第329批训练
   第330批训练
   第331批训练
   第332批训练
   第333批训练
   第334批训练
   第335批训练
   第336批训练
   第337批训练
   第338批训练
   第339批训练
   第340批训练
   第341批训练
   第342批训练
   第343批训练
   第344批训练
   第345批训练
   第346批训练
   第347批训练
   第348批训练
   第349批训练
   第350批训练
   第351批训练
   第352批训练
   第353批训练
   第354批训练
   第355批训练
   第356批训练
   第357批训练
   第358批训练
   第359批训练
   第360批训练
   第361批训练
   第362批训练
   第363批训练
   第364批训练
   第365批训练
   第366批训练
   第367批训练
   第368批训练
   第369批训练
   第370批训练
   第371批训练
   第372批训练
   第373批训练
   第374批训练
   第375批训练
   第376批训练
   第377批训练
   第378批训练
   第379批训练
   第380批训练
   第381批训练
   第382批训练
   第383批训练
   第384批训练
   第385批训练
   第386批训练
   第387批训练
   第388批训练
   第389批训练
   第390批训练
   第391批训练
   第392批训练
   第393批训练
   第394批训练
   第395批训练
   第396批训练
   第397批训练
   第398批训练
   第399批训练
   第400批训练
   第401批训练
   第402批训练
   第403批训练
   第404批训练
   第405批训练
   第406批训练
   第407批训练
   第408批训练
   第409批训练
   第410批训练
   第411批训练
   第412批训练
   第413批训练
   第414批训练
   第415批训练
   第416批训练
   第417批训练
   第418批训练
   第419批训练
   第420批训练
   第421批训练
   第422批训练
   第423批训练
   第424批训练
   第425批训练
   第426批训练
   第427批训练
   第428批训练
   第429批训练
   第430批训练
   第431批训练
   第432批训练
   第433批训练
   第434批训练
   第435批训练
   第436批训练
   第437批训练
   第438批训练
   第439批训练
   第440批训练
   第441批训练
   第442批训练
   第443批训练
   第444批训练
   第445批训练
   第446批训练
   第447批训练
   第448批训练
   第449批训练
   第450批训练
   第451批训练
   第452批训练
   第453批训练
   第454批训练
   第455批训练
   第456批训练
   第457批训练
   第458批训练
   第459批训练
   第460批训练
   第461批训练
   第462批训练
   第463批训练
   第464批训练
   第465批训练
   第466批训练
   第467批训练
   第468批训练
   第469批训练
   第470批训练
   第471批训练
   第472批训练
   第473批训练
   第474批训练
   第475批训练
   第476批训练
   第477批训练
   第478批训练
   第479批训练
   第480批训练
   第481批训练
   第482批训练
   第483批训练
   第484批训练
   第485批训练
   第486批训练
   第487批训练
   第488批训练
   第489批训练
   第490批训练
   第491批训练
   第492批训练
   第493批训练
   第494批训练
   第495批训练
   第496批训练
   第497批训练
   第498批训练
   第499批训练
   第500批训练
   第501批训练
   第502批训练
   第503批训练
   第504批训练
   第505批训练
   第506批训练
   第507批训练
   第508批训练
   第509批训练
   第510批训练
   第511批训练
   第512批训练
   第513批训练
   第514批训练
   第515批训练
   第516批训练
   第517批训练
   第518批训练
   第519批训练
   第520批训练
   第521批训练
   第522批训练
   第523批训练
   第524批训练
   第525批训练
   第526批训练
   第527批训练
   第528批训练
   第529批训练
   第530批训练
   第531批训练
   第532批训练
   第533批训练
   第534批训练
   第535批训练
   第536批训练
   第537批训练
   第538批训练
   第539批训练
   第540批训练
   第541批训练
   第542批训练
   第543批训练
   第544批训练
   第545批训练
   第546批训练
   第547批训练
   第548批训练
   第549批训练
   第550批训练
   第551批训练
   第552批训练
   第553批训练
   第554批训练
   第555批训练
   第556批训练
   第557批训练
   第558批训练
   第559批训练
   第560批训练
   第561批训练
   第562批训练
   第563批训练
   第564批训练
   第565批训练
   第566批训练
   第567批训练
   第568批训练
   第569批训练
   第570批训练
   第571批训练
   第572批训练
   第573批训练
   第574批训练
   第575批训练
   第576批训练
   第577批训练
   第578批训练
   第579批训练
   第580批训练
   第581批训练
   第582批训练
   第583批训练
   第584批训练
   第585批训练
   第586批训练
   第587批训练
   第588批训练
   第589批训练
   第590批训练
   第591批训练
   第592批训练
   第593批训练
   第594批训练
   第595批训练
   第596批训练
   第597批训练
   第598批训练
   第599批训练
   第600批训练
   Epoch 1: 
   Train Loss: 0.14750646080588922 Train Accuracy: 0.9542000000000053 
   Test Loss: 0.04495963536784984 Test Accuarcy: 0.9845999999999998


目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第7天】本文将深入探讨卷积神经网络(CNN)的基本原理,以及它如何在图像识别领域中大放异彩。我们将从CNN的核心组件出发,逐步解析其工作原理,并通过一个实际的代码示例,展示如何利用Python和深度学习框架实现一个简单的图像分类模型。文章旨在为初学者提供一个清晰的入门路径,同时为有经验的开发者提供一些深入理解的视角。
|
6天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
11天前
|
机器学习/深度学习 监控 PyTorch
深度学习工程实践:PyTorch Lightning与Ignite框架的技术特性对比分析
在深度学习框架的选择上,PyTorch Lightning和Ignite代表了两种不同的技术路线。本文将从技术实现的角度,深入分析这两个框架在实际应用中的差异,为开发者提供客观的技术参考。
32 7
|
1月前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
157 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
21天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第21天】本文旨在深入探讨深度学习领域的核心组成部分——卷积神经网络(CNN)。通过分析CNN的基本结构、工作原理以及在图像识别、语音处理等领域的广泛应用,我们不仅能够理解其背后的技术原理,还能把握其在现实世界问题解决中的强大能力。文章将用浅显的语言和生动的例子带领读者一步步走进CNN的世界,揭示这一技术如何改变我们的生活和工作方式。
|
28天前
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
81 1
|
7天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
21 0
|
2月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
136 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
10天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
1月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
26 1

热门文章

最新文章