基于卷积神经网络(cnn)的手写数字识别(PyTorch)

目录

1.1 卷积神经网络简介

1.2 神经网络

1.2.1 神经元模型

 1.2.2 神经网络模型

1.3 卷积神经网络

1.3.1卷积的概念

1.3.2 卷积的计算过程

1.3.3 感受野

1.3.4 步长

1.3.5 输出特征尺寸计算

 1.3.6 全零填充

1.3.7 标准化

1.3.7 池化层

 1.4 卷积神经网络的全过程

 1.5 PyTorch的卷积神经网络(cnn)手写数字识别

1.5.1 代码


1.1 卷积神经网络简介

卷积神经网络(Convolutional Neural Networks,简称:CNN)是深度学习当中一个非常重要的神经网络结构。它主要用于用在图像图片处理,视频处理,音频处理以及自然语言处理等等。
早在上世纪80年代左右,卷积神经网络的概念就已经被提出来了。但其真正的崛起却是在21世纪之后,21世纪之后,随着深度学习理论的不断完善,同时,由计算机硬件性能的提升,计算机算力的不断发展,给卷积神经网络这种算法提供了应用的空间。著名的AlphaGo,手机上的人脸识别,大多数都是采用卷积神经网络。因此可以说,卷积神经网络在如今的深度学习领域,有着举足轻重的作用。

在了解卷积神经网络之前,我们务必要知道:什么是神经网络(Neural Networks),关于这个,我们已经在深度学习简介的 第二部分有所介绍。这里就不赘述了。在了解了神经网络的基础上,我们再来探究:卷积神经网络又是什么呢?当中的“卷积”这个词,又意味着什么呢?
 

1.2 神经网络

1.2.1 神经元模型


人工神神经网络(neural networks)方面的研究很早就已出现,今天“神经网络”    已是一个相当大的、多学科交叉的学科领域.各相关学科对神经网络的定义多种多样。简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应” 。
神经网络中最基本的成分是神经元(neuron)模型,即上述定义中的“简单单元”,在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”(threshold),那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的间值进行比较,然后通过激活函数处理,产生神经元输出。

 

 1.2.2 神经网络模型

 神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
 

1.3 卷积神经网络

1.3.1卷积的概念

卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层子采样层(池化层)构成的特征抽取器。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。在CNN的一个卷积层中,通常包含若干个特征图(featureMap),每个特征图由一些矩形排列的的神经元组成,同一特征图的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。子采样也叫做池化(pooling),通常有均值子采样(mean pooling)最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。

1.3.2 卷积的计算过程

假设我们输入的是5*5*1的图像,中间的那个3*3*1是我们定义的一个卷积核(简单来说可以看做一个矩阵形式运算器),通过原始输入图像和卷积核做运算可以得到绿色部分的结果,怎么样的运算呢?实际很简单就是我们看左图中深色部分,处于中间的数字是图像的像素,处于右下角的数字是我们卷积核的数字,只要对应相乘再相加就可以得到结果。例如图中‘3*0+1*1+2*2+2*2+0*2+0*0+2*0+0*1+0*2=9’

计算过程如下动图:

图中最左边的三个输入矩阵就是我们的相当于输入d=3时有三个通道图,每个通道图都有一个属于自己通道的卷积核,我们可以看到输出(output)的只有两个特征图意味着我们设置的输出d=2,有几个输出通道就有几层卷积核(比如图中就有FilterW0和FilterW1),这意味着我们的卷积核数量就是输入d的个数乘以输出d的个数(图中就是2*3=6个),其中每一层通道图的计算与上文中提到的一层计算相同,再把每一个通道输出的输出再加起来就是绿色的输出数字。

1.3.3 感受野

感受野(Receptive Field):卷积神经网络各输出层每个像素点在原始图像上的映射区域大小。
下图为感受野示意图:

 当我们采用尺寸不同的卷积核时,最大的区别就是感受野的大小不同,所以经常会采用多层小卷积核来替换一层大卷积核,在保持感受野相同的情况下减少参数量和计算量。
例如十分常见的用2层3 * 3卷积核来替换1层5 * 5卷积核的方法,如下图所示。

1.3.4 步长

每次卷积核移动的大小。

1.3.5 输出特征尺寸计算

