机器学习实验4——CNN卷积神经网络分类Minst数据集

这篇具有很好参考价值的文章主要介绍了机器学习实验4——CNN卷积神经网络分类Minst数据集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🧡🧡实验内容🧡🧡

基于手写minst数据集,完成关于卷积网络CNN的模型训练、测试与评估。

🧡🧡 原理🧡🧡

卷积层
通过使用一组可学习的滤波器(也称为卷积核)对输入图像进行滑动窗口卷积操作,这样可以提取出不同位置的局部特征,从而捕捉到图像的空间结构信息。
激活函数
在卷积层之后,通常会应用一个非线性激活函数,如 ReLU激活函数的作用是引入非线性,使得 CNN 能够学习更复杂的特征表达。
池化层
池化层用于降低特征图的空间尺寸,同时保留最显著的特征信息(类似于人眼观物,是根据物体的主要轮廓来判断物体是什么,而对一些小细节第一眼并没有那么关注)。常见的池化方式包括最大池化和平均池化,它们可以减少计算量,并增加模型的平移不变性。
全连接层
一般在 CNN 的最后几层,全连接层被用来将先前的卷积和池化层的输出与目标类别进行关联,每个神经元在该层中与前一层的所有神经元相连,通过学习权重参数来进行分类决策。
Softmax 函数
在最后一个全连接层之后,通常会应用 Softmax 函数来将神经网络的输出转换为概率分布,用于多类别分类问题的预测。
例如p=[0.2,0.3,0.5],这表示分类为类别1、2、3的概率分别为0.2,0.3,0.5,因此预测分类结果为类别3.
最后通过反向传播算法,CNN 使用训练数据进行模型参数的优化,它通过最小化损失函数(如交叉熵)来调整网络权重,并使用梯度下降等优化算法进行迭代更新。

构建本实验的CNN网络:

  • 5 x 5的卷积核,输入通道为1,输出通道为16:此时图像矩经过卷积核后尺寸变成24 x 24。
  • 2 x 2 的最大池化层:此时图像大小缩短一半,变成 12 x 12,通道数不变;
  • 再次经过 5 x 5 的卷积核,输入通道为16,输出通道为32:此时图像尺寸经过卷积核后变成8 *8。
  • 再次经过 2 x 2 的最大池化层:此时图像大小缩短一半,变成4 x 4,通道数不变;
  • 最后将图像整型变换成向量,输入到全连接层中:输入一共有4 x 4 x 32 = 512 个元素,输出为10.
    -机器学习实验4——CNN卷积神经网络分类Minst数据集,机器学习,机器学习,cnn,分类,MINST

🧡🧡CNN实现分类Minst🧡🧡

代码

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.optim as optim
from torch import nn, optim
from time import time

# ======================准备数据集======================
batch_size = 64
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])
train_dataset = datasets.MNIST(root='../dataset/mnist/',
                               train=True,
                               download=True,
                               transform=transform)
train_loader = DataLoader(train_dataset,
                          shuffle=True,
                          batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist',
                              train=False,
                              download=True,
                              transform=transform)
test_loader = DataLoader(test_dataset,
                         shuffle=False,
                         batch_size=batch_size)


# ======================CNN net======================
class CNN_net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 16, kernel_size=5)  # 卷积1
        self.pooling1 = nn.MaxPool2d(2)  # 最大池化
        self.relu1 = nn.ReLU()  # 激活

        self.conv2 = nn.Conv2d(16, 32, kernel_size=5)
        self.pooling2 = nn.MaxPool2d(2)
        self.relu2 = nn.ReLU()

        self.fc = nn.Linear(512, 10)  # 全连接

    def forward(self, x):
        batch_size = x.size(0)
        x = self.conv1(x)
        x = self.pooling1(x)
        x = self.relu1(x)
        x = self.conv2(x)
        x = self.pooling2(x)
        x = self.relu2(x)
        x = x.view(batch_size, -1)
        x = self.fc(x)
        return x


model = CNN_net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

# ====================== train ======================
def train(epoch):
    time0 = time()  # 记录下当前时间
    loss_list = []
    for e in range(epoch):
        running_loss = 0.0
        for images, labels in train_loader:
            outputs = model(images)  # 前向传播获取预测值
            loss = criterion(outputs, labels)  # 计算损失
            loss.backward()  # 进行反向传播
            optimizer.step()  # 更新权重
            optimizer.zero_grad()  # 清空梯度
            running_loss += loss.item()  # 累加损失
        # 一轮循环结束后打印本轮的损失函数
        print("Epoch {} - Training loss: {}".format(e, running_loss / len(train_loader)))
        loss_list.append(running_loss / len(train_loader))
    # 打印总的训练时间
    print("\nTraining Time (in minutes) =", (time() - time0) / 60)

    # 绘制损失函数随训练轮数的变化图
    plt.plot(range(1, epoch + 1), loss_list)
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.title('Training Loss')
    plt.show()

train(5)

# ====================== test ======================
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt


def test():
    model.eval()  # 将模型设置为评估模式
    correct = 0
    total = 0
    all_predicted = []
    all_labels = []
    with torch.no_grad():
        for images, labels in test_loader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()

            all_predicted.extend(predicted.tolist())
            all_labels.extend(labels.tolist())
    print('Model Accuracy =:%.4f' % (correct / total))
    # 绘制混淆矩阵
    cm = confusion_matrix(all_labels, all_predicted)
    plt.figure(figsize=(8, 6))
    sns.heatmap(cm, annot=True, fmt=".0f", cmap="Blues")
    plt.xlabel("Predicted Labels")
    plt.ylabel("True Labels")
    plt.title("Confusion Matrix")
    plt.show()

