CNN神经网络训练minist数据集代码+傻瓜注释

Pytorch:关于epoch、batch_size和batch_idx(iteration )的一些理解(深度学习) 前言 在新手搭建神经网络时,常弄不清epoch、batch_size、iteration和batch_idx(iteration )的区别。 这里以torchvision自带的CIFAR10数据集来举例,通过代码操作来直观地对这几个概念进行理解。 声明,这里batch_idx==iteration。 数据准备 首先加载数据集: import torch import torch.nn as nn import torchvision train_dataset = torchvision.datasets 阅读详情

 因为最近在学神经网络的课程,但是之前仅仅听说过这个玩意,但是这方面代码基础可以认为是0

就找了一篇大神博客给的代码(原文链接我放到这篇博客末尾了),把必要的部分留下,并且为了看明白一个函数一个函数的去搜到底是做啥用的,说实话在这方面下了不少功夫,最后注释基本差不多挺全了,纯纯新手看明白应该是完全没问题的

极个别的只要是有点python基础就能了解个大差不差,像是print的格式化输出啥的,所以也就直接跳过了

import torch
import torchvision
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

n_epochs = 3            # 循环整个训练数据集的次数
batch_size_train = 64   # 每个训练batch有多少个样本 比如有1000个样本,把这些样本分为10批,就是10个batch
batch_size_test = 1000  # 每个测试训练batch有多少个样本
learning_rate = 0.01    # 学习率:learning_rate = 0.01
momentum = 0.5          
# momentum:我们把这个人从平地上放到了一个斜坡上, 只要他往下坡的方向走一点点, 由于向下的惯性, 他不自觉地就一直往下走,
# 走的弯路也变少了. 这就是 Momentum 参数更新
log_interval = 10       # 日志输出间隔,多少次print一下
random_seed = 1         # 随机种子
torch.manual_seed(random_seed)

train_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data/', train=True, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size_train, shuffle=True)

test_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data/', train=False, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size_test, shuffle=True)

# torch.utils.data.DataLoader
# 用来把训练数据分成多个小组,此函数每次抛出一组数据。直至把所有的数据都抛出。最终的输出结果是一整块内容,内容内部是一批一批的
# 就是做一个数据的初始化。
# 批训练,把数据变成一小批一小批数据进行训练。

# torchvision:视觉工具包
# torchvision.datasets.MNIST:在pytorch下可以直接调用torchvision.datasets里面的MNIST数据集

# transforms:提供常用的数据预处理操作
# transforms.Compose:将多个变换方式结合在一起
# 参数:一个list数组,数组里是多个'Transform'对象,即[transforms, transforms...]
# 操作:遍历list数组,对img依次执行每个transforms操作,并返回transforms后的img


# 我们一般在pytorch或者python中处理的图像无非这几种格式:
# PIL:使用python自带图像处理库读取出来的图片格式
# numpy:使用python-opencv库读取出来的图片格式
# tensor:pytorch中训练时所采取的向量格式(当然也可以说图片)

# transforms.ToTensor:将(范围在0-255) 转成(范围为0.0-1.0)  返回Tensor类型的图片
# 一方面将图片数据shape成【channel, w, h】,另一方面将图片array转化为tensor
# Tensor有不同的数据类型,每种类型又有CPU和GPU两种版本,默认的tensor类型是FloatTensor
# 有点像numpy中的array

# transforms.Normalize(mean,std):标准化(归一化)——data减去它的均值,再除以它的标准差
# 最终呈现均值为0方差为1的数据分布
# mean (squence):每个通道的均值
# std (sequence):每个通道的标准差
# 还需要保持train_set、val_set和test_set标准化系数的一致性。
# 标准化系数就是计算要用到的均值和标准差,在本例中是((0.1307,), (0.3081,)),均值是0.1307,标准差是0.3081
# 这些系数都是数据集提供方计算好的数据
# 因为mnist数据值都是灰度图,所以图像的通道数只有一个,因此均值和标准差各一个

