实验六 卷积神经网络 CNN 框架的实现与应用

部分图片可能加载不出,完整版实验报告、程序代码、所需实验数据均见本人上传资源

实验六 卷积神经网络 CNN 框架的实现与应用

一、实验目的

1. 掌握卷积神经网络 CNN 的基本原理

2. 利用 CNN 实现手写数字识别

二、实验原理

利用 LeNet-5 CNN 框架,实现手写数字识别。

1. 网络层级结构概述如图 1:7 层神经网络

Input layer: 输入数据为原始训练图像

Conv1:6 个 5*5 的卷积核,步长 Stride 为 1

Pooling1:卷积核 size 为 2*2,步长 Stride 为 2

Conv2:12 个 5*5 的卷积核,步长 Stride 为 1

Pooling2:卷积核 size 为 2*2,步长 Stride 为 2

Output layer:输出为 10 维向量

2. 实验基本流程

(1)获取训练数据和测试数据;

(2)定义网络层级结构;

(3)初始设置网络参数(权重 W,偏向 b)cnnsetup(cnn, train_x, train_y)

(4)训练超参数 opts 定义(学习率,batchsize,epoch)

(5)网络训练之前向运算 cnnff(net, batch_x)

(6)网络训练之反向传播 cnnbp(net, batch_y)

(7)网络训练之参数更新 cnnapplygrads(net, opts)

(8)重复(5)(6)(7),直至满足 epoch

(9)网络测试 cnntest(cnn, test_x, test_y)

三、实验内容

1. 数据集:MNIST 数据集,60000 张训练图像,10000 张测试图像,每张图像size 为 28*28

2. 利用 LeNet-5 CNN 框架,实现手写数字识别。

四、实验结果及分析

1. 利用交叉验证方法,分析识别结果

  1. 分析网络参数 opts 设置对最终识别结果的影响,画出相应的结果分析图

  1. 加载数据集,导入数据

在此之前,我下载了有关MNIST的数据集,后来通过查询相关资料,得知torchvision.datasets中有一些常用的数据集,其中就包含mnist,在此,直接进行下载并导入,定义预处理函数,这些预处理依次放在Compose函数中

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize([0.5], [0.5])])

下载数据集并对数据进行预处理

train_set = mnist.MNIST("./mnist_data", train=True, download=True, transform=transform)

test_set = mnist.MNIST("./mnist_data", train=False, transform=transform)

确定训练时的数据加载方式,用来把训练数据分成多个小组,此函数每次抛出一组数据。直至把所有的数据都抛出。就是做一个数据的初始化。

加载MNIST数据集:shuffle为True,则在每次epoch时重新打乱顺序

train_loader = torch.utils.data.DataLoader(train_set, batch_size=train_batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_set, batch_size=test_batch_size, shuffle=False)

  1. 构建网络

LeNet5网络有7层:

  1. 第1层:卷积层输入:原始的图片像素矩阵(长度、宽度、通道数),大小为32×32×1;

参数:滤波器尺寸为5×5,深度为6,不使用全0填充,步长为1

输出:特征图,大小为28×28×6。

 分析:因为没有使用全0填充,所以输出尺寸=32-5+1=28,深度与滤波器深度一致,为6。

  1. 第2层:池化层;输入:特征图,大小为28×28×6;

参数:滤波器尺寸为2×2,步长为2

输出:特征图,大小为14×14×6。

3.第3层:卷积层;输入:特征图,大小为14×14×6;

参数:滤波器尺寸为5×5,深度为16,不使用全0填充,步长为1;

输出:特征图,大小为10×10×16。

分析:因为没有使用全0填充,所以输出尺寸=14-5+1=10,深度与滤波器深度一致,为16。

4.第4层:池化层 输入:特征图,大小为10×10×16;

参数:滤波器尺寸为2×2,步长为2;

输出:特征图,大小为5×5。

5.第5层:全连接层;输入节点个数:5×5×16 = 400;

参数个数:5×5×16×120+120 = 48120;

输出节点个数:120。

6.第6层:全连接层;输入节点个数:120;

参数个数:120×84+84 = 10164;

输出节点个数:84。

7.第7层:全连接层

输入节点个数:84;

参数个数:84×10+10 = 850;

输出节点个数:10。

定义网络模型,初始化网络

class LeNet5(nn.Module):

def __init__(self, in_channel, output):

super(LeNet5, self).__init__()

Conv1:6 个 5*5 的卷积核,步长 Stride 为 1

Pooling1:卷积核 size 为 2*2,步长 Stride 为 2

self.layer1 = nn.Sequential(nn.Conv2d(in_channels=in_channel, out_channels=6, kernel_size=5, stride=1, padding=2),   # (6, 28, 28)
                            nn.Tanh(),
                            nn.AvgPool2d(kernel_size=2, stride=2, padding=

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在卷神经网络CNN框架实现应用中,手写数字识别是一个常见的应用场景。在这个任务中,我们需要通过训练一个CNN模型,将手写数字图像的真实标签(y_true)与模型预测输出的标签(y_pred)进行比较。 首先,我们需要收集一组带有已知标签的手写数字图像作为训练数据集。这些图像将被用作CNN模型的输入,并与其对应的标签进行关联。例如,对于一个数字为5的手写图像,我们将其与标签5进行关联。 然后,我们使用训练数据集对CNN模型进行训练。通过不断调整卷层、池化层和全连接层等组件的参数,使模型能够准确地预测手写数字的标签。训练完成后,我们得到了一个经过优化的CNN模型。 接下来,我们将使用测试数据集作为输入,通过CNN模型进行预测。针对每个输入图像,模型将输出一个数字作为预测结果(y_pred)。与此同时,测试数据集中每个图像都有其真实标签(y_true)。我们将y_true与y_pred进行比较,以评估模型的准确性。 为了评估模型的性能,我们可以计算准确率(accuracy)。准确率指的是模型在所有测试样本中正确分类的比例。我们可以将模型正确预测的样本数量除以总样本数量来计算准确率。 总之,卷神经网络框架实现应用中,手写数字识别任务包括收集并关联真实标签(y_true)和模型预测结果(y_pred),通过训练模型来使y_pred与y_true尽可能一致,并通过准确率等指标评估模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值