test()

数据预处理:

加载数据集:
加载torch库中自带的minst数据集
转换数据:
先转为tensor变量(相当于直接除255归一化到值域为(0,1))
然后根据std=0.5,mean=0.5,再将值域标准化到(-1,1)。
(做完实验后,上网了解发现minst最合适的的std和mean分别为0.1307, 0.3081,但是其实结果都差不多,准确率变化不大,因为数据集还是相对比较简单的)

设置基本参数:

机器学习实验4——CNN卷积神经网络分类Minst数据集,机器学习,机器学习,cnn,分类,MINST

构建CNN神经网络:
同上述(1)中,已经构建完毕,这里不再赘述。
模型训练:
机器学习实验4——CNN卷积神经网络分类Minst数据集,机器学习,机器学习,cnn,分类,MINST
可见,虽然只经过5个epoch,但是花的时间为3.3min。
模型分类:
机器学习实验4——CNN卷积神经网络分类Minst数据集,机器学习,机器学习,cnn,分类,MINST
准确率达98.26%。文章来源地址https://www.toymoban.com/news/detail-819988.html

到了这里,关于机器学习实验4——CNN卷积神经网络分类Minst数据集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据深度学习:基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统

    随着社会的发展和城市化进程的加速,垃圾分类已经成为了环境保护和可持续发展的重要课题。然而,传统的垃圾分类方法通常依赖于人工识别,效率低下且易出错。因此,本项目旨在利用大数据和深度学习技术,构建一个基于 TensorFlow 深度学习的神经网络 CNN(Convolutional

    2024年04月14日
    浏览(38)
  • 【人工智能与机器学习】基于卷积神经网络CNN的猫狗识别

    很巧,笔者在几月前的计算机设计大赛作品设计中也采用了猫狗识别,目前已推国赛评选中 但当时所使用的方法与本次作业要求不太一致,又重新做了一遍,下文将以本次作业要求为主,介绍CNN卷积神经网络实现猫狗识别 猫狗识别和狗品种识别是计算机视觉领域中一个重要

    2024年02月13日
    浏览(37)
  • 【AI机器学习入门与实战】CNN卷积神经网络识别图片验证码案例

    👍【 AI机器学习入门与实战 】目录 🍭 基础篇 🔥 第一篇:【AI机器学习入门与实战】AI 人工智能介绍 🔥 第二篇:【AI机器学习入门与实战】机器学习核心概念理解 🔥 第三篇:【AI机器学习入门与实战】机器学习算法都有哪些分类? 🔥 第四篇:【AI机器学习入门与实战】

    2024年02月02日
    浏览(48)
  • 【深度学习&NLP】基于卷积神经网络(CNN)实现中文文本情感分析(分类)附代码以及数据集链接

    【注】:本文所述的实验的完整实现代码包括数据集的仓库链接会在文末给出(建议读者自行配置GPU来加速TensorFlow的相关模型,运行起来会快非常多) 目录 一、研究的背景和目的 二、文本数据集描述 1、数据集来源以及使用目的 2、数据规模、以及如何划分数据集 3、数据集的

    2024年02月04日
    浏览(38)
  • 机器学习-卷积神经网络CNN中的单通道和多通道图片差异

    最近在使用CNN的场景中,既有单通道的图片输入需求,也有多通道的图片输入需求,因此又整理回顾了一下单通道或者多通道卷积的差别,这里记录一下探索过程。 直接给出结论,单通道图片和多通道图片在经历了第一个卷积层以后,就没有单通道或者多通道的区别了,剩下

    2023年04月11日
    浏览(27)
  • 卷积神经网络(CNN)实现图像分类——Python

    卷积神经网络(CNN)实现图像分类——Python 输入 1 测试一张图片并预测结果 输入 2 对测试集整体进行测试,得出准确率(10秒左右) 输入其他数字自动退出程序 本程序包含python库较多,请自行配置(pip), 如有需求,请评论或私信 ! 回复其他数字会自动退出程序 输入图片

    2024年02月06日
    浏览(29)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(2)

    参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频4:CNN 中 stride 的概念 如上图,stride 其实就是 ”步伐“ 的概念。 默认情况下,滑动窗口一次移动一步。而当 stride = 2 时,则一次移动两步,垂直移动和水平移动都是。 当我们提高 stride 的值的时

    2024年02月06日
    浏览(27)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(1)

    先看卷积是啥,url: https://www.bilibili.com/video/BV1JX4y1K7Dr/?spm_id_from=333.337.search-card.all.clickvd_source=7a1a0bc74158c6993c7355c5490fc600 下面这个式子就是卷积 看完了,感觉似懂非懂 下一个参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频1:简单介绍卷积神经网络

    2024年02月08日
    浏览(32)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)

    参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7:CNN 的全局架构 卷积层除了做卷积操作外,还要加上 bias ,再经过非线性的函数,这么做的原因是 “scaled properly” 通常滑动窗口(filter) 不止一个,如下图 如下图是一个 CNN 的全部流程 如上图,

    2024年02月06日
    浏览(26)
  • 基于卷积神经网络CNN的图片分类实现——附代码

    目录 摘要: 1.卷积神经网络介绍: 2.卷积神经网络(CNN)构建与训练: 2.1 CNN的输入图像 2.2 构建CNN网络 2.3 训练CNN网络 3.卷积神经网络(CNN)的实际分类测试: 4.本文Matlab实验代码: 使用Matlab自带的深度学习工具箱构建卷积神经网络(CNN)进行图片分类,以识别并分类手写

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包