# batch_size(int, optional): 每个batch有多少个样本
# shuffle(bool, optional): 在每个epoch开始的时候,对数据进行重新排序
# 先打乱,再取batch
# Shuffle是一种训练的技巧,因为机器学习其假设和对数据的要求就是要满足独立同分布。
# 所以任何样本的出现都需要满足“随机性”。所以在数据有较强的“人为”次序特征的情况下,Shuffle显得至关重要。
# 1、Shuffle可以防止训练过程中的模型抖动,有利于模型的健壮性
# 假设训练数据分为两类,在未经过Shuffle的训练时,首先模型的参数会去拟合第一类数据,当大量的连续数据(第一类)输入训练时,会造成模型在第一类数据上的过拟合。
# 当第一类数据学习结束后模型又开始对大量的第二类数据进行学习,这样会使模型尽力去逼近第二类数据,造成新的过拟合现象。
# 这样反复的训练模型会在两种过拟合之间徘徊,造成模型的抖动,也不利于模型的收敛和训练的快速收敛
# 2、Shuffle可以防止过拟合,并且使得模型学到更加正确的特征
# NN网络的学习能力很强,如果数据未经过打乱,则模型反复依次序学习数据的特征,很快就会达到过拟合状态,并且有可能学会的只是数据的次序特征。模型的缺乏泛化能力。
# 如:100条数据中前50条为A类剩余50条为B类,模型在很短的学习过程中就学会了50位分界点,且前半部分为A后半部分为B。则并没有学会真正的类别特征。

examples = enumerate(test_loader)
# enumerate():遍历一个集合对象,它在遍历的同时还可以得到当前元素的索引位置。
# 遍历了列表的所有元素,并通过增加从零开始的计数器变量来为每个元素生成索引
batch_idx, (example_data, example_targets) = next(examples)
# next():指针指向下一条记录,有记录(有值)返回true并把记录内容存入到对应的对象中

# print(example_targets)
# 输出:tensor([3, 9, 4, 9, 9, 0, 8,....
# example_targets是图片实际对应的数字标签:

# print(example_data.shape)
# 输出:torch.Size([1000, 1, 28, 28])  一批测试数据是一个形状张量
# 这意味着我们有1000个例子的28x28像素的灰度

class Net(nn.Module):
    # nn.Module其实是PyTorch体系下所有神经网络模块的基类,这里其实是继承
    # 在Pytorch的nn模块中,它是不需要你手动定义网络层的权重和偏置的
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        # 两个卷积层
        # 输入通道数,输出通道数,卷积核大小(5*5)
        self.conv2_drop = nn.Dropout2d()
        # torch.nn.Dropout2d是对每个通道按照概率0.5置为0
        # 防止模型过拟合
        # 神经网络的输入单元是否归零服从伯努利分布,并以概率p随机地将神经网络的输入单元归零。
        # 一般用在全连接层
        # 也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。
        # 但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)
        # 两个全连接层
        # 处理后后会输出一个N维向量,N是该程序必须选择的分类数量。
        # 如果你想得到一个数字分类程序,如果有10个数字,N就等于10
        # in_features: int, out_features: int, bias: bool = True

    def forward(self, x):
        # forward()传递定义了使用给定的层和函数计算输出的方式。
        x = F.relu(F.max_pool2d(self.conv1(x), 2))  # kernel_size=2  kernel_size可以看做是一个滑动窗口 2*2
        # max_pool2d()  把4个合并成1个
        # 最大池化层
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        # relu 激活运算
        # 没有激活函数的每层都相当于矩阵相乘。
        # 给一个在卷积层中刚经过线性计算操作的系统引入非线性特征
        # 线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。
        # 对输入内容的所有值都应用了函数 f(x) = max(0, x)
        # 会增加模型乃至整个神经网络的非线性特征,而且不会影响卷积层的感受野
        # 激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类
        x = x.view(-1, 320)
        # 参数中的-1就代表这个位置由其他位置的数字来推断
        # 比如atensor的数据个数是6个,如果view(1,-1),我们就可以根据tensor的元素个数推断出-1代表6
        # 将提取出的特征图进行铺平,将特征图转换为一维向量
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)
        # log_softmax()
        # 先softmax,再作log, 其实就是复合函数
        # softmax激活函数的计算方式是对输入的每个元素值x求以自然常数e为底的指数,然后再分别除以他们的和
        # logsoftmax其实就是对softmax求出来的值再求一次log值
        # 加快运算速度,提高数据稳定性

