CNN模型手写数字识别及其相关概念

news2024/9/16 23:17:24

        

CNN相关概念
卷积神经网络(Convolutional Neural Network,CNN)是一种专门为处理具有网格结构数据的深度学习模型,例如图像、声音和文本。
卷积核

特征提取:识别和提取输入数据中的局部特征。通过在不同位置应用卷积核,网络能够捕捉到图像中的边缘、纹理、形状等特征。

降维:卷积核在应用过程中,会减少特征图(feature map)的尺寸。

参数共享:在卷积层中,同一卷积核会在整个输入数据上滑动,这意味着卷积核中的权重参数是共享的。

局部响应归一化(LRN):有助于提高特征图中的对比度,使得模型能够更好地识别图像中的关键特征。

平移不变性:卷积核的滑动窗口特性使得网络对输入数据的平移具有不变性,即网络不会因为输入数据的位置变化而改变其识别特征的能力。

卷积层使用卷积核对输入数据进行滑动窗口处理,提取局部特征。
池化层池化层位于卷积层之后,用于减小特征图的尺寸,减少参数数量,并减少过拟合的风险。
全连接层其中每个神经元都与前一层中的所有神经元相连。全连接层通常位于网络的输出层,用于将前一层的特征映射到具体的输出类别或预测。在全连接层之后,通常会使用一个或多个激活函数来产生概率分布或类别预测。

CNN一般实现步骤:
  1. 数据加载与预处理。
  2. 模型搭建。
  3. 定义损失函数、优化器。
  4. 模型训练。
  5. 模型测试。

 基于Pytorch框架实现CNN神经网络手写数字识别。
流程步骤:
  1. 导入相关库。
  2. 使用MNIST数据集,进行数据预处理。
  3. CNN模型搭建。
  4. 参数设置。
  5. 模型训练。
 步骤1代码:
import numpy as np
import torch 
from torch import nn
from torchvision import datasets, transforms,utils
from PIL import Image
import matplotlib.pyplot as plt
 步骤2代码:
# 定义超参数
batch_size = 128  # 设置每个批次(batch)的样本数为128

# 对输入的数据进行标准化处理
# transforms.ToTensor() 将图像数据转换为 PyTorch 中的张量(tensor)格式,并将像素值缩放到 0-1 的范围内。
# 这是因为神经网络需要的输入数据必须是张量格式,并且需要进行归一化处理,以提高模型的训练效果。
transform = transforms.Compose([transforms.ToTensor(),
                               transforms.Normalize(mean=[0.5],std=[0.5])])

# 加载MNIST数据集
train_dataset = torchvision.datasets.MNIST(root='./data', 
                                           train=True, 
                                           transform=transform, 
                                           download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', 
                                          train=False, 
                                          transform=transform, 
                                          download=True)

# 创建数据加载器(用于将数据分次放进模型进行训练)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
                                           batch_size=batch_size, 
                                           shuffle=True,  # 装载过程中随机乱序
                                           num_workers=2)  # 表示2个子进程加载数据
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, 
                                          batch_size=batch_size, 
                                          shuffle=False,
                                          num_workers=2)
  • batch_size = 128: 设置每次迭代中从数据集中取样的样本数量。

  • transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize(mean=[0.5], std=[0.5])]): 定义一个转换器,它包含两个子转换器:transforms.ToTensor()用于将图像数据转换为PyTorch的张量格式,并归一化像素值到0-1范围内;transforms.Normalize(mean=[0.5], std=[0.5])用于进一步标准化像素值,使其均值为0.5,标准差为0.5。

  • train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True): 创建一个MNIST数据集实例,用于训练。root='./data'指定数据集下载和存储的路径;train=True指定加载训练数据;transform=transform指定之前定义的转换器;download=True表示如果数据集不在指定路径下,则自动下载。

  • test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True): 创建一个MNIST数据集实例,用于测试。train=False指定加载测试数据。

  • train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True, num_workers=2): 创建一个数据加载器,用于训练模型。dataset=train_dataset指定要加载的数据集;batch_size=batch_size指定每个批次的大小;shuffle=True指定是否在装载过程中随机乱序;num_workers=2指定使用2个子进程来并行加载数据。

  • test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False, num_workers=2): 创建一个数据加载器,用于测试模型。shuffle=False指定在装载过程中不进行随机乱序。其他参数与训练数据加载器相同。

 步骤3代码:
class CNN(nn.Module):
    # 定义网络结构
    def __init__(self):
        super(CNN, self).__init__()  # 调用父类的初始化方法
        # 定义第一个卷积层
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=16,  # 输入通道数为1,输出通道数为16
                               kernel_size=5, stride=1, padding=2)  # 卷积核大小为5x5,步长为1,填充为2
        # 定义第一个ReLU激活函数
        self.relu1 = nn.ReLU()
        # 定义第一个池化层
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)  # 池化核大小为2x2,步长为2
        # 定义第二个卷积层
        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32,  # 输入通道数为16,输出通道数为32
                               kernel_size=5, stride=1, padding=2)  # 卷积核大小为5x5,步长为1,填充为2
        # 定义第二个ReLU激活函数
        self.relu2 = nn.ReLU()
        # 定义第二个池化层
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)  # 池化核大小为2x2,步长为2
        # 定义第一个全连接层
        self.fc1 = nn.Linear(in_features=7*7*32, out_features=256)  # 输入特征数为7x7x32,输出特征数为256
        # 定义第一个全连接层的ReLU激活函数
        self.relu3 = nn.ReLU()
        # 定义第二个全连接层
        self.fc2 = nn.Linear(in_features=256, out_features=10)  # 输入特征数为256,输出特征数为10

    # 定义前向传播过程的计算函数
    def forward(self, x):
        # 第一层卷积、激活函数和池化
        x = self.conv1(x)
        x = self.relu1(x)
        x = self.pool1(x)
        # 第二层卷积、激活函数和池化
        x = self.conv2(x)
        x = self.relu2(x)
        x = self.pool2(x)
        # 将数据平展成一维
        x = x.view(-1, 7*7*32)
        # 第一层全连接层
        x = self.fc1(x)
        x = self.relu3(x)
        # 第二层全连接层
        x = self.fc2(x)
        return x

 步骤4代码:
import torch.optim as optim

learning_rate = 0.001 # 学习率

# 定义损失函数,计算模型的输出与目标标签之间的交叉熵损失
criterion = nn.CrossEntropyLoss()
# 训练过程通常采用反向传播来更新模型参数,这里使用的是SDG(随机梯度下降)优化器
# momentum 表示动量因子,可以加速优化过程并提高模型的泛化性能。
optimizer = optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9)
#也可以选择Adam优化方法
# optimizer = torch.optim.Adam(net.parameters(),lr=1e-2)
步骤5代码:
# 实例化CNN模型
model = CNN()
num_epochs = 10  # 定义迭代次数为10

# 如果可用的话使用 GPU 进行训练,否则使用 CPU 进行训练。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 将神经网络模型 model 移动到指定的设备上。
model = model.to(device)
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 将输入数据 images 和标签数据 labels 移动到指定的设备上。
        images = images.to(device)
        labels = labels.to(device)
        optimizer.zero_grad()  # 清空上一个batch的梯度信息
        # 将输入数据 images 喂入神经网络模型 model 中进行前向计算,得到模型的输出结果 outputs。
        outputs = model(images)
        # 使用交叉熵损失函数 criterion 计算模型输出 outputs 与标签数据 labels 之间的损失值 loss。
        loss = criterion(outputs, labels)
        # 使用反向传播算法计算模型参数的梯度信息,并使用优化器 optimizer 对模型参数进行更新。
        loss.backward()
        optimizer.step()  # 更新梯度
        # 输出训练结果
        if (i + 1) % 100 == 0:
            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, i + 1, total_step, loss.item()))

print('Finished Training')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI大模型日报#0908:OpenAI计划年底推出GPT Next、Roblox官宣AI秒生3D物体模型

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)、“智谱AI”(glm-4-0520)生成了今日要点以及每条资讯的摘要。欢迎阅…

如果文件从存储卡中被误删除,存储卡数据恢复如何恢复?

如果文件被误从存储卡中删除,如何从Android 手机、相机或其他数码设备( SD/CF/MicroSD/xD ...)恢复照片视频;存储卡已格式化,原始 0 字节,空白;存储卡要求格式化;存储卡未显示、无法…

基于ONNX-YOLOv10-Object-Detection项目实现yolov10模型onnx-python推理

项目地址:https://github.com/ibaiGorordo/ONNX-YOLOv10-Object-Detection 项目依赖:onnxruntime-gpu、opencv-python、imread-from-url、cap-from-youtube、ultralytics 1、代码修改 代码改动说明:yolov10/yolov10.py中的第18行修改为以下…

Docker部署tenine实现后端应用的高可用与负载均衡

采用Docker方式的Tengine 和 keepalived 组合模式可以实现小应用场景的高可用负载均衡需求 目录 网络架构一、环境准备二、软件安装1. 下载Tenine镜像2. 下载Keepalived镜像3. 制作SpringBoot镜像 三、软件配置1. 创建应用容器2. 代理访问应用3. 创建Keepalived4. 测试高可用 网…

基于YOLOv5的积水检测模型训练:从数据到模型的全面解析

之前给大家带来了Yololov5Pyqt5Opencv 实时城市积水报警系统, 详见: Yololov5Pyqt5Opencv 实时城市积水报警系统_yolo opencv pyqt5-CSDN博客 今天详细解析一下积水检测模型训练部分的内容 在积水检测项目中,实时性和准确性是至关重要的。…

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介 1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置&a…

Spring Boot事务管理

事务管理 事务进阶 如果在删除了部门之后,出现了异常。那么就会出现部门被删除之后其中的员工并未被删除。 Transactional注解,在事务执行完成之后自动提交或者回滚。只需要在执行多次数据修改的事务上加上该注解即可。(比如两次Update或者…

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建 首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件…

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…

11.5.软件系统分析与设计-面向对象的程序设计与实现

面向对象的程序设计与实现 设计模式 Java代码 C代码

Android13_SystemUI下拉框新增音量控制条

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Android13_SystemUI下拉框新增音量控制条 一、必备知识二、源码分析对比1.brightness模块分析对比2.statusbar/phone 对应模块对比对比初始化类声明对比构造方法 三、源码修改…

操作系统week1

操作系统学习 一.操作系统概述 1.概念、功能 操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境 #mermaid-svg-SpFSwhrPg2GwVnYt {font-family:"trebuch…

【Python 千题 —— 算法篇】数字反转

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 整数反转是一个经典的算法问题,常见于各种编程竞赛和技术面试中。它要求我们将给定的整数按位进行翻转,并返…

c++ string类的模拟实现的注意事项

一.构造函数 第一种形式,使用字符指针赋值 为了防止修改,我们传入了常量字符串。但是这里的初始化列表出错了,因为_str是一个变量,将常量给到一个变量涉及到权限的放大,是错误的。那该怎么写呢?对_str的赋…

证书学习(四)X.509数字证书整理

目录 一、X.509证书 介绍1.1 什么是 X.509证书?1.2 什么是 X.509标准?1.3 什么是 PKI?二、X.509证书 工作原理2.1 PKI 的基础——加密算法2.2 PKI 证书编码三、X.509证书 结构3.1 证书字段3.2 证书扩展背景: 我们在日常的开发过程中,经常会遇到各种各样的电子证书文件,其…

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所…

虚拟机VMware桥接网络命令来重置 /etc/sysconfig/network-scripts/ifcfg-ens33 文件

ifcfg-ens33 文件专门用于配置这个特定的网络接口。 有时候把ifcfg-ens33文件配置弄乱了,可以使用命令重置。 最常用的方式是通过 nmcli 或者 nmtui 来重置网络接口的配置。 第一种方法. 使用 nmcli 命令重置网络配置 nmcli 是一个强大的网络管理命令行工具&…

闯关leetcode——3.Longest Substring Without Repeating Characters

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ 内容 Given a string s, find the length of the longest substring without repeating characters. Example 1: Input: s “abc…

力扣最热一百题——矩阵置零

目录 题目链接:73. 矩阵置零 - 力扣(LeetCode) 题目描述 示例 提示: 解法一:采用标记数组遍历处理 Java写法: C写法: 优化 解法二:优化解法之标记变量 Java写法:…

【鸿蒙HarmonyOS NEXT】UIAbility的生命周期

【鸿蒙HarmonyOS NEXT】UIAbility的生命周期 一、环境说明二、UIAbility的生命周期三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、UIAbility的生命周期 概念: HarmonyOS中的UIAbility是一种包含…