输出特征尺寸计算:在了解神经网络中卷积计算的整个过程后,就可以对输出特征图的尺寸进行计算。如下图所示,5×5的图像经过3×3大小的卷积核做卷积计算后输出特征尺寸为3×3

 1.3.6 全零填充

当卷积核尺寸大于 1 时,输出特征图的尺寸会小于输入图片尺寸。如果经过多次卷积,输出图片尺寸会不断减小。为了避免卷积之后图片尺寸变小,通常会在图片的外围进行填充(padding),如下图所示

全零填充(padding):为了保持输出图像尺寸与输入图像一致,经常会在输入图像周围进行全零填充,如下所示,在5×5的输入图像周围填0,则输出特征尺寸同为5×5。

当padding=1和paadding=2时,如下图所示:

1.3.7 标准化

使数据符合0均值,1为标准差的分布。
批标准化(Batch Normalization):对一小批数据(batch),做标准化处理。

 Batch Normalization将神经网络每层的输入都调整到均值为0,方差为1的标准正态分布,其目的是解决神经网络中梯度消失的问题.

BN操作的另一个重要步骤是缩放和偏移,值得注意的是,缩放因子γ以及偏移因子β都是可训练参数。 

1.3.7 池化层

池化(Pooling)用于减少特征数据量。
最大值池化可提取图片纹理,均值池化可保留背景特征

 1.4 卷积神经网络的全过程

 1.5 PyTorch的卷积神经网络(cnn)手写数字识别

使用的框架为pytorch。

数据集:MNIST数据集,60000张训练图像,每张图像size为28*28。

可在http://yann.lecun.com/exdb/mnist/中获取

1.5.1 代码

import torch
import torch.nn as nn
import torchvision.datasets as dataset
import torchvision.transforms as transforms
import torch.utils.data as data_utils

#获取数据集
train_data=dataset.MNIST(root="D",
                         train=True,
                         transform=transforms.ToTensor(),
                         download=True
                         )
test_data=dataset.MNIST(root="D",
                         train=False,
                         transform=transforms.ToTensor(),
                         download=False
                         )
train_loader=data_utils.DataLoader(dataset=train_data, batch_size=100, shuffle=True)
test_loader=data_utils.DataLoader(dataset=test_data, batch_size=100, shuffle=True)

#创建网络
class Net(torch.nn.Module):
   def __init__(self):
        super().__init__()
        self.conv=nn.Conv2d(1, 32, kernel_size=5, padding=2)
        self.bat2d=nn.BatchNorm2d(32)
        self.relu=nn.ReLU()
        self.pool=nn.MaxPool2d(2)
        self.linear=nn.Linear(14 * 14 * 32, 70)
        self.tanh=nn.Tanh()
        self.linear1=nn.Linear(70,30)
        self.linear2=nn.Linear(30, 10)
   def forward(self,x):
        y=self.conv(x)
        y=self.bat2d(y)
        y=self.relu(y)
        y=self.pool(y)
        y=y.view(y.size()[0],-1)
        y=self.linear(y)
        y=self.tanh(y)
        y=self.linear1(y)
        y=self.tanh(y)
        y=self.linear2(y)
        return y
cnn=Net()
cnn=cnn.cuda()

#损失函数
los=torch.nn.CrossEntropyLoss()

#优化函数
optime=torch.optim.Adam(cnn.parameters(), lr=0.01)

#训练模型
for epo in range(10):
   for i, (images,lab) in enumerate(train_loader):
        images=images.cuda()
        lab=lab.cuda()
        out = cnn(images)
        loss=los(out,lab)
        optime.zero_grad()
        loss.backward()
        optime.step()
        print("epo:{},i:{},loss:{}".format(epo+1,i,loss))