network = Net()
optimizer = optim.SGD(network.parameters(), lr=learning_rate, momentum=momentum)
# optim.SGD()
# 这个对象能保存当前的参数状态并且基于计算梯度更新参数
# 学习率:learning_rate = 0.01
# 学习率以 0.01 ~ 0.001 为宜。
# 学习率过大时,学习速率很快,但是易损失值爆炸,易震荡
# 学习率过小时,速度很慢,容易过拟合,收敛速度也慢
# momentum:我们把这个人从平地上放到了一个斜坡上, 只要他往下坡的方向走一点点, 由于向下的惯性, 他不自觉地就一直往下走,
# 走的弯路也变少了. 这就是 Momentum 参数更新

train_losses = []
train_counter = []
test_losses = []
test_counter = [i * len(train_loader.dataset) for i in range(n_epochs + 1)]

def train(epoch):
    network.train()
    # pytorch可以给我们提供两种方式来切换训练和评估(推断)的模式。分别是:model.train()和model.eval()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()   # 将梯度归零  梯度就表示从该点出发,函数值增长最为迅猛的方向
        output = network(data)
        loss = F.nll_loss(output, target)   # 损失函数计算损失值
        loss.backward()     # 反向传播计算得到每个参数的梯度值
        optimizer.step()    # 通过梯度下降执行一步参数更新,会更新所有的参数
        if batch_idx % log_interval == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data),
                                                                           len(train_loader.dataset),
                                                                           100. * batch_idx / len(train_loader),
                                                                           loss.item()))
            train_losses.append(loss.item())
            train_counter.append((batch_idx * 64) + ((epoch - 1) * len(train_loader.dataset)))
            torch.save(network.state_dict(), './model.pth')
            torch.save(optimizer.state_dict(), './optimizer.pth')

def test():
    network.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():   # 所有计算得出的tensor的requires_grad都自动设置为False
        # requires_grad:是Pytorch中通用数据结构Tensor的一个属性,用于说明当前量是否需要在计算中保留对应的梯度信息
        # 我的理解是因为这是测试,不需要再对参数进行修改了
        for data, target in test_loader:
            output = network(data)
            test_loss += F.nll_loss(output, target, reduction='sum').item()
            # reduction:对计算结果采取的操作,通常我们用sum(对N个误差结果求和), mean(对N个误差结果取平均),默认是对所有样本求loss均值
            pred = output.data.max(1, keepdim=True)[1]
            # .data.max用于找概率最大的下标
            correct += pred.eq(target.data.view_as(pred)).sum()
            # 正确的个数
    test_loss /= len(test_loader.dataset)
    test_losses.append(test_loss)
    print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))
    # Test set: Avg.loss: 0.0921, Accuracy: 9709 / 10000(97 %)

for epoch in range(1, n_epochs + 1):
    train(epoch)
    test()
    print("*"*60)

在此附上我看的那篇大神的博客

http://t.csdn.cn/flbBu

利用MINIST数据集识别手写数字 阅读详情

相关推荐

minist数据集的获取方法

在官网下载minist数据集,速度感人。因此特意上传了一份,供需要的朋友下载:minist数据集 第一次打开这个数据集,也是一脸懵,不过还好,脱坑代码如下: import numpy as np import os # 训练集 with open('./minist_data/train-images.idx3-ubyte') as f: loaded = np.fromfile(fil...

我是小蚂蚁 4647

一.卷积神经网络(CNN)实现minist数据集

minist数据集识别

qq_43917080的博客 4143

深度学习入门:Minst数据集实战教程

MNIST数据集(Modified National Institute of Standards and Technology database)是一个广泛用于训练各种图像处理系统的手写数字识别数据集。由于其分类问题的相对简单性和代表性,它成为了深度学习和机器学习入门的经典数据集。在使用Minst数据集教学时,首先要从深度学习的基础知识入手。这包括了解神经网络的基本结构,如输入层、隐藏层和输出层,以及它们是如何协同工作来解决复杂问题的。

weixin_31860973的博客 1727

[ 数据集 ] MINIST 数据集介绍

