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

news2024/9/20 5:26:23

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

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

 

目录

1 卷积神经网络

2 拆解卷积

3 特征提取+分类



1 卷积神经网络


CNN,用于特征提取,但是计算量大,卷积算子是一个计算密集型算子,工业界优化卷积算子是一个重大的任务。有LeNet、AlexNet、VGG系列、ResNet、很多深度学习框架都提供了丰富的CNN模型实现个训练的接口。

  • ResNet深度残差网络:

Resnet50(深度残差网络),图像分类网络,2015年何凯明提出。残差是在正常的神经网络中加了一个short cut 分支结构,也称为高速公路。这样网络就不是单纯卷积的输出F(x),而是卷积的输出和前面输入的叠加F(x)+X,可以很好的解决训练过程中的梯度消失问题。被证明具有很强的图像特征提取能力,一般作为一种特征提取器来使用。常用来作为back bone,即骨干网络。也被用来测试AI芯片的性能指标。

  • 为什么重要?

(1)常被用来做back bone,例如 YoLo-v3 ,被用来作为特征提取器,特斯拉的占用网络
(2)性能标杆

  • ResNet包含的算法:

(1)卷积算法
卷积是CNN网络的核心,对图片或者特征图进行进一步的特征提取,从而实现在不同尺度下的特征提取或者特征融合。
(2)激活(relu)
卷积是乘加运算,属于线性运算,使用激活函数是为了引入非线性因素,提高泛化能力,将一部分神经元激活,而将另一部分神经元关闭。
(3)池化
池化层主要是为了降维,减少运算量,同时可以保证输出特征图中的关键特征
(4)加法
残差结构,解决梯度消失问题
(5)全连接
全连接层,称为Linear层或者FC层,将所有学习到的特征进一步融合,并映射到样本空间的特征上,输出与样本对应。全连接层之后会加一个Softmax,完成多分类。


2 拆解卷积

  • 卷积为什么重要

(1)通过卷积核局部感知图像,感受野(有点像人眼盯着某一个地方看)
(2)滑动以获取全局特征(有点像人眼左看右看物体)
(3)权重矩阵(记忆)

  • 特征图(Feature Map)

卷积操作从输入图像提取的特征图,即卷积算法的输出结果,包含了输入图像的抽象特征。

  • 感受野

卷积核在输入图像上的滑动扫描过程,表示一个输出像素“看到”的输入图像中区域的大小,注意是从输出来看。如果将卷积比作窗户,那么感受野就是一个输出像素透过这个窗户可以看到的输入图片的范围。
感受野影响神经网络对于图像的理解和图像特征的提取。大的感受野可以使得神经网络理解图像的全局信息,从而提取全局特征。小的感受野只能捕捉图像的局部特征。

  • 2个3x3卷积替代5x5卷积的意义?

首先可以替代是因为从输出元素看,2个3x3卷积和1个5x5卷积,具有相同的感受野。
优势:
(1)2个3x3卷积的卷积核参数量为3x3+3x3=18,而1个5x5=25
(2)一个卷积变成两个卷积,加深了神经网络的层数,从而在卷积后面引入更多的非线性层,增加了非线性能力。

  • 卷积公式

输出通道就是卷积核的个数

  • Padding参数

指的是在输入图像的周围添加的额外的像素值,用来扩大输入图像的尺寸,这些额外填充的像素值通常设置为0,卷积在这个填充后的图像上进行。
Padding主要是为了防止边缘信息的损失,保持输出大小与输入大小一致。
需要填充的场景:
(1)相同卷积(输入和输出尺寸一致)
(2)处理小物体,边缘像素卷积运算较少,多次卷积容易丢失在边缘的小物体,Padding可以提高
(3)网络设计灵活

  • Stride 参数

卷积核在活动过程中每次跳过的像素的数量,可以减少计算量、控制Feature Map输出的大小,一定程度上防止过拟合,这是通过降低模型的复杂度来实现的。
Dilation 参数和空洞卷积
dilation指的是卷积核元素之间的间距,决定卷积核在输入数据上的覆盖范围。增大dilation,增大感受野,由此引入了空洞卷积。
空洞卷积扩大了卷积核的感受野,但却不增加卷积核的尺寸,减少运算量;可以解决大尺寸输入图像的问题;可以处理遥远像素之间的关系。

  • 卷积长、宽推导


除了以上的三个tensor,还有计算卷积的三个参数,Padding、stride、dilation,这样才构成一个完整的卷积运算。
无参数推导:


加padding推导:


加上stride推导:


加上dilation推导:


3 特征提取+分类

 


输入->卷积->输出




一个简单的神经网络:


一些代码说明:
代码说明:


1、torch.nn.Conv2d(1,10,kernel_size=3,stride=2,bias=False)
1是指输入的Channel,灰色图像是1维的;10是指输出的Channel,也可以说第一个卷积层需要10个卷积核;kernel_size=3,卷积核大小是3x3;stride=2进行卷积运算时的步长,默认为1;bias=False卷积运算是否需要偏置bias,默认为False。padding = 0,卷积操作是否补0。
2、self.fc = torch.nn.Linear(320, 10),这个320获取的方式,可以通过x = x.view(batch_size, -1) # print(x.shape)可得到(64,320),64指的是batch,320就是指要进行全连接操作时,输入的特征维度。


CPU代码:

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
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.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)
        self.pooling = torch.nn.MaxPool2d(2)
        self.fc = torch.nn.Linear(320, 10)
 
 
    def forward(self, x):
        # flatten data from (n,1,28,28) to (n, 784)
        batch_size = x.size(0)
        x = F.relu(self.pooling(self.conv1(x)))
        x = F.relu(self.pooling(self.conv2(x)))
        x = x.view(batch_size, -1) # -1 此处自动算出的是320
        x = self.fc(x)
 
        return 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()
 
        outputs = model(inputs)
        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)
            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()



GPU代码:

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
import matplotlib.pyplot as plt
 
# prepare dataset
 
batch_size = 64
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.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)
        self.pooling = torch.nn.MaxPool2d(2)
        self.fc = torch.nn.Linear(320, 10)
 
 
    def forward(self, x):
        # flatten data from (n,1,28,28) to (n, 784)
        
        batch_size = x.size(0)
        x = F.relu(self.pooling(self.conv1(x)))
        x = F.relu(self.pooling(self.conv2(x)))
        x = x.view(batch_size, -1) # -1 此处自动算出的是320
        # print("x.shape",x.shape)
        x = self.fc(x)
 
        return x
 
 
model = Net()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
 
# 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
        inputs, target = inputs.to(device), target.to(device)
        optimizer.zero_grad()
 
        outputs = model(inputs)
        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
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('accuracy on test set: %d %% ' % (100*correct/total))
    return correct/total
 
 
if __name__ == '__main__':
    epoch_list = []
    acc_list = []
    
    for epoch in range(10):
        train(epoch)
        acc = test()
        epoch_list.append(epoch)
        acc_list.append(acc)
    
    plt.plot(epoch_list,acc_list)
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    # plt.show()
    plt.savefig('./data/pytorch9.png')
 
    

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

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

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

相关文章

基于SVm和随机森林算法模型的中国黄金价格预测分析与研究

摘要 本研究基于回归模型,运用支持向量机(SVM)、决策树和随机森林算法,对中国黄金价格进行预测分析。通过历史黄金价格数据的分析和特征工程,建立了相应的预测模型,并利用SVM、决策树和随机森林算法进行训…

装机必备——WinRAR安装教程

装机必备——WinRAR安装教程 软件下载 软件名称:WinRAR 软件语言:简体中文 软件大小:3.38M 系统要求:Windows7或更高, 32/64位操作系统 硬件要求:CPU2GHz ,RAM4G或更高 下载通道①迅雷云盘丨下…

2024甘肃省三支一扶报名流程详细图解

预计报名时间:2024年5月27日9:00至5月31日18:00 2024甘肃省三支一扶报名流程 登录甘肃人力人力资源考试中心,选择网上报名 进入账户登录,首次登录同学请先注册账号。 注册账号,认真填写,仔细核对信息。…

AJ-Report一次排错处理

山重水复疑无路,柳暗花明又一村...... 新项目需要选型开源的AJ-Report,计划再次基础上进行二开。 官网地址: AJ-Report: AJ-Report是一个完全开源,拖拽编辑的可视化设计工具。三步快速完成大屏:配置数据源---->写…

矩阵对角化在机器学习中的奥秘与应用

在机器学习的广阔领域中,矩阵对角化作为一种重要的数学工具,扮演着不可或缺的角色。从基础的线性代数理论到复杂的机器学习算法,矩阵对角化都在其中发挥着重要的作用。 矩阵对角化的概念与原理 矩阵对角化是矩阵理论中的一个基本概念&#x…

红队攻防渗透技术实战流程:红队目标上线之webshell工具魔改

红队攻防免杀实战 1. 红队目标上线-Webshell免杀-源码魔改1.2 Webshell-代码混淆&流量绕过&工具原理1.2 通过对冰蝎的数据包分析:1.2魔改冰蝎-JAR反编译打包构建1.2魔改冰蝎-防识别-打乱特征指纹1.2魔改冰蝎-防查杀-新增加密协议1. 红队目标上线-Webshell免杀-源码魔改…

[8] CUDA之向量点乘和矩阵乘法

CUDA之向量点乘和矩阵乘法 计算类似矩阵乘法的数学运算 1. 向量点乘 两个向量点乘运算定义如下: #真正的向量可能很长,两个向量里边可能有多个元素 (X1,Y1,Z1) * (Y1,Y2,Y3) X1Y1 X2Y2 X3Y3这种原始输入是两个数组而输出却缩减为一个(单一值)的运…

mysql高级篇学习(数据表的设计方法,索引优化)

使用docker 安装 mysql 安装 docker # yum 包更新到最新 yum update# 卸载旧的 docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine # 安装 gcc 环境 yum -y install…

【程序员如何送外卖】

嘿,咱程序员要在美团送外卖,那还真有一番说道呢。 先说说优势哈,咱程序员那逻辑思维可不是盖的,规划送餐路线什么的,简直小菜一碟。就像敲代码找最优解一样,能迅速算出怎么送最省时间最有效率。而且咱平时…

基于 Wireshark 分析 UDP 协议

一、UDP 协议 UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,常用于传输即时数据,如音频、视频和实时游戏数据等。 UDP 的特点如下: 1. 无连接性:UDP 不需要在发送数…

如何在Namecheap上购买域名

文章目录 如何在Namecheap上购买国外域名,话不多说直接上步骤↓1:注册Namecheap账号2:选购域名3:如何付款4:付款购买域名5:总结 如何在Namecheap上购买国外域名,话不多说直接上步骤↓ 原文链接…

通过键值对访问字典

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,如果想将字典的内容输出也比较简单,可以直接使用print()函数。例如,要想打印dictionary字典&#xff…

10.SpringBoot 统一处理功能

文章目录 1.拦截器1.1在代码中的应用1.1.1定义拦截器1.1.2注册配置拦截器 1.2拦截器的作用1.3拦截器的实现 2.统一数据返回格式2.1 为什么需要统⼀数据返回格式?2.2 统⼀数据返回格式的实现 3.统一异常处理4.SpringBoot专业版创建项目无Java8版本怎么办?…

Java后端面经

1.可重复读,已提交读,这两个隔离级别表现的现象是什么,区别是什么样的? 可重复读:表示整个事务看到的事务和开启后的事务能看到的数据是一致的,既然数据是一致的,所以不存在不可重复读。而且不…

Word整理论文参考文献

1.安装Zotero软件 2.安装Zotero的Chrome网站插件,并将插件固定到浏览器 3.安装Word的Zotero插件 4.在DBLP网站https://dblp.org/search 搜索需要添加的参考文献->点击BibTex->点击网页右上角的Zotero符号(即第二步所指的符号)->至…

雷军-2022.8小米创业思考-9-爆品模式:产品力超群,具有一流口碑,最终实现海量长销的产品。人人都向往;做减法;重组创新;小白模式

第九章 爆品模式 小米方法论的第三个关键词,就是一切以产品为出发点,打造爆品模式。 大多数人对“爆品”的着眼点仅在于“爆”,也就是产品卖得好。希望产品大卖这没有错,但是“爆”是“品”的结果,爆品是打造出来的&…

Revit的特性 - 族类型和族实例、联动更新

Revit 模型的表示方式 Revit 是 Autodesk 推出的一款建筑建模软件,主要应用于建筑信息模型(Building Information Modeling,简称BIM)领域。Revit发布至今已经超过20年,他的核心理念是以族的概念来表达建筑模型。 在Re…

图生文模型llava

llava-llama-3-8b-v1_1 是一个 LLaVA 模型,由 XTuner 使用 ShareGPT4V-PT 和 InternVL-SFT 从 meta-llama/Meta-Llama-3-8B-Instruct 和 CLIP-ViT-Large-patch14-336 进行微调。 https://huggingface.co/xtuner/llava-llama-3-8b-v1_1-gguf

Pencils Protocol与Trust 钱包联合活动,参与瓜分超$200K的奖励

实现全新品牌升级的 Pencils Protocol 目前已经结束了 Season 2,并进入到了 Season 3 阶段,目前用户可以通过 Pencils Protocol 的 Staking 池来获得超过 APR 收益的同时,还能获得多重积分奖励。 而在 Season 3 阶段,为了进一步促…

使用 Django ORM 进行数据库操作

文章目录 创建Django项目和应用定义模型查询数据更新和删除数据总结与进阶聚合和注解跨模型查询原始SQL查询 Django是一个流行的Web应用程序框架,它提供了一个强大且易于使用的对象关系映射(ORM)工具,用于与数据库进行交互。在本文…