#测试模型
loss_test=0
accuracy=0
with torch.no_grad():
   for j, (images_test,lab_test) in enumerate(test_loader):
        images_test = images_test.cuda()
        lab_test=lab_test.cuda()
        out1 = cnn(images_test)
        loss_test+=los(out1,lab_test)
        loss_test=loss_test/(len(test_data)//100)
        _,p=out1.max(1)
        accuracy += (p==lab_test).sum().item()
        accuracy=accuracy/len(test_data)
        print("loss_test:{},accuracy:{}".format(loss_test,accuracy))

### 回答1: 机器学习基于CNN手写数字识别是一项实验性研究,该技术可以通过训练算法和图像数据集,自动识别和分类手写数字。下面我将用300字向您介绍相关实验过程。 实验的第一步是准备数据集,可以使用MNIST数据集,该数据集包含大量手写数字图像样本。然后,我们将数据集分为训练集和测试集,用于训练和评估模型性能。 接下来,我们使用CNN模型进行手写数字识别的训练。CNN卷积神经网络)是一种常用的深度学习模型,特别适用于图像识别。该模型可以自动提取图像中的特征,并进行分类。我们通过不断调整模型的结构和参数,让其能够更好地适应手写数字识别任务。 训练过程中,我们将训练集的图像输入到CNN模型中,模型通过反向传播算法不断调整权重和偏置,以最小化预测结果与实际标签之间的误差。随着训练的进行,模型逐渐优化,使其在测试集上的准确度得到提升。 完成训练后,我们将使用测试集对模型进行评估。通过与实际标签对比,可以计算出模型的准确率、精确度、召回率等性能指标,从而评估模型的表现。 最后,我们可以使用训练好的模型进行手写数字识别。将手写数字图像输入到模型中,模型将自动输出识别结果。 这项实验的目的是将机器学习和CNN技术应用于手写数字识别,提高识别的准确度和速度。它在人工智能、图像处理等领域具有广泛的应用前景,可以为我们提供更多便利和智能化的服务。 ### 回答2: 机器学习是一种可以让计算机通过学习和训练数据来完成特定任务的方法。而基于CNN卷积神经网络)的手写数字识别实验即利用机器学习的方法来实现对手写数字的自动识别。 首先,我们需要准备一个包含大量手写数字的数据集,这些数据集中既包含手写数字图片,也包含对应的标签。在该实验中,我们需要将每个手写数字图片与其对应的数字标签建立联系。 接下来,我们可以利用CNN模型来训练和优化识别手写数字的算法。CNN是一种专门应用于图像处理和识别深度学习模型。通过分析手写数字图片中不同的特征和模式,CNN可以学习到一种有效的表示手写数字的方式。 在训练过程中,我们将数据集划分为训练集和验证集,用于训练和评估模型的性能。通过迭代训练,自动调整模型的参数和权重,使其逐渐提高识别手写数字的准确率。 完成训练后,我们可以用测试集来评估模型的性能。测试集是一个模型从未见过的数据集,用于模拟实际应用场景。通过与标签比较,我们可以计算出模型在测试集上的准确率,来评判其对手写数字识别的能力。 最后,我们可以使用训练好的CNN模型来进行实际的手写数字识别。输入一张手写数字图片,经过模型的处理和分析,输出对应的数字。 综上所述,基于CNN手写数字识别实验利用机器学习的方法训练和优化模型,以实现自动识别手写数字的功能。该实验将深度学习和图像处理的技术应用于手写数字识别,具有较高的准确率和广泛的应用前景。 ### 回答3: 机器学习是一种能够通过训练模型来让计算机对数据进行自动学习的技术。基于卷积神经网络(Convolutional Neural Network,CNN)的手写数字识别是机器学习的一项实验。 首先,为了进行手写数字识别实验,我们需要准备一个手写数字的数据集。这个数据集包含了许多手写数字的图片,每张图片都有对应的标签,表示图片所代表的数字。 接着,我们将利用CNN来构建一个模型。CNN是一种深度学习架构,它能够提取图像的特征并用于分类任务。CNN通常由多个卷积层、池化层和全连接层组成。在手写数字识别实验中,我们可以设计一个具有几个卷积层和全连接层的CNN模型。 然后,我们需要将数据集分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。在训练过程中,模型会根据训练集的数据不断调整自身的参数,以使其能够更好地对手写数字进行识别。训练的过程中需要定义损失函数和优化器来指导模型的参数更新。 训练完成后,我们将使用测试集来评估模型的性能。评估指标可以是准确率,即模型正确预测的手写数字的比例。较高的准确率表示模型对手写数字识别能力较强。 此外,为了提高模型的性能,我们还可以采取一些策略,如数据增强、超参数调节等。数据增强可以通过对训练集进行旋转、平移、缩放等操作,生成更多的训练样本,以增加模型的泛化能力。超参数调节可以通过调整模型的学习率、批大小等参数,以找到更好的模型配置。 通过这样的实验,我们可以验证基于CNN手写数字识别模型的效果,并探索机器学习在图像识别任务中的应用潜力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值