[ 数据集 ] MINIST 数据集介绍 MINIST ``Size:`` 28×28 灰度手写数字图像; ``Num:`` 训练集 60000 和 测试集 10000,一共70000张图片; ``Classes:`` 0,1,2,3,4,5,6,7,8,9; 具体介绍了数据集的读取与可视化操作等 ...

A_John 的博客 2万+

组合导航、惯导、GNSS、INS、IMU的区别

‌:惯性导航系统(INS)是一种利用安装在运载体上的陀螺仪和加速度计来测定运载体位置的系统。它通过测量物体的加速度和角速度,结合算法计算出物体的位置、速度和姿态‌12。‌。

wynn1123的博客 8048

双目立体成像(一)双目图片生成点云

利用左右目图片生成点云

qq_62964142的博客 4549

算法工程师修仙之路:Keras(四)

深度学习基础 神经网络的数学基础 初识神经网络 我们来看一个具体的神经网络示例,使用 Python 的 Keras 库来学习手写数字分类。 我们这里要解决的问题是,将手写数字的灰度图像(28 像素 × 28像素)划分到10个类别中(0~9)。 我们将使用 MNIST 数据集,它是机器学习领域的一个经典数据集,其历史几乎和这 个领域一样长,而且已被人们深入研究。 这个数据集包含60...

faker1895的博客 568

DETRs with Collaborative Hybrid Assignments Training论文阅读与代码

在这篇论文中,作者观察到在DETR中将过少的 Query 分配为正样本,采用一对一的集合匹配,会导致对编码器输出的监督稀疏,严重损害编码器的区分特征学习,反之亦然,也会影响解码器中的注意力学习。为了缓解这个问题,作者提出了一种新颖的协同混合分配训练方案,名为Co-DETR,以从多样的标签分配方式中学习更高效、更有效的基于DETR的检测器。这种新的训练方案可以通过训练多个并行辅助 Head ,以一对多的标签分配方式(如ATSS和Faster RCNN)进行监督,轻松增强端到端检测器中编码器的学习能力。

qingjing0413的博客 1153

从手写数字识别入门深度学习丨MNIST数据集详解

就像无数人从敲下“Hello World”开始代码之旅一样,许多研究员从“MNIST数据集”开启了人工智能的探索之路。

OpenDataLab的博客 4万+

Python爬虫实战:如何通过解析JSON数据抓取抖音视频评论

本文介绍了如何使用Python爬虫抓取抖音视频评论数据。请求头伪造:通过使用随机的User-Agent,模拟真实用户的请求。代理池:使用代理IP来避免被封禁。JSON解析:直接从API接口获取JSON格式的数据,避免了动态加载内容的限制。需要注意的是,抓取网站数据时应遵守网站的爬虫协议,避免过度抓取影响网站性能或违反法律法规。希望本文能够帮助你掌握如何抓取和分析抖音视频评论数据!

2201_76125261的博客 3358

链路状态路由协议 OSPF (一)

本章将会学习链路状态路由协议OSPF,理解OSPF的基本概念,工作原理,掌握OSPF配置基本命令。本章重点,OSPF的基本概念,OSPF配置。

yj11290301的博客 3473

神经网络简介 & 利用minist数据集实现手写数字识别和识别精度计算

三层神经网络实现 输入层到第一层信号传递: X = np.array([1.0, 0.5]) #输入 W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) #权重 B1 = np.array([0.1, 0.2, 0.3])#偏置 print(W1.shape) # (2, 3) print(X.shape) # (2,) print(B1.shape) # (3,) A1 = np.dot(X, W1) + B1 #这个A1的结果还没有经过激活函数

weixin_45019830的博客 2894

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2633

MINIST手写数字数据集–神经网络(mini-batch)

MINIST手写数字数据集–神经网络(mini-batch)

qq_51316618的博客 1万+

C#上位机+YOLO工业视觉全实战:从ONNX部署到产线缺陷检测落地(2026年工业级实战指南)

在2026年,工业视觉落地的核心挑战不是“能不能做”,而是“能不能在产线实时跑起来C#为何成为最优解?

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 730

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MINIST——SVM

