
卷积神经网络卷积神经网络, 也就是CNN, 是深度学习模型的一种, 这类模型专门处理具有网格状拓扑结构的数据, 像图像就是这样的数据。计算机视觉任务, 像图像分类、目标检测以及分割, 其核心技术是CNN。就下面的这张图而言呢, 它去显现了一个典型的卷积神经网络, 也就是 CNN 的结构, 以及其工作流程, 此二者是用于图像识别任务的。当处于图里时, CNN的输出层面给予出了概率, 这概率是关于三个类别的, 其中一个类别概率为0.2, 另一个类别是Goofy概率为0.1, 余下一个类别概率为0.7, 而这情况表明网络思索着输入图像的可能性最大状态是。以下是各个部分的简要说明卷积神经网络的基本结构1、输入层Input Layer接收到原始的图像数据, 图像一般是以一个三维数组来进行表示的, 其中存在两个维度, 这两个维度分别是用以表示图像的宽度以及像的高度, 而第三个维度是用来代表颜色通道的, 比如RGB图像所具有的颜色通道数量是三个。2、卷积层 Layer用卷积核提取局部特征如边缘、纹理等。公式将一组能够进行学习的滤波器, 也就是卷积核, 运用在输入的图像上, 开展卷积操作, 以此来提取局部方面的特征。滤波器于输入图像之上滑动, 进而生成了一个可以表示滤波器于不同位置激活情况的特征图Map。这是一个卷积层这个卷积层能有好多滤波器, 这些滤波器中的任意一个, 都能生成一个特征图, 而产生的所有特征图, 会共同组成一个特征图集合。3、激活函数 在卷积层之后, 一般会应用非线性激活函数, 像是 ReLU Unit, 以便引入非线性特性, 进而让网络能够学习更为复杂的模式。ReLU函数的定义是这样的, 具体说来, 它是f(x)max(0,x), 也就是说, 一旦输入小于0, 那么输出的便会是0, 不然呢, 不然输出的就是输入值了。4、池化层 Layer5、归一化层 Layer可选6、全连接层Fully Layer7、输出层 Layer根据任务的不同输出层可以有不同的形式。通常在分类任务当中, 会运用函数把输出转化成概率分布, 以此来呈现输入归属于各个类别的概率。8、损失函数Loss 用于衡量模型预测与真实标签之间的差异。有种常见的损失函数, 其中交叉熵损失也就是Cross⁃ Loss, 它被用于多分类任务中来使用, 还有均方误差也就是Mean Error且简称为MSE的这种情况, 它是被用在回归任务之中的。9、优化器更新网络权重, 是依据损失函数的梯度来进行的。常见的优化器含随机梯度下降, 也就是SGD、Adam等。10、正则化可选包括 、L1/L2 正则化等技术用于防止模型过拟合。这些层可以堆叠形成更深的网络结构以提高模型的学习能力。CNN 的深度和复杂性可以根据任务的需求进行调整。实现一个 CNN 实例以下示例呈现, 怎样运用, 去搭建, 一个简易的, CNN 模型, 以供对 MNIST 数据集, 进行数字分类, 所使用, 的方式。主要步骤1、导入必要库import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim2、数据加载使用 提供的 MNIST 数据集加载和预处理数据。实例 .(.(), # 转为张量.((0.5,), (0.5,)) # 归一化到-1, 1# 加载 MNIST 数据集你提供的内容似乎不太完整且存在格式问题, 不太能明确其确切意思并准确改写。请你检查或补充完整准确的内容以便我能更好地为你改写。这句代码似乎不太完整且格式有误, 不太能按照需求准确改写。请提供完整正确的代码句子以便重新进行改写。你提供的内容不太完整且难以理解其确切含义, 不太便于进行准确改写。请补充完整清晰的内容以便我更好完成任务。这段内容似乎不太清晰且包含错误表述, 不太能准确理解其确切含义并进行有效改写。请你检查或补充完整准确的内容。3、定义 CNN 模型使用 nn. 构建一个 CNN。实例class (nn.):def (self):super(, self).()# 定义卷积层输入1通道输出32通道卷积核大小3x3# 定义卷积层输入32通道输出6N通道self.conv2等于nn, 其中参数为32, 64, 卷积核大小为3, 步长为1, 填充为1。# 定义全连接层设置 self.fc1 为 nn., 其参数为(64 乘以 7 乘以 7, 128) , 这里输入大小等于特征图大小乘以通道数。self.fc2等于nn, nn是(128, 10), 这里的10代表着10个类别。def (self, x):将x赋值为, 对x进行第一层卷积操作后, 再应用 F.relu函数的结果 , 这是第一层卷积加上 ReLU操作。x F.(x, 2) # 最大池化x等于, F的relu函数作用于, self的conv2函数作用于x的结果, 这是第二层卷积与ReLU的操作。x F.(x, 2) # 最大池化进行展平操作, x等于x.view, 其参数为负一, 以及64乘以7乘以7。x等于, F的relu函数作用于, 将x输入到, self的fc1函数后得到的结果, 这里是全连接层加上ReLU。先是有这么个变量“x”, 接下来, 它等于“self.fc2”作用于“x”时所产生的结果, 而这一结果, 是全连接层的输出。x# 创建模型实例model ()4、定义损失函数与优化器使用交叉熵损失和随机梯度下降优化器。criterion nn.CrossEntropyLoss() # 多分类交叉熵损失 optimizer optim.SGD(model.parameters(), lr0.01, momentum0.9) # 学习率和动量5、训练模型将模型进行训练, 历经5个 epoch, 在每一个 epoch完成之后, 把训练当中产生的损失给输出出来。实例 5model.train() # 设为训练模式for epoch in range(): 0for , in :# 前向传播 model()loss (, )# 反向传播.()loss.().step() loss.item()print(fEpoch{epoch1}/{}, Loss: { / len():.4f})6、测试模型在测试集上评估模型的准确率。实例model.eval() # 设置为评估模式 0total 0with torch.(): # 评估时不需要计算梯度for , in : model()_, torch.max(, 1) # 预测类别total .size(0) ( ).sum().item() 100 * / totalprint(fTest : {:.2f}%)7、完整代码完整代码如下实例torchtorch.nn as nntorch.nn. as Ftorch.optim as optimfrom ,# 1. 数据加载与预处理 .(.(), # 转为张量.((0.5,), (0.5,)) # 归一化到-1, 1# 加载 MNIST 数据集 .MNIST(root./data, trainTrue, , True) .MNIST(root./data, trainFalse, , True) torch.utils.data.(, 64, True) torch.utils.data.(, 64, False)# 2. 定义 CNN 模型class (nn.):def (self):super(, self).()# 定义卷积层自卷积2等于神经网络模块, 其参数为32, 64, 卷积核大小为3, 步长为11, 填充为11, 输入通道数为32, 输出通道数为6N通道。# 定义全连接层elf.fc1被设定为nn., 其参数为(64 * 7 * 7, 128) , 用于展平后输入到全连接层。self.fc2 nn.(128, 10) # 10 个类别def (self, x):x F.relu(self.conv1(x)) # 第一层卷积 ReLUx F.(x, 2) # 最大池化x F.relu(self.conv2(x)) # 第二层卷积 ReLUx F.(x, 2) # 最大池化x F.relu(self.fc1(x)) # 全连接层 ReLUx 等于, 取自自身的 fc2 作用于 x 的值, 此为最后一层输出。x# 创建模型实例model ()# 3. 定义损失函数与优化器 nn.() # 多分类交叉熵损失# 4. 模型训练 5model.train() # 设置模型为训练模式for epoch in range(): 0for , in : model() # 前向传播loss (, ) # 计算损失.() # 清空梯度loss.() # 反向传播.step() # 更新参数 loss.item()print(fEpoch{epoch1}/{}, Loss: { / len():.4f})# 5. 模型测试model.eval() # 设置模型为评估模式 0total 0with torch.(): # 关闭梯度计算for , in : model()_, torch.max(, 1)total .size(0) ( ).sum().item() 100 * / totalprint(fTest : {:.2f}%)运行结果说明1. 输出的训练损失代码中每个 epoch 会输出一次平均损失例如Epoch [1/5], Loss: 0.2325 Epoch [2/5], Loss: 0.0526 Epoch [3/5], Loss: 0.0366 Epoch [4/5], Loss: 0.0273 Epoch [5/5], Loss: 0.0221解释损失逐渐下降表明模型在逐步收敛。2. 测试集的准确率代码在测试集上输出最终的分类准确率例如Test Accuracy: 98.96%先说, 模型针对MNIST测试集的分类准确率有着98.96%, 再说, 这对于简单的CNN模型来讲算是一个不错的结果。7、可视化结果我们可以在测试数据中可视化一些样本及其预测结果。实例torchtorch.nn as nntorch.nn. as Ftorch.optim as optimfrom ,. as plt# 1. 数据加载与预处理 .(.(), # 转为张量.((0.5,), (0.5,)) # 归一化到-1, 1# 加载 MNIST 数据集 .MNIST(root./data, trainTrue, , True) .MNIST(root./data, trainFalse, , True) torch.utils.data.(, 64, True) torch.utils.data.(, 64, False)# 2. 定义 CNN 模型class (nn.):def (self):super(, self).()# 定义卷积层self.conv1 nn.(1, 32, 3, 1, 1) # 输入1通道输出32通道self.conv2 nn.(32, 64, 3, 1, 1) # 输入32通道输出6N通道# 定义全连接层self.fc1 nn.(64 * 7 * 7, 128) # 展平后输入到全连接层self.fc2 nn.(128, 10) # 10 个类别def (self, x):x F.relu(self.conv1(x)) # 第一层卷积 ReLUx F.(x, 2) # 最大池化x F.relu(self.conv2(x)) # 第二层卷积 ReLUx F.(x, 2) # 最大池化x x.view(-1, 64 * 7 * 7) # 展平x F.relu(self.fc1(x)) # 全连接层 ReLUx self.fc2(x) # 最后一层输出x# 创建模型实例model ()# 3. 定义损失函数与优化器 nn.() # 多分类交叉熵损失 optim.SGD(model.(), lr0.01, 0.9)# 4. 模型训练 5model.train() # 设置模型为训练模式for epoch in range(): 0for , in : model() # 前向传播loss (, ) # 计算损失.() # 清空梯度loss.() # 反向传播.step() # 更新参数 loss.item()print(fEpoch{epoch1}/{}, Loss: { / len():.4f})# 5. 模型测试model.eval() # 设置模型为评估模式 0total 0with torch.(): # 关闭梯度计算for , in : model()_, torch.max(, 1)total .size(0) ( ).sum().item() 100 * / totalprint(fTest : {:.2f}%)# 6. 可视化测试结果 iter(), next() model()_, torch.max(, 1)for i in range(6):axes.(, cmapgray)axes.(fLabel: {}\nPred: {})axes.axis(off)plt.show()可视化结果展示了 6 个测试样本的实际标签与预测值例如注意几种错误在下载MNIST数据集这个行为发生之时, 因SSL证书验证是失败的这种状况, 致使没办法去下载数据。Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz Failed to download (trying next): ...解决办法打开终端运行以下命令来安装/更新 SSL 证书/Applications/Python\ 3.x/Install\ Certificates.command其中 3.x 替换为你实际安装的 版本。运行这个命令之后, 再次运行你 的、代码, 此代码应能够成功地、下载MNIST数据集。