Pytorch入门一:卷积神经网络实现MNIST手写数字识别

Pytorch实现手写体识别(基于CNN卷积神经网络)实操详解(附完整代码free) 手写体作为深度学习的“Hello world”,几乎所有的课程都会讲到这个,今天带着大家一些看看吧。 如果对你有所帮助,点个赞给个小关注,以后一起交流学习。 前言 首先和大家讲讲我为啥会看到这个,因为我需要写论文,关于图像增强的,比如夜视,曝光,去雨,去雪,去雾等,以往采用的是传统的方法“直方图,暗通道,retinex”等,现在随着深度学习的发展,只从12年人机大战,深度学习迅速爆棚,由于结果惊艳,所以深度学习进入了人们感兴趣的领域。 好不夸张的说,现在各行各业都在使用深度学习,这个也是我需要研究的课题。 阅读详情

目录

1. pytorch介绍

2. 卷积神经网络(CNN)

3. PyTorch中的卷积神经网络

3.1卷积层:nn.Conv2d()

3.2 池化层:nn.MaxPool2d()

4. 实现MNIST手写数字识别

4.1 引入库函数

4.2 设置超参数

4.3 加载数据集

4.4 设计CNN

4.5 训练前准备

4.6 训练

4.7 预测 

4.8 运行

5 结果


1. pytorch介绍

Pytorch是Torch7团队开发的,与Torch的不同之处在于Pytorch使用了Python作为开发语言,同样说明它是一个以Python优先的深度学习框架,它不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是TensorFlow等很多主流框架不支持的。而且Pytorch可以轻松扩展,近两年有赶超TensorFlow的势头

Pytorch中有两种变量类型,一种是Tensor,一种是Variable。并且Tensor和Numpy之间可以自由转换。

 

2. 卷积神经网络(CNN)

卷积神经网络(CNN——Convolutional Neural Network)是一种前馈神经网络。长期以来是图像识别领域的核心算法之一

这是一张卷及神经网络机构示意图,让我们理解下各部分:

  • 输入层(Input Layer):对于我们人来说输入的是一张图片,但是对于电脑来说输入的是一个矩阵类型的数据,这些数据代表着这张图片的像素值
  • 卷积层(Convolution Layer):对输入的数据进行特征提取,每个卷积核每次从一个小区域提取到一个特征值,所有的特征值组合起来就得到了一个特征图,当用多个卷积核对输入数据进行特征提取时,就得到了多个特征图。这个卷积核我们称为(kernel)
  • 激活函数(Activation Function):在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端,引入激活函数是为了增加神经网络模型的非线性
  • 池化层(Pooling Layer):在不影响特征质量的情况下对图片进行压缩,以减少参数,池化主要有两种,一种是MaxPooling,一种是AvePooling。假设池化的内核是一个2*2的矩阵,采用MaxPooling则是输出其中的最大值,采用AvePooling则输出所有数据的平均值
  • 全连接层(Fully Connected Layer,简称FC):在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用
  • 输出层(Output Layer):卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签 [。在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类 。在图像语义分割中,输出层直接输出每个像素的分类结果   

理解完卷积神经网络后,让我们来看下PyTorch中的卷积神经网络

 

3. PyTorch中的卷积神经网络

3.1卷积层:nn.Conv2d()

其参数如下:

参数含义
in_channels输入信号的通道数.
out_channels卷积后输出结果的通道数.
kernel_size卷积核的形状. 例如kernel_size=(3, 2)表示3X2的卷积核,如果宽和高相同,可以只用一个数字表示
stride卷积每次移动的步长, 默认为1.
padding 处理边界时填充0的数量, 默认为0(不填充).
dilation采样间隔数量, 默认为1, 无间隔采样
groups输入与输出通道的分组数量. 当不为1时, 默认为1(全连接
bias为 True 时, 添加偏置.

3.2 池化层:nn.MaxPool2d()

其参数如下:
 

参数含义
kernel_size最大池化操作时的窗口大小
stride最大池化操作时窗口移动的步长, 默认值是 kernel_size
padding 输入的每条边隐式补0的数量
dilation  用于控制窗口中元素的步长的参数
return_indices如果等于 True, 在返回 max pooling 结果的同时返回最大值的索引 这在之后的 Unpooling 时很有用
ceil_mode如果等于 True, 在计算输出大小时,将采用向上取整来代替默认的向下取整的方式

4. 实现MNIST手写数字识别

下面就使用 pytorch 来动手搭建一个卷积神经网络来训练和预测手写数字

4.1 引入库函数

import torch.nn as nn  # pytorch中最重要的模块,封装了神经网络相关的函数
import torch.nn.functional as F  # 提供了一些常用的函数,如softmax
import torch.optim as optim  # 优化模块,封装了求解模型的一些优化器,如Adam SGD
from torch.optim import lr_scheduler  # 学习率调整器,在训练过程中合理变动学习率
from torchvision import transforms  # pytorch 视觉库中提供了一些数据变换的接口
from torchvision import datasets  # pytorch 视觉库提供了加载数据集的接口

4.2 设置超参数

# 预设网络超参数 (所谓超参数就是可以人为设定的参数

BATCH_SIZE = 64  # 由于使用批量训练的方法,需要定义每批的训练的样本数目

EPOCHS = 3  # 总共训练迭代的次数

# 让torch判断是否使用GPU,建议使用GPU环境,因为会快很多
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")

learning_rate = 0.001  # 设定初始的学习率

4.3 加载数据集

这里我们使用dataloader迭代器来加载数据集

# 加载训练集
train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize(mean=(0.5,), std=(0.5,))  # 数据规范化到正态分布
                   ])),
    batch_size=BATCH_SIZE, shuffle=True)  # 指明批量大小,打乱,这是处于后续训练的需要。

