Pytorch实现手写体识别(基于CNN卷积神经网络)实操详解(附完整代码free)

本文通过一个手写体识别的例子,详细介绍了使用PyTorch实现深度学习的过程,包括数据集加载、模型构建、训练与测试。重点讲解了Inception模块的卷积操作和1x1卷积的作用。最后提供了完整代码。
摘要由CSDN通过智能技术生成

手写体作为深度学习的“Hello world”,几乎所有的课程都会讲到这个,今天带着大家一些看看吧。
如果对你有所帮助,点个赞给个小关注,以后一起交流学习。

前言

首先和大家讲讲我为啥会看到这个,因为我需要写论文,关于图像增强的,比如夜视,曝光,去雨,去雪,去雾等,以往采用的是传统的方法“直方图,暗通道,retinex”等,现在随着深度学习的发展,只从12年人机大战,深度学习迅速爆棚,由于结果惊艳,所以深度学习进入了人们感兴趣的领域。
好不夸张的说,现在各行各业都在使用深度学习,这个也是我需要研究的课题。
为了实现这些,需要从零开始,慢慢摸索。
好啦,不扯了。

一、需要的基础
1 Python编程语法

2 numpy学习

3 matplotlib学习

4 pytorch(tensorflow等也可以)

5 数据集导入相关

6 CV2(有可能会用到)

7 卷积神经网络知识(卷积,池化,融合,步长,padding,激活函数等)

8 线性回归,分类等问题(部分数学知识,均方误差,梯度求导,激活函数等)
先列举这么多吧,这么多基础就可以看懂今天的例子,然后你也会明白我说的内容,由于能力有限,难免有说错或者不准确的地方,感谢各位可以进行指导和纠正,自己也是初入茅庐,仅供大家参考。

二、正式讲解
做深度学习无非就是

导入数据集
大家模型
训练模型
测试模型

2.1 导入本例程需要的库

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt
import torch.nn.modules

这些库的作用很清晰,有编程基础和深度学习的小伙伴一眼就可以看出,就是常见的语法,框架,绘图,数据集导入等
这里补充说明两个
import torch.nn.functional as F
import torch.optim as optim
这两个就是为了使用torch框架中的函数,已经优化等

2.2 加载数据集
这里导入下载的minist数据集(注意:minist数据集分为测试集,训练集)


batch_size = 64
transform = transforms.Compose([
    transforms.ToTensor(), #转成张量
    transforms.Normalize((0.1307,),(0.3081,)) # 神经网络使用(0,1)分布
])

train_dataset = datasets.MNIST('MNIST_data',
                               train=True,
                               download=True,
                               transform=transform)

train_loader = DataLoader(train_dataset,
                                shuffle = True,
                                batch_size = batch_size)

test_dataset = datasets.MNIST('MNIST_data',
                               train=False,
                               download=True,
                               transform=transform)

test_loader = DataLoader(test_dataset,
                                shuffle = False,
                                batch_size=batch_size)

batch_size = 64这个需要和大家说一下,这个是干啥的呢?
一开始我也不太了解,只知道是批次训练,一次训练多少,最好发现,是为了计算机的内存考虑的,假如数据集比较小还好,不用管这些,但是如果数据集比较大,跑起来可以把电脑内存跑爆炸。所以这里采用批次训练,一次一个批次,不仅可以正常运行,而且还可以提高模型的泛化性。
shuffle = False,这个也要说一下,这个是重新洗牌,避免每次选的一样,打乱顺序。

2.3 卷积层操作

class  InceptionA(torch.nn.Module):
    def __init__(self,in_channels):
        super(InceptionA,self).__init__()
        self.branch1x1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)

        self.branch5x5_1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
        self.branch5x5_2 = torch.nn.Conv2d(16,24,kernel_size=5,padding=2)

        self.branch3x3_1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
        self.branch3x3_2 = torch.nn.Conv2d(16,24,kernel_size=3,padding=1)
        self.branch3x3_3 = torch.nn.Conv2d(24,24,kernel_size=3,padding=1)

        self.branch_pool = torch.nn.Conv2d(in_channels,24,kernel_size=1)

    def forward(self,x):
        branch1x1 = self.branch1x1(x)

        branch5x5 = self.branch5x5_1(x)
        branch5x5 = self.branch5x5_2(branch5x5)

        branch3x3 = self.branch3x3_1(x)
        branch3x3 = self.branch3x3_2(branch3x3)
        branch3x3 = self.branch3x3_3(branch3x3)

        branch_pool = F.avg_pool2d(x,kernel_size=3,stride=1,padding=1)</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值