Pytorch深度学习实践笔记9(b站刘二大人)

news2024/9/20 14:42:36

🎬个人简介:一个全栈工程师的升级之路!
📋个人专栏:pytorch深度学习
🎀CSDN主页 发狂的小花
🌄人生秘诀:学习的本质就是极致重复!

《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili​

目录

1 one-hot编码

2 Softmax 用于多分类

3 交叉熵

4 Minist手写数字识别


1 one-hot编码


one-hot 编码用于将离散的分类标签转换为二进制向量,关键是离散的分类和二进制向量。

  • 离散的分类:

就是分类之间相互独立,不存在大小、前后关系等

  • 二进制向量:

向量里面的数字只有0和1,分类问题中,我们需要对类别进行标签。最容易想到的是0:猫,1:狗,2:人,这种方式。
由于对于分类标签我们的要求是不同分类标签之间的距离应该是相等的,如果使用0 1 2 这样的数字,不同标签之间的距离不同,即互相独立的标签是不对等的,计算loss时就会不准确。因此提出了one-hot编码,也叫独热编码。使用二进制向量来表示这种离散的分类标签。

  • one-hot编码表示:




对于猫、狗、人 三分类问题,对于分类标签是猫的位置就是1,是狗的位置就是1,是人的位置就是1,这样对于猫 one-hot编码为[ 1,0,0] ,狗 [0,1,0],人[0,0,1],这三个向量的距离是相等的,且互相垂直,这样就满足了独立标签的对等性问题。

  • one-hot的使用:

softmax激活函数输出一系列的概率值,表示每一种分类的概率是多少。

分类Softmax得分
0.7
0.2
0.1


上述分类对应的真实的独热编码是[1,0,0],需要计算loss


为了让最终loss值最小,会根据真实标签和预测得分值来调整权重,使得预测得分朝着理想的真实标签靠近。
上图中,猫的得分是0.7,而真实得分是1,因此这一类的得分还需要继续增大,计算完loss值后,反向传播调整神经网络的权重,使这一类的得分继续增大。
狗和人的得分相反,得分需要继续减小,计算完loss值后,反向传播调整权重,使这一类的得分继续减少。
如果预测得分为[1, 0, 0],那么就和真实标签完全相同,此时的loss值就为0, 就说明本轮训练拟合的很好了。
当然 one-hot 编码有它的局限性,上面的例子是 3 分类的例子,那如果分类数量有 1 万个,我们是不是需要将 1 万个离散的分类,编码成 1 万维的向量来计算呢?
这就出现了维度灾难了,而且大量的数据为 0,向量编码变为了非常稀疏的向量,此时就可能需要使用其他的优化手段来处理,这里一般会使用embeding 嵌入层来解决,转化为稠密向量。
总之,one-hot编码通过将分类转换到多维空间中的二进制向量表示,可以有效的解决一些类别不对称不独立的问题。


2 Softmax 用于多分类


假设要使用神经网络做图片分类。现在有3个类别:猫,狗,人。给你下面一张图片,神经网络需要在这3个类别中选出一个。


我们很容易知道这是一只猫,是因为我们的大脑已经建立了猫的模型,但是神经网络需要去计算
好,我们使用Resnet50这一分类网络进行推理运算。算到最后面的全连接层时,全连接输出了3个数值,分别为2,1,0.1。我们知道全连接输出的结果大致代表得分。
现在我们假设猫、狗、人这三个分类的得分分别为:

分类得分
2
1
0.1


猫得了2分,狗得了1分,人得了0.1分。
单看这个结果,我们大概知道,因为猫的得分最高,那最终神经网络会认为这张图片是一只猫。
这么理解是可以的,但是大概两个地方有点问题。
第一,神经网络最终选择某一分类,依据的不是得分,而是概率。
也就是说,最终神经网络会选择一个概率最高的分类作为它识别的结果。
为什么要把得分转为概率呢?因为多分类模型中,输出值为概率更利于反向推导和模型的迭代,概率之间更好的计算距离,而数值之间的计算的距离是无含义的。
所以,我们需要一种方法,将上面的得分转换为概率。
第二,得分相近如何准确判断的问题。
例子中猫的得分是2,狗的得分是1,人的得分是0.1,我们可以比较肯定的说,因为猫的得分最高,而且比狗和人都高很多,肯定就是猫。
但实际中,有很大的可能算出的猫的得分是2.1,狗的得分是1.9,人的得分是0.1。
这个时候,我们可能就没有像刚才那么肯定了。
因为猫的得分和狗的得分相差很少,而且两者都很高!
这也是为什么,很多神经网络最终都会以TOP1 和 TOP5的识别准确度来衡量神经网络的识别精度。
由于上述两个原因的存在,人们想到了SoftMax算法,而这个算法,也几乎完美地解决了这两个问题。

  • 为什么叫SoftMax以及它的实现原理

不知你有没有想过,为什么这个算法叫 SoftMax 呢?
Soft 是软的意思,与之对应肯定有 HardMax。而 HardMax,可以理解为我们平时认知的Max。比如两个数(3, 4), 那么这两个数的 HardMax(3,4) 结果就是4。
这个逻辑,小学生学会了10以内的加减法都知道。
但正如上面所说,SoftMax 不一样,它是要处理多个类别分类的问题。
并且,需要把每个分类的得分值换算成概率,同时解决两个分类得分值接近的问题。
先从公式上看,SoftMmax是怎么做到的。
公式中,每个 z 就对应了多个分类的得分值。SoftMax对得分值进行了如下处理:

  • 以e为底数进行了指数运算,算出每个分类的 eZi,作为公式的分子
  • 分母为各分类得分指数运算的加和。
  • 根据公式很自然可以想到,各个分类的SoftMax值加在一起是1,也就是100%。所以,每个分类的SoftMax的值,就是将得分转化为了概率,所有分类的概率加在一起是100%。

这个公式很自然的就解决了从得分映射到概率的问题。
那它又是怎么解决两个得分相近的问题的呢?
其实也很简单,重点在选择的指数操作上。我们知道指数的曲线是下面的样子。
指数增长的特性就是,横轴变化很小的量,纵轴就会有很大的变化。
所以,从1.9变化到2.1,经过指数的运算,两者的差距立马被的拉大了。从而,我们可以更加明确的知道,图片的分类应该属于最大的那个。
下面是将猫、狗、人三个分类经过SoftMax计算之后得到的概率。

分类得分softmax 得分
270%
120%
0.110%


可以看到,分类是猫的概率遥遥领先。
所以,神经网络在经过softmax层之后,会以70%的概率,认为这张图片是一张猫。
这就是 SoftMax 的底层原理。
指数让得分大的分类最终的概率更大,得分小的分类最终的概率更小,而得分为负数的分类,几乎可以忽略。



多分类问题利用Softmax实现,SoftMax 可以用来做分类,输出属于某个类别的概率


3 交叉熵


计算两个概率之间的差异性

  • Softmax:(LogSoftmax)

将score转化为概率

  • Cross Entropy:(NLLLoss)

计算两个概率之间的差异

  • CrossEntropyLoss:(SoftMax+CrossEntropy)




一些代码说明:
torch.max的返回值有两个,第一个是每一行的最大值是多少,第二个是每一行最大值的下标(索引)是多少。

Python中with的用法_python中with用法-CSDN博客​

torch.max()使用讲解_torch.max accuracy 准确率评估-CSDN博客​

  • 归一化:

将像素转化到0~1之间,方便使用交叉熵损失函数计算,归一化使用正太分布,menan是均值,std是标准差

 




4 Minist手写数字识别


(1)数据集准备


(2)模型的建立


(3)交叉熵损失函数和优化器


(4)训练和测试

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
 
# prepare dataset
 
batch_size = 64
# PIL 图像需要转换为Tensor
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]) # 归一化,均值和方差
 
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)
 
# design model using class
 
 
class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.l1 = torch.nn.Linear(784, 512)
        self.l2 = torch.nn.Linear(512, 256)
        self.l3 = torch.nn.Linear(256, 128)
        self.l4 = torch.nn.Linear(128, 64)
        self.l5 = torch.nn.Linear(64, 10)
 
    def forward(self, x):
        x = x.view(-1, 784)  # 表示输入的图像变为1行784列的向量,通俗的说就是将一张28 ✖ 28的图像的所有像素值拼起来,-1表示自动计算N的值(N表示样本数量)
        x = F.relu(self.l1(x))
        x = F.relu(self.l2(x))
        x = F.relu(self.l3(x))
        x = F.relu(self.l4(x))
        return self.l5(x)  # 最后一层不做激活,不进行非线性变换
 
 
model = Net()
 
# construct loss and optimizer
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
 
# training cycle forward, backward, update
 
 
def train(epoch):
    running_loss = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        # 获得一个批次的数据和标签
        inputs, target = data
        optimizer.zero_grad()
        # 获得模型预测结果(64, 10)
        outputs = model(inputs)
        # 交叉熵代价函数outputs(64,10),target(64)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()
 
        running_loss += loss.item()
        if batch_idx % 300 == 299:
            print('[%d, %5d] loss: %.3f' % (epoch+1, batch_idx+1, running_loss/300))
            running_loss = 0.0
 
 
def test():
    correct = 0
    total = 0
    with torch.no_grad():
        for data in test_loader:
            images, labels = data
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1) # dim = 1 列是第0个维度,行是第1个维度
            total += labels.size(0)
            correct += (predicted == labels).sum().item() # 张量之间的比较运算
    print('accuracy on test set: %d %% ' % (100*correct/total))
 
 
if __name__ == '__main__':
    for epoch in range(10):
        train(epoch)
        test()



🌈我的分享也就到此结束啦🌈
如果我的分享也能对你有帮助,那就太好了!
若有不足,还请大家多多指正,我们一起学习交流!
📢未来的富豪们:点赞👍→收藏⭐→关注🔍,如果能评论下就太惊喜了!
感谢大家的观看和支持!最后,☺祝愿大家每天有钱赚!!!欢迎关注、关注!

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

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

相关文章

【408】2009-20

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

基于51单片机的电压表-数码管显示

一.硬件方案 本设计基于STC89C52单片机的一种电压测量电路,该电路采用ADC0832A/D转换芯片,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单, 可以测量0~9V的电压值,并在四位LED数码管上显示电压值。 二.设计功能 (1&…

07_Servlet

Servlet 一 Servlet简介 1.1 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源. 例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时动态生成…

客服快捷回复话术分享:618议价话术和催发货话术

随着618活动大促的临近,客服小伙伴们将迎来一年中最繁忙的时刻。面对顾客的议价、催发货等需求,我们应该如何回复才能既满足顾客的需求,又能保持良好的服务形象呢?下面就为大家分享一些议价和催发货的快捷回复话术,希望…

ThreadLocal一步梭哈

大家好,这里是教授.F 引入: 1. ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题. 2. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法[源码!] 3. ThreadLocal 可以像 Map 一样存取数据…

[[nodiscard]]--c++17

作用 用于标记某个函数或者类的成员函数的返回值需要处理。 被标记的函数和类的函数被调用&#xff0c;但是返回值没有接收的时候&#xff0c;编译器会warning. 标记函数 #include <iostream>[[nodiscard]] int square(int x) {return x * x; }int main() {// 注意&am…

安全基础二

一、插件漏洞 统计使用了哪些插件这些插件有版本更新嘛检测这些插件是否存在已知漏洞 二、权限提升和持久化 SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请求伪造&#xff09; 想象一下&#xff0c;你是一个公司的内部员工&#xff08;服务器&#x…

大工作量LUAD代谢重编程模型多组学(J Transl Med)

目录 1&#xff0c;单细胞早期、晚期和转移性 LUAD 的细胞动力学变化 2&#xff0c;细胞代谢重编程介导的LUAD驱动恶性转移的异质性 3&#xff0c;模型构建 S-MMR评分管线构建 4&#xff0c;S-MMR 模型的预后评估 5&#xff0c; 还开发了S-MMR 评分网络工具 6&#xff0c…

HTML5的标签(文本链接、图片路径详解)

目录 前言 一、文本链接 超链接表述 二、图片路径详解 绝对路径 相对路径 网络路径 前言 一、文本链接 超链接表述 HTML 使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;…

Elasticsearch之入门与安装

Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

CVE-2024-27954 WordPress Automatic插件 SSRF与任意文件读取漏洞分析

WordPress Automatic 插件<3.92.1易受未经验证的任意文件下载和SSRF的攻击。位于downloader.php文件中&#xff0c;可能允许攻击者从网站访问任何文件。敏感数据&#xff0c;包括登录凭据和备份文件。此漏洞已在3.92.1版本中修补。 漏洞分析 定位文件 \wp-automatic\downl…

四款开源电子表格组件,轻松集成到你的项目

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;最近在研究在线电子表格的技术实现&#xff0c;发现了几个优质的开源电子表格项目&#xff0c;这里和大家一起分享一下。 同时我也把其中一款…

外汇天眼:野村证券和Laser Digital与GMO互联网集团合作发行日元和美元稳定币

野村控股和Laser Digital将与GMO互联网集团合作&#xff0c;在日本探索发行日元和美元稳定币。GMO互联网集团的美国子公司GMO-Z.com Trust Company, Inc. 在纽约州金融服务部的监管框架下&#xff0c;在以太坊、恒星币和Solana等主要区块链上发行稳定币。GMO-Z.com Trust Compa…

【mysql】ubuntu下安装数据库

1更新软件包 sudo apt update //更新软件包2安装数据库 sudo apt install mysql-server//安装数据库注意后面mysql-server是个整体 3安全设置配置 sudo mysql_secure_installation//安全设置配置你要设置验证密码吗&#xff1f; 输入设置密码安全等级&#xff08;0,1&am…

aws lakeformation注册s3位置的原因

参考资料 lakeformation底层数据的访问逻辑 向lakeformation注册s3位置的目的是让lakeformation控制对AWS S3 位置底层数据的访问&#xff08;以下简称LF&#xff09; 注册s3位置后可以进行两种授权 数据访问授权&#xff08;SELECT、INSERT 和 DELETE&#xff09; 数据位置…

【课件分享】智慧档案编研规划与落地

关注我们 - 数字罗塞塔计划 - 5月25日&#xff0c;罗塞塔直播间再度上线&#xff0c;每一次相聚都有特殊的意义&#xff0c;每一次分享都能激发无限的可能。上海市档案馆档案史料编研部石磊主任、嘉定区档案局周万春局长 、上海师范大学人文学院吕元智教授 、复旦大学计算机科…

微信公众号完成自动回复,自定义菜单

微信公众号完成自动回复&#xff0c;自定义菜单 首先要获取到微信公众号的开发者权限&#xff0c;这一步省略&#xff0c;可以自行百度 微信公众号对接自己的服务器 首先第一步需要有自己的服务器和固定的ip&#xff0c; 其中&#xff0c;80/443端口需要有其中一个&#xff0…

《云原生安全攻防》--快速识别虚拟机、Docker和K8s集群环境

今天我们将一起学习一个非常实用的技巧&#xff0c;快速识别云原生环境。 对于攻击者而言&#xff0c;随着云原生应用普及&#xff0c;当攻击者获得一个shell权限时&#xff0c;那么这个shell可能处于虚拟主机里&#xff0c;也有可能在一个Docker环境里&#xff0c;或者在K8s集…

Diffusion Model 和 Stable Diffusion 详解

文章目录 Diffusion Model 基础生成模型DDPM概述向前扩散过程前向扩散的逐步过程前向扩散的整体过程 反向去噪过程网络结构训练和推理过程训练过程推理过程优化目标 详细数学推导数学基础向前扩散过程反向去噪过程 Stable Diffusion组成结构运行流程网络结构VAE 模型文本编码器…

数据恢复的救星!快速恢复手机数据的2个秘籍!

当我们的照片、视频、联系人、短信和应用程序丢失时&#xff0c;许多人可能会感到束手无策&#xff0c;无论是珍贵的照片、重要的工作文件还是个人的联系方式&#xff0c;一旦丢失&#xff0c;都可能带来极大的不便和困扰。但随着数据恢复技术的发展&#xff0c;我们有了更多的…