test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=False, transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.5,), (0.5,))
    ])),
    batch_size=BATCH_SIZE, shuffle=True)

上述代码的作用是:

  1. 将mnist训练集和测试集下载到文件夹data中
  2. 对数据进行变化,包括转为tensor数据类型,以及为了保证训练集测试集的独立同分布,数据规范化到正态分布
  3. 数据分批量存储,顺序打乱,方便后续训练。

4.4 设计CNN

一个简单的卷积神经网络的结构,一般包括:

卷积层Conv:通过卷积核提取图像特征,得到feature map
池化层Pool:利用卷积核对feature map 降采样,减少尺寸。最大池化层就是取滑动窗口内最大的像素,而平均池化层就是取滑动窗口内平均像素结果。
全连接层:多个linear model + 激活函数 eg:ReLU。
这样就构成了一个基本的CNN了,但是我们出于爱学习的心态呢,我们最好还要了解一些深度学习训练过程中的一些tricks,以提高模型的泛化能力。如:

batch normalization:简单来说就是将上一层的加权求和的所有输出结果再批量归一化(标准正态分布),然后输入一个线性模型,然后再连接到激活函数。
DropOut:在全连接层中,我们通过设定概率随机的让这一层的某些权重为0,相当于神经元无效。


# 设计模型
class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        # 提取特征层
        self.features = nn.Sequential(
            # 卷积层
            # 输入图像通道为 1,因为我们使用的是黑白图,单通道的
            # 输出通道为32(代表使用32个卷积核),一个卷积核产生一个单通道的特征图
            # 卷积核kernel_size的尺寸为 3 * 3,stride 代表每次卷积核的移动像素个数为1
            # padding 填充,为1代表在图像长宽都多了两个像素
            nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1),# ((28-3+2*1)/1)+1=28  28*28*1  》 28*28*32

            # 批量归一化,跟上一层的out_channels大小相等,以下的通道规律也是必须要对应好的
            nn.BatchNorm2d(num_features=32),   #28*28*32  》 28*28*32

            # 激活函数,inplace=true代表直接进行运算
            nn.ReLU(inplace=True),
            nn.Conv2d(32, 32, kernel_size=3, stride=1, padding=1),   #  ((28-3+2*1)/1)+1=28     28*28*32 》 28*28*32
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True),

            # 最大池化层
            # kernel_size 为2 * 2的滑动窗口
            # stride为2,表示每次滑动距离为2个像素
            # 经过这一步,图像的大小变为1/4,即 28 * 28 -》 7 * 7
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(32, 64, kernel_size=3, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        # 分类层
        self.classifier = nn.Sequential(
            # Dropout层
            # p = 0.5 代表该层的每个权重有0.5的可能性为0
            nn.Dropout(p=0.5),
            # 这里是通道数64 * 图像大小7 * 7,然后输入到512个神经元中
            nn.Linear(64 * 7 * 7, 512),
            nn.BatchNorm1d(512),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(512, 512),
            nn.BatchNorm1d(512),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(512, 10),
        )
    # 前向传递函数    
    def forward(self, x):
        # 经过特征提取层
        x = self.features(x)
        # 输出结果必须展平成一维向量
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

4.5 训练前准备

# 初始化模型 将网络操作移动到GPU或者CPU

ConvModel = ConvNet().to(DEVICE)
# 定义交叉熵损失函数
criterion = nn.CrossEntropyLoss().to(DEVICE)
# 定义模型优化器:输入模型参数,定义初始学习率
optimizer = torch.optim.Adam(ConvModel.parameters(), lr=learning_rate)
# 定义学习率调度器:输入包装的模型,定义学习率衰减周期step_size,gamma为衰减的乘法因子
exp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=6, gamma=0.1)
# 在官网上的解释。如果初始学习率lr = 0.05,衰减周期step_size为30,衰减乘法因子gamma=0.01
# Assuming optimizer uses lr = 0.05 for all groups
# >>> # lr = 0.05     if epoch < 30
# >>> # lr = 0.005    if 30 <= epoch < 60
# >>> # lr = 0.0005   if 60 <= epoch < 90

4.6 训练

def train(num_epochs, _model, _device, _train_loader, _optimizer, _lr_scheduler):
    _model.train()  # 设置模型为训练模式
    _lr_scheduler.step() # 设置学习率调度器开始准备更新
    for epoch in range(num_epochs):
        # 从迭代器抽取图片和标签
        for i, (images, labels) in enumerate(_train_loader):
            samples = images.to(_device)
            labels = labels.to(_device)
            # 此时样本是一批图片,在CNN的输入中,我们需要将其变为四维,
            # reshape第一个-1 代表自动计算批量图片的数目n
            # 最后reshape得到的结果就是n张图片,每一张图片都是单通道的28 * 28,得到四维张量
            output = _model(samples.reshape(-1, 1, 28, 28))
            # 计算损失函数值
            loss = criterion(output, labels)
            # 优化器内部参数梯度必须变为0
            optimizer.zero_grad()
            # 损失值后向传播
            loss.backward()
            # 更新模型参数
            optimizer.step()
            if (i + 1) % 100 == 0:
                print("Epoch:{}/{}, step:{}, loss:{:.4f}".format(epoch + 1, num_epochs, i + 1, loss.item()))

4.7 预测 

def test(_test_loader, _model, _device):
    _model.eval()  # 设置模型进入预测模式 evaluation
    loss = 0
    correct = 0

    with torch.no_grad():  # 如果不需要 backward更新梯度,那么就要禁用梯度计算,减少内存和计算资源浪费。
        for data, target in _test_loader:
            data, target = data.to(_device), target.to(_device)
            output = ConvModel(data.reshape(-1, 1, 28, 28))
            loss += criterion(output, target).item()  # 添加损失值
            pred = output.data.max(1, keepdim=True)[1]  # 找到概率最大的下标,为输出值
            correct += pred.eq(target.data.view_as(pred)).cpu().sum()  # .cpu()是将参数迁移到cpu上来。

    loss /= len(_test_loader.dataset)

    print('\nAverage loss: {:.4f}, Accuracy: {}/{} ({:.3f}%)\n'.format(
        loss, correct, len(_test_loader.dataset),
        100. * correct / len(_test_loader.dataset)))

4.8 运行

for epoch in range(1, EPOCHS + 1):
    train(epoch, ConvModel, DEVICE, train_loader, optimizer, exp_lr_scheduler)
    test(test_loader,ConvModel, DEVICE)
    test(train_loader,ConvModel, DEVICE)

5 结果

用的pytorch =0.4 用CPU跑的

Epoch:1/1, step:100, loss:0.1579
Epoch:1/1, step:200, loss:0.0809
Epoch:1/1, step:300, loss:0.0673
Epoch:1/1, step:400, loss:0.1391
Epoch:1/1, step:500, loss:0.0323
Epoch:1/1, step:600, loss:0.0870
Epoch:1/1, step:700, loss:0.0441
Epoch:1/1, step:800, loss:0.0705
Epoch:1/1, step:900, loss:0.0396

Average loss: 0.0006, Accuracy: 9881/10000 (98.000%)

Epoch:1/2, step:100, loss:0.0487
Epoch:1/2, step:200, loss:0.1519
Epoch:1/2, step:300, loss:0.0262
Epoch:1/2, step:400, loss:0.2133
Epoch:1/2, step:500, loss:0.0161
Epoch:1/2, step:600, loss:0.0805
Epoch:1/2, step:700, loss:0.0927
Epoch:1/2, step:800, loss:0.0663
Epoch:1/2, step:900, loss:0.0669
Epoch:2/2, step:100, loss:0.0124
Epoch:2/2, step:200, loss:0.0527
Epoch:2/2, step:300, loss:0.0256
Epoch:2/2, step:400, loss:0.0138
Epoch:2/2, step:500, loss:0.0894
Epoch:2/2, step:600, loss:0.1030
Epoch:2/2, step:700, loss:0.0528
Epoch:2/2, step:800, loss:0.1106
Epoch:2/2, step:900, loss:0.0044

Average loss: 0.0003, Accuracy: 9930/10000 (99.000%)

疫情在家,一天一个小项目加油!明天我们将使用visdom对这个网络可视化!

 

 

参考:

https://blog.youkuaiyun.com/out_of_memory_error/article/details/81434907

https://blog.youkuaiyun.com/think_three/article/details/79949710

https://blog.youkuaiyun.com/CVSvsvsvsvs/article/details/88564895

CNN实现手写数字识别(Pytorch) CNN(卷积神经网络)主要包括卷积层、池化层和全连接层。输入数据经过多个卷积层和池化层提取图片信息后,最后经过若干个全连接层获得最终的输出。以下基于Pytorch框架搭建一个CNN神经网络实现手写数字识别。 阅读详情

相关推荐

CNN01:Pytorch实现LeNet的Mnist手写数字识别

CNN01:Pytorch实现LeNet的Mnist手写数字识别 1、LeNet的网络结构和原理

xiaoheizi_du的博客 1万+

Educoder 机器学习 神经网络 第四关:使用pytorch搭建卷积神经网络识别手写数字

任务描述 相关知识 卷积神经网络 为什么使用卷积神经网络 卷积 池化 全连接网络 卷积神经网络大致结构 pytorch构建卷积神经网络项目流程 数据集介绍与加载数据 构建模型 训练模型 保存模型 加载模型 编程要求 测试说明 任务描述 本关任务:使用pytorch搭建出卷积神经网络并对手写数字进行识别。 相关知识 为了完成本关任务,你需要掌握:1.卷积神经网络,2.pytorch构建卷积神经网络项目流程。 卷积神经网

m0_56494324的博客 9436

Pytorch+CNN 识别自己手写的数字

Pytorch+CNN 识别自己手写的数字 看了网上很多的手写数字识别的例子,发现都没有一个可以识别自己手写的例子,正好现在需要写一个例子,于是自己研究了一下,写出了 一个能识别自己手写的例子供大家参考。转载请注明出处。如果想看原理的话,可以从网上查,有很多讲解手写数字识别原理的博客都很不错。 训练和测试数据集使用MNIST,在代码中可以下载。事先在电脑自带的画图软件上画出几个数字,尽量写的小一点...

大白的技术成长之路 6591

真的不能再详细了,2W字保姆级带你一步步用Pytorch搭建卷积神经网络实现MNIST手写数字识别

2w6k字,真的不能再详细了!!!几乎每一行代码都有注释!!!本教程包括MNIST数据集的下载与保存与加载、卷积神经网路的构建、模型的训练、模型的测试、模型的保存、模型的加载与继续训练和测试、模型训练过程、测试过程的可视化、模型的使用。

m0_56942491的博客 9744

PyTorch实现CNN用于MNIST手写数字识别任务的python完整代码

数据集中的图像经过标准化处理,背景为黑色,数字前景为白色,像素值范围为0-255(通常会归一化至0-1),格式简洁且易于处理,常被用作深度学习入门的“Hello World”级示例(如CNN模型的基础测试),也是评估分类算法性能的基准数据集之一,在PyTorch、TensorFlow等框架中可直接加载调用,适合用于演示数据预处理、模型训练和推理的全流程。MNIST数据集的均值和标准差是预计算好的全局统计量。在第一次卷积操作中,输入是1通道的28×28图像,输出变为16通道的28×28特征图。

搏博的专栏 2134

PyTorch: CNN实战MNIST手写数字识别

PyTorch: CNN实战MNIST手写数字识别cnn导包加载数据构造CNN训练并计算损失结果 cnn 卷积神经网络CNN的结构一般包含这几个层: 输入层:用于数据的输入 卷积层:使用卷积核进行特征提取和特征映射 激励层:由于卷积也是一种线性运算,因此需要增加非线性映射 池化层:进行下采样,对特征图稀疏处理,减少数据运算量。 全连接层:通常在CNN的尾部进行重新拟合,减少特征信息的损失...

devcy的博客 3187

PyTorch入门一:卷积神经网络实现MNIST手写数字识别

PyTorch官方教程(中文版):http://pytorch123.com 《动手学深度学习》PyTorch版:https://github.com/ShusenTang/Dive-into-DL-PyTorch 1. pytorch介绍 PyTorch是Torch7团队开发的,与Torch的不同之处在于PyTorch使用了Python作为开发语言,同样说明它是一个以Python优先的深度学习框架,它不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是TensorFlow等很多主流框架不支持的。而

酒酿小圆子呀~ 4534

PyTorch搭建卷积神经网络CNN实现MNIST手写数字识别(附代码)

首先需要对CNN网络理解,如果还不清楚卷积神经网络的可以去看https://blog.youkuaiyun.com/v_JULY_v/article/details/51812459 大神的超详细解析!

yykkkybs的博客 3499

用PyTorch实现MNIST手写数字识别(最新,非常详细)

1 MNIST数据集(提取码: zm7q )

qq_45588019的博客 13万+

第P1周:Pytorch实现mnist手写数字识别

# 第一步:设置硬件设备,有GPU就使用GPU,没有就使用GPU device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') print(device)

差点就差一点点的专栏 1627

卷积神经网络(CNN)入门:使用Python实现手写数字识别

在上一篇文章中,我们介绍了如何使用Python实现一个简单的前馈神经网络。本文将重点介绍卷积神经网络(CNN),这是一种在计算机视觉任务中表现优异的深度学习模型。我们将从卷积神经网络的基本原理开始,介绍卷积层、池化层和全连接层等概念,然后使用Python和Keras库实现一个手写数字识别的例子。

斌擎科技 1894

用PyTorch实现MNIST手写数字识别(非常详细)

hello大家好!我又来搬文章了!我就不信还有比这更详细的?! MNIST可以说是机器学习入门的hello word了!导师一般第一个就让你研究MNIST,研究透了,也算基本入门了。好的,今天就来扯一扯学一学。 在本文中,我们将在PyTorch中构建一个简单的卷积神经网络,并使用MNIST数据集训练它识别手写数字。在MNIST数据集上训练分类器可以看作是......

xfxuezhang.cn 16万+

代码练习系列(二)——搭建一个可用于手写数字识别的卷积网络模型(黑白图像,28*28大小,10个分类)

【代码】代码练习系列(二)——搭建一个可用于手写数字识别的卷积网络模型(黑白图像,28*28大小,10个分类)

扈海波的博客 149

Pytorch入门——手把手教你MNIST手写数字识别

MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录MNIST手写数字识别教程1 什么是MNIST?2 使用Pytorch实现手写数字识别2.1 任务目的2.2 开发环境2.3 实现流程3 具体代码实现3.1 数据预处理部分3.1.1 初始化全局变量3.1.2 构建数据集3.2 训练部分3.2.1 构建模型3.2.2 构建迭代器与损失函数3.2.3 构建训练循环3.2

Elwin的博客 9万+

Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建

搭建的目的只是刚好看到有这么一个模块, 还有给使用Go的人需要用到调试界面的时候用一下,真正开发界面并不建议用,没必要, 还有缺点就是在windows平台下编译偏慢, 还有其他一些UI纯Go开发的UI -

听我一言的博客 1万+

用LT1166+MOS管打造实验室级恒流源:闭环反馈与推挽驱动的深度调优

本文详细介绍了基于LT1166电流模式控制器与MOS管推挽架构的实验室级恒流源设计方法。通过闭环反馈调优和动态响应优化,实现带宽达100kHz、纹波低于0.1%的高性能恒流输出,适用于精密仪器校准和半导体测试等场景。重点解析了系统架构设计、MOS管选型策略以及频率响应测试等关键技术要点。

weixin_29290379的博客 203

【PyTorch】基于CNN的手写数字识别(在MNIST数据集上训练)

项目场景 简单的学习pytorch、自动求导和神经网络的知识后,我们来练习使用mnist手写数字集训练一个cnn模型。 导入模块 import torch import torch.nn as nn import matplotlib.pyplot as plt from torch.utils.data import DataLoader from torchvision import datasets, transforms matplotlib库用于绘图,如果没有请通过pip命令安装: pip in

XavierJ的博客 1万+

【外挂编程】外挂编程技术揭秘(二)

引言: 经过上一篇文章大家可能对外挂有了一个初步的认识,之前的内容比较简单,应该大家很容易掌握。我写作过程中我发现三个篇幅可能写不完,后续还可能要多加几个篇幅,这篇我们就先以内存挂为主吧。话不多说了,让我们开始吧。 文章中代码github地址: https://github.com/Diamonds-ZhaoYu/hz_example 环境要求: 系统:Windows 语言...

c-rain 4032

简单的CNN实现——MNIST手写数字识别

此文章不涉及复杂的理论知识,仅仅只是利用PyTorch组建一个简单的CNN去实现MNIST的手写数字识别,用好的效果去激发学习CNN的好奇心,并且以后以此为基础,去进行一些改造。(前提是把基础代码看明白) 本文CNN网络结构: 以下为最基本的代码(不需要GPU): 输出结果: 1.MNIST数据集介绍 1.数据量 MNIST数据集共有70000张图像,其中训练集60000张,测试集10000张。所有图像都是28×28的单通道灰度图像,每张图像包含一个手写数字。共10个类别,每个类别代表0~9之间的一个数字

m0_46692607的博客 3540

Amos实战:如何用Bootstrap法检验中介效应?附完整操作步骤

本文详细介绍了如何使用Amos软件通过Bootstrap法检验中介效应,包括模型设定、参数配置和结果解读。Bootstrap方法因其不依赖正态分布假设、统计功效高等优势,成为中介效应分析的首选方法。文章提供了完整的操作步骤和实用建议,帮助研究者准确评估变量间的中介作用机制。

zz67890的博客 1438

MediaPipe+Unity动作捕捉实战:如何用普通摄像头驱动3D人物模型(附避坑指南)

本文详细介绍了如何利用MediaPipe和Unity实现低成本动作捕捉,仅需普通摄像头即可驱动3D人物模型。通过MediaPipe的3D坐标预测能力,结合Unity的骨骼映射优化,解决单目摄像头下的三维重建难题,并提供实战避坑指南和性能优化技巧,帮助开发者快速实现专业级的人物模型驱动效果。

weixin_29047545的博客 356

用 PyTorch 搭建 CNN 实现 MNIST 手写数字识别

掌握了 PyTorch 加载数据集、搭建 CNN 模型的基本流程;理解了卷积层、池化层、激活函数的作用和参数意义;熟悉了 “训练 - 测试” 的循环逻辑,以及 GPU 加速的配置方法。MNIST 是入门任务,但 CNN 的核心思想(特征提取 + 下采样)可以迁移到更复杂的图像任务(如 CIFAR-10、ImageNet)。建议大家动手修改代码,比如调整卷积核大小、学习率、网络层数,观察结果变化,这样才能真正理解每个参数的影响~

weixin_72931638的博客 1955

智能能效管家:基于 ESP32 的智能插座设计与精细化功耗管理实现

针对传统插座无法远程控制、功耗监测缺失、能源浪费严重等问题,本文设计一款基于 ESP32 主控芯片的智能插座。该系统集成 WiFi 无线通信、交流功耗采集、继电器通断控制模块,实现四大核心功能。硬件采用模块化选型与安全接线设计,软件基于 Arduino-ESP32 框架开发,搭载 Mqtt 通信协议与功耗算法,可通过手机 / 云端实时管控设备,有效提升用电安全性与能源利用率。:ESP32;智能插座;功耗管理;远程控制;能耗监测。

weixin_42300449的博客 101

手写数字识别Mnist的Pytorch实现

手写数字识别Mnist的Pytorch实现 注:该内容为校内课程实验,仅供参考,请勿抄袭! 源码地址: 一、引言(Introduction)   手写数字识别时经典的图像分类任务,也是经典的有监督学习任务,经常被用于测试图像的特征提取效果、分类器性能度量等方面,本文将通过应用机器学习和深度学习算法实现手写数字识别。   图像分类任务是指给定一张图像来对其进行分类,常见的图像分类任务有手写数字识别、猫狗分类、物品识别等,图像分类也是计算机视觉基本的分类任务。而对于手写数字识别任务来说,可以当做图像分类问题,也

夏栀的博客 7317

SDA 还是 SDI:SAP HANA 数据虚拟化与数据集成的取舍、组合与实战

结论先放在前面:SDA 面向数据虚拟化与联邦查询,强调不落地、不复制、按需实时访问;SDI 面向数据集成与复制,强调抽取、转换、装载与近实时增量同步。两者共享 Remote Source 与 Adapter 的理念,但侧重点与运行时组件明显不同。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 583

ABAP Open SQL 数据拷贝导致 SAPSQL_DATA_LOSS:从报错机理到稳妥修复

数据类型与长度不合规。一旦在Open SQL的无损赋值检查里被发现,系统宁可中止也不会偷偷替你截断。把变量声明对齐到字典、在需要时明确表达转换/截断意图、写法上避免落入高危的操作数位置,再配合ATC的预防性检查,既能解决你这次的ST22Dump,也能把同类问题消灭在萌芽状态。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 426
下一篇: Pytorch工具:用visdom可视化loss
GuDoerr
博客等级 码龄8年 23粉丝 7原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值