本文研究了基于SVM的手写数字识别方法,使用MNIST数据集进行实验。首先对原始数据进行预处理,包括像素级统计分析、数据展平、特征缩放和数据裁剪。然后训练了三种核函数的SVM模型(线性核、多项式核和高斯核),并通过混淆矩阵和ROC曲线评估性能。实验结果表明,高斯核SVM达到最高准确率93.1%。研究分析了不同核函数的适用性,指出高斯核最适合处理这种非线性数据,同时提出未来可探索深度学习方法以进一步提升性能。该研究为手写数字识别提供了有效的SVM实现方案,并明确了优化方向。

qq_37543124的博客 1113

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MNIST数据集

MNIST数据集

Iron802的博客 6万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

epoch,batch_size,iteration,batch_idx什么意思

文章目录1、iteration2、batch_size3、epoch 1、iteration 表示进行了一次迭代,每次迭代完成以后更新模型参数 2、batch_size 表示每次迭代使用多少样本。 比如说有6400张图片,设定batch_size=64,则每次迭代只使用64张图片 3、epoch 表示一波,将所有数据集训练完一遍。比如说有6400张照片,每次迭代使用64张,一个epoch就代表进行了100次迭代。 ...

xdg15294969271的博客 1734

minist数据集训练与测试

1

weixin_61576710的博客 2507

手写数据集minist基于pytorch分类学习

这个数据集包含70000张手写数字图片,分别是60000张训练图片和10000张测试图片,训练集由来自250个不同人手写的数字构成,一般来自高中生,一半来自工作人员,测试集(test set)也是同样比例的手写数字数据,并且保证了测试集和训练集的作者不同。训练过程中的打印信息我进行了修改,这里设置的训练轮数是15轮,每次训练生成的pkl模型参数也是会更新的,想要更多训练信息可以查看对应的教程哦~里面的图片数据如下所示,每张图是0-9的手写数字黑底白字的图片,存储时,黑色用0表示,白色用0-1的浮点数表示。

m0_57265868的博客 2269

pytorch学习笔记(三)——MNIST手写数据集

pytorch入门之简单回归问题目录基础知识准备功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 目录 基础知识准备 我...

weixin_43886278的博客 1649

深度学习(1)——CNN训练MINIST手写数字数据集

CNN训练MINIST数据集,适合小白的新手卷积神经网络项目!!

qq_45144394的博客 1703

Mnist数据集简介

MNIST是一个手写体数字的图片数据集,该数据集来由美国国家标准与技术研究所(National Institute of Standards and Technology (NIST))发起整理,一共统计了来自250个不同的人手写数字图片,其中50%是高中生,50%来自人口普查局的工作人员。该数据集的收集目的是希望通过算法,实现对手写数字的识别。 1998年,Yan LeCun 等人发表了论文《Gradient-Based Learning Applied to Document Recognition》

查理王的博客 6万+

mindspore环境配置及运行minst数据集

复制命令直接安装即可,这里不建议使用conda命令安装,我这边经常出现找不到镜像的情况,只要是切换到conda创建的环境下,使用pip安装只会安装到当前环境。运行:我装的cuda的版本是11.8,稍微高了一点,但似乎不影响正常使用。安装GPU版需要CUDA和cudnn,虚拟环境下的安装看我另一篇文章。安装完cuda和cudnn后,进入mindspore官网。2、minist数据集实验。使用nvidia-smi。

qq_25434875的博客 866

基于全连接神经网络的minist数据集分类

本实验主要构建并训练一个四层全连接神经网络,以识别MNIST数据集中的手写数字。通过使用归一化、激活函数和交叉熵损失函数,以及采用SGD优化器进行训练,实验成功实现了模型的训练过程。模型通过训练损失、验证损失、训练准确率和验证准确率四个指标进行评估。在训练过程中,模型在训练集上的表现(训练损失和训练准确率)持续改善,显示出模型在学习过程中逐渐适应训练数据。同时,模型在验证集上的表现(验证损失和验证准确率)也被监测,以评估模型对未见数据的泛化能力。

2301_81588826的博客 1519
上一篇: 百度地图申请API
下一篇: docker启动bwapp打不开
密言
博客等级 码龄6年 242粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值