网站描述更改,怎么做动漫照片下载网站,王烨萌 俄罗斯,桥头网站建设公司一#xff1a;卷积神经网络#xff08;CNN#xff09;和手写数字识别MNIST数据集的介绍
卷积神经网络#xff08;Convolutional Neural Networks#xff0c;简称CNN#xff09;是一种深度学习模型#xff0c;它在图像和视频识别、分类和分割任务中表现出色。CNN通过模仿…一卷积神经网络CNN和手写数字识别MNIST数据集的介绍
卷积神经网络Convolutional Neural Networks简称CNN是一种深度学习模型它在图像和视频识别、分类和分割任务中表现出色。CNN通过模仿人类视觉系统的工作原理来处理数据能够从图像中自动学习和提取特征。以下是CNN的一些关键特点和组成部分
卷积层Convolutional Layer
卷积层是CNN的核心它使用滤波器或称为卷积核在输入图像上滑动以提取图像的局部特征。
每个滤波器负责检测图像中的特定特征如边缘、角点或纹理等。
卷积操作会产生一个特征图feature map它表示输入图像在滤波器下的特征响应。
激活函数
通常在卷积层之后使用非线性激活函数如ReLURectified Linear Unit以增加网络的非线性表达能力。
激活函数帮助网络处理复杂的模式并使网络能够学习更复杂的特征组合。
池化层Pooling Layer
池化层用于降低特征图的空间尺寸减少参数数量和计算量同时使特征检测更加鲁棒。
最常见的池化操作是最大池化max pooling和平均池化average pooling。
全连接层Fully Connected Layer
在多个卷积和池化层之后CNN通常包含一个或多个全连接层这些层将学习到的特征映射到最终的输出类别上。
全连接层中的每个神经元都与前一层的所有激活值相连。
softmax层
在网络的最后一层通常使用softmax层将输出转换为概率分布用于多分类任务中。
softmax函数确保输出层的输出值在0到1之间并且所有输出值的总和为1。
卷积神经网络的训练
CNN通过反向传播算法和梯度下降法进行训练以最小化损失函数如交叉熵损失。
在训练过程中网络的权重通过大量图像数据进行调整以提高分类或识别的准确性。
数据增强Data Augmentation
为了提高CNN的泛化能力经常使用数据增强技术如旋转、缩放、裁剪和翻转图像以创建更多的训练样本。
迁移学习Transfer Learning
迁移学习是一种技术它允许CNN利用在一个大型数据集如ImageNet上预训练的网络权重来提高在小型或特定任务上的性能。
CNN在计算机视觉领域的应用非常广泛包括但不限于图像分类、目标检测、语义分割、物体跟踪和面部识别等任务。由于其强大的特征提取能力CNN已成为这些任务的主流方法之一。
MNIST数据集是一个广泛使用的手写数字识别数据集可以通过TensorFlow库或Pytorch库来获取 也可以从官方网站下载MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges
MNIST数据集它包含四个部分训练数据集、训练数据集标签、测试数据集和测试数据集标签。这些文件是IDX格式的二进制文件需要特定的程序来读取。这个数据集包含了60,000张训练集图像和10,000张测试集图像每张图像都是28x28像素的手写数字范围从0到9。这些图像被处理为灰度值其中黑色背景用0表示手写数字用0到1之间的灰度值表示数值越接近1颜色越白。
MNIST数据集的图像通常被拉直为一个一维数组每个数组包含784个元素28x28像素。数据集中的每个图像都有一个对应的标签标签以one-hot编码的形式给出例如数字5的标签表示为[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]。
在机器学习模型中MNIST数据集常用于训练分类器以识别和预测手写数字。例如在深度学习中可以使用卷积神经网络CNN来处理这些图像学习从图像像素到数字标签的映射。
二通过Pytorch库建立CNN模型训练MNIST数据集
使用Python的Pytorch库来完成一个卷积神经网络CNN来训练MNIST数据集需要遵循以下步骤
导入必要的库我们需要导入Pytorch以及其它可能需要的库如torchvision用于数据加载和变换。加载MNIST数据集使用torchvision库中的datasets和DataLoader来加载和预处理MNIST数据集。定义卷积神经网络结构设计一个简单的CNN结构包括卷积层、池化层和全连接层。定义损失函数和优化器选择一个合适的损失函数如交叉熵损失以及一个优化器如Adam或SGD。训练模型在训练集上训练模型并保存训练过程中的损失和准确率。测试模型在测试集上评估模型的性能。
接下来我们将按照这些步骤使用Python代码来完成这个任务。
Step1导入必要的库
# 导入必要的库
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoaderimport torch: 导入了PyTorch的主库这是进行深度学习任务的基础。import torch.nn as nn: 导入了PyTorch的神经网络模块它包含了构建神经网络所需的许多类和函数。import torch.nn.functional as F: 导入了PyTorch的功能性API它提供了不需要维护状态的神经网络操作例如激活函数、池化等。import torchvision: 导入了PyTorch的视觉库它提供了许多视觉任务所需的工具和数据集。import torchvision.transforms as transforms: 导入了对数据进行预处理的工具。from torch.utils.data import DataLoader: 导入了PyTorch的数据加载器它可以方便地迭代数据集。
Step2加载MNIST数据集
# 加载MNIST数据集
transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])transform transforms.Compose(...): 创建了一个转换管道用于对数据进行预处理。Compose是一个函数它将多个转换步骤组合成一个转换。transforms.ToTensor(): 将图像数据从PIL Image或NumPy ndarray格式转换为浮点张量并且将像素值缩放到[0,1]范围内。transforms.Normalize((0.5,), (0.5,)): 对图像进行归一化处理。给定均值mean和标准差std这个转换将张量的每个通道都减去均值并除以标准差。在这里它将每个像素值从[0,1]范围转换为[-1,1]范围。
trainset torchvision.datasets.MNIST(root./data, trainTrue, downloadTrue, transformtransform)
testset torchvision.datasets.MNIST(root./data, trainFalse, downloadTrue, transformtransform)这两行代码分别加载了MNIST数据集的训练集和测试集。root./data: 指定数据集下载和存储的根目录。trainTrue: 对于trainset表示加载数据集的训练部分。trainFalse: 对于testset表示加载数据集的测试部分。downloadTrue: 表示如果数据集不在指定的root目录下则从互联网上下载。transformtransform: 应用之前定义的转换。
trainloader DataLoader(trainset, batch_size64, shuffleTrue)
testloader DataLoader(testset, batch_size64, shuffleFalse)这两行代码创建了两个DataLoader对象用于在训练和测试时迭代数据集。batch_size64: 指定每个批次的样本数量。shuffleTrue: 对于trainloader在每次迭代时打乱数据这对于训练是有益的因为它可以减少模型学习数据的顺序性。shuffleFalse: 对于testloader不打乱数据因为测试时不需要随机性。
得到了一个名为data的文件夹 Step3定义卷积神经网络结构
# 定义卷积神经网络结构
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 nn.Conv2d(1, 32, 3, padding1)self.pool nn.MaxPool2d(2, 2)self.conv2 nn.Conv2d(32, 64, 3, padding1)self.fc1 nn.Linear(64 * 7 * 7, 1024)self.fc2 nn.Linear(1024, 10)def forward(self, x):x self.pool(F.relu(self.conv1(x)))x self.pool(F.relu(self.conv2(x)))x x.view(-1, 64 * 7 * 7)x F.relu(self.fc1(x))x self.fc2(x)return x这段代码定义了一个名为CNN的卷积神经网络类它继承自nn.Module。__init__方法初始化了网络的结构 self.conv1是一个2D卷积层输入通道为1MNIST图像为单通道输出通道为32卷积核大小为3x3并带有1像素的填充。self.pool是一个2x2的最大池化层用于减小数据的维度。self.conv2是第二个2D卷积层输入通道为32输出通道为64卷积核大小为3x3并带有1像素的填充。self.fc1是一个全连接层它将64个通道的7x7图像映射到1024个特征。self.fc2是另一个全连接层它将1024个特征映射到10个输出对应于MNIST数据集的10个类别。forward方法定义了数据通过网络的前向传播路径 x首先通过conv1卷积层然后应用ReLU激活函数并使用pool进行池化。接着x通过conv2卷积层再次应用ReLU激活函数和池化。x.view(-1, 64 * 7 * 7)将数据扁平化为全连接层准备。x通过fc1全连接层并应用ReLU激活函数。最后x通过fc2全连接层输出结果。
# 实例化网络
net CNN()创建了一个CNN类的实例名为net。
Step4定义损失函数和优化器
# 定义损失函数和优化器
criterion nn.CrossEntropyLoss()
optimizer torch.optim.Adam(net.parameters(), lr0.001)criterion是交叉熵损失函数常用于多分类问题。optimizer是Adam优化器用于更新网络的权重。
Step5训练模型
# 训练模型
epochs 5
for epoch in range(epochs):running_loss 0.0for i, data in enumerate(trainloader, 0):inputs, labels dataoptimizer.zero_grad()outputs net(inputs)loss criterion(outputs, labels)loss.backward()optimizer.step()running_loss loss.item()print(fEpoch {epoch1}, Loss: {running_loss/(i1)})下面是这段代码的逐行解释
epochs是一个变量表示训练过程中模型将遍历整个训练数据集的次数。这里设置为5意味着整个训练数据集将被遍历5次。外层for循环它将执行epochs次。在每次迭代中epoch变量将代表当前的迭代次数从0开始到epochs-1结束。在每次epoch开始时running_loss被重置为0.0。这个变量用于累加每个epoch中的所有批次损失以便计算平均损失。这是一个嵌套的for循环它遍历trainloader返回的批次数据。enumerate函数用于遍历可迭代对象同时跟踪当前的索引这里是i。trainloader是之前定义的数据加载器它负责分批加载数据以便于训练。参数0指定了索引的起始值。然后解包了data元组其中包含输入图像和标签目标值。inputs是模型的输入数据labels是这些输入数据的正确类别标签。在每次迭代开始时调用optimizer.zero_grad()来清除之前梯度计算的结果。这是必要的因为PyTorch的梯度是累加的。输入inputs传递给神经网络net并得到输出outputs。这是模型的前向传播步骤。计算了模型输出的损失。criterion是之前定义的交叉熵损失函数它比较outputs模型的预测和labels实际类别标签来计算损失。执行了反向传播。它计算了损失相对于模型参数的梯度。更新了模型的权重。optimizer使用计算出的梯度来调整网络参数以减少下一次迭代的损失。将当前的批次损失累加到running_loss变量中用于后续计算平均损失。在每个epoch结束时打印出当前epoch的编号和平均损失。epoch1是为了从1开始计数epoch而不是从0开始。running_loss/(i1)计算了当前epoch的平均损失其中i1是当前epoch中批次的数量。
最终得到每个epoch的平均损失如下 Step6测试模型
# 测试模型
correct 0
total 0
with torch.no_grad():for data in testloader:images, labels dataoutputs net(images)_, predicted torch.max(outputs.data, 1)total labels.size(0)correct (predicted labels).sum().item()print(fAccuracy of the network on the 10000 test images: {100 * correct / total}%)correct和total是两个变量分别用于跟踪模型在测试数据集上正确预测的样本数量和总的样本数量。with torch.no_grad()是一个上下文管理器用于在测试阶段禁用梯度计算。因为测试阶段不需要计算梯度这样可以节省内存并加快计算速度。for循环遍历testloader返回的测试数据集的批次数据。这行代码解包了data元组其中包含测试图像images和它们对应的真实标签labels。这行代码将测试图像images输入到训练好的神经网络net中并得到输出outputs。torch.max(outputs.data, 1)返回两个值第一个是每个批次中最大值的元素第二个是这些最大值的索引。在这里最大值代表模型对每个图像的预测类别而索引则代表预测的类别标签。predicted是模型预测的类别标签的向量。这行代码累加测试集中总的样本数量。labels.size(0)给出了当前批次中样本的数量。(predicted labels)是一个布尔表达式它比较模型的预测predicted和真实标签labels并返回一个布尔张量其中正确预测的位置为True否则为False。.sum()计算布尔张量中True的数量即正确预测的样本数量。.item()将计算得到的张量只有一个元素转换为Python的标量值。这行代码计算并打印出模型在测试数据集上的准确率。准确率是通过将正确预测的样本数量correct除以总样本数量total然后乘以100来得到的百分比。这里假设测试数据集包含10000个样本。
得到准确率如下 使用这个建立好的卷积神经网络CNN模型主要用于训练分类器。具体来说这个模型能够识别手写数字图像并将它们分类为0到9中的一个类别。它适用于MNIST数据集。这个示例能够帮助更好的了解卷积神经网络CNN的原理。 想要探索更多元化的数据分析视角可以关注之前发布的相关内容。