Pytorch基础模块一模型(1)

简介: Pytorch基础模块一模型(1)

深度学习中依赖Pytorch搭建的几个必不可少的模块:

  1. 数据
  2. 模型
  3. 损失函数
  4. 优化器

这里重点总结深度学习中CV模型的基础模块,如卷积层,池化层等…

1 卷积层

目前卷积分为:

  1. 1. 普通卷积:一般用来提取特征,下采样
  2. 2. 反置卷积:一般用来上采样
  3. 3. 空洞卷积:提高感受野
  4. 4. 分组卷积:用于模型加速技术——轻量化模型设计
  5. 5. DW卷积:在MobileNet中首次使用,用来降低计算量
  6. 6. 可变卷积:更准确地提取到我们想要的特征

1.1 普通卷积

1.1.1 原理

6a844395b9a148c189812822b4dca06b.png

三个通道分别与权重矩阵做点成然后相加

1.1.2 Pytorch实现

导入

import torch.nn as nn

构造

 def __init__(
        self,
        in_channels: int,
        out_channels: int,
        kernel_size: _size_2_t,
        stride: _size_2_t = 1,
        padding: _size_2_t = 0,
        dilation: _size_2_t = 1,
        groups: int = 1,
        bias: bool = True,
        padding_mode: str = 'zeros'  # TODO: refine this type
    )

参数

  1. 1. in_channel:输入的深度
  2. 2. out_channels:输出的深度/卷积核的个数
  3. 3. kernel_size:卷积核的大小
  4. 4. stride:步长
  5. 5. padding:填充多少像素
  6. 6. dilation:使用空洞,默认为0,在空洞卷积中使用。
  7. 7. groups:分组,指的是对输入通道进行分组,如果groups=1,那么输入就一组,输出也为一组。如果groups=2,那么就将输入分为两组,那么相应的输出也是两组。另外需要注意的是in_channels和out_channels必须能整除groups。如果group=out_channels,即是DW卷积。
  8. 8. bias:bool,是否使用偏置
  9. 9. padding_mode:填充模式, padding_mode=‘zeros’表示的是0填充

1.2 可变卷积

卷积的位置是可变形的,并非在传统的N × N的网格上做卷积,这样的好处就是更准确地提取到我们想要的特征。

2 池化层

2.1 原理

这里接触最多的就是最大池化层

2cefdb61bbef417380e4667d9e8b9c16.png

假设是2x2的池化,那么用2x2的过滤器遍历图像,每次取值最大的

2.2 函数

构造

class.torch.nn.MaxPool2d(
  kernel_size,
  stride=None,
  padding=0,dilation=1,
  return_indices=False, 
  ceil_mode=False
)

参数

  1. 1. kernel_size:过滤器大小,类似卷积核
  2. 2. stride:窗口的移动步长,默认kernel_size(起到下采样kernel_size倍的作用)
  3. 3. padding:输入的每一条边补充0的层数,主要用于边缘处填充。
  4. 4. dilation:核使用空洞,默认为0。在普通卷积核中不使用。
  5. 5. return_idices:如果等于True,会返回输出最大值对应的序号序列。
  6. 6. ceil_mode:如果等于True,计算输出数据大小的时候,会使用向上取整,代替默认的向下取整的操作

3 激活函数

激活函数种类很多,主要遇到的是ReLU和ReLU6,其它的遇到再总结

3.1 ReLU

3.1.1 原理

函数为f(x) = max{0, x}

image.png

ReLu梯度函数为:

image.png

可以看到,其当函数值为0时梯度小于0,即停止该参数的更新。当函数值为正数时,梯度为1不变,则不会出现梯度消失和爆炸的问题。

3.1.2 函数

构成

torch.nn.ReLU(inplace=True)

参数

  1. 1. inplace 默认为False,计算得到的值不会覆盖之前的值,如果设置为True,则会把计算得到的值直接覆盖到输入中,这样可以节省内存/显存。
  2. 举个例子,假设inplace为True,相当于执行x=x+1,直接将结果赋予原变量,实现覆盖如果为False,则会执行y=x+1,多使用一个变量储存结果。

3.2 ReLU6

3.2.1 原理

函数为f(x) = min{6, max{0, x}}

image.png

3.2.2 原理

构造

torch.nn.ReLU6(inplace=True)  # 参数与上述一致

3.3 sigmod

3.3.1 原理

函数如下:

110be3023726486d84260df3df2df920.png

该函数梯度曲线是:

b0c46c62e4aa4f90b4dceb3ab9c4700e.png

可以看到最大时才1/4,在反向传播过程中,会出现梯队消失的问题。因此,现在很少用sigmod作为激活函数。

3.3.2

构造torch.sigmod(input, out=None)->Tensor

  1. 1. input:输入tensor
    例子
a = torch.rand(4)
torch.sigmod(a)

4 Dropout

随机失活,用于防止过拟合

构造

torch.nn.Dropout(p=0.5, inplace=False)
# p 元素归0的概率
# inplace 详细见激活函数

5 全连接层

目前接触到的好像线性全连接层(result=ax+by+c),用来对网络进行分类,其实基本已经被卷积代替。

5.1 原理

45e80dbd4d204591807ad683cc1ff825.png                        输入矩阵input_dimX1与权重矩阵output_dimXimput_dim相乘,得到output_dimX1。

5.1 构造

构造

torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)

参数

  1. 1. in_features:输入尺寸
  2. 2. out_features:输出尺寸
  3. 3. bias:是否使用偏置,默认为True

5.2 输入

Pytorch中shape=(batch_size, in_features)的张量,前面特征提取后一般是(batch_size,channel, height, width),因此需要经过一次展平操作,将维度变成(batch_size, channelheightwidth)。用到函数torch.flatten

torch.flatten(x, start_dim)
# x 需要展开的数据
# start_dim 从哪一维度开始展开

5.3 输出

shape=(batch_size, out_features)

6 Batch Normalization(BN层)

6.1 使用的原因

  1. 1. **加快网络的训练和收敛的速度:**卷积层输出后由于特征图的变化,图像特征的分布就不一样,使得网络难以收敛。BN层将每层的数据都转换在均值为0,方差为1的状态,收敛更加容易。
  2. 2. **防止过拟合:**批量归一化是针对每个Batch的,因此归一化后batch中的图像不再只取决于自己,而是与同一个batch的所有图片都有关系,一定程度上缓解了过拟合。
  3. 3. 解决在训练过程中,中间层数据分布发生改变的问题,以防止梯度消失或爆炸。

6.2 原理

5cf2dd76f72b481a889f7103617f23ee.png

6.3 构造

torch.nn.BatchNorm2d(input_channels)
# input_channels 输入的通道数

6.4 使用

一般位于卷积层和激活函数之间,为什么?

非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移,相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。

基本上其余所有结构都是这些结构的堆叠和变化!!!

相关文章
|
2月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
379 2
|
22天前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
42 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
75 8
利用 PyTorch Lightning 搭建一个文本分类模型
|
2月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
128 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
3月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
213 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
3月前
|
机器学习/深度学习 监控 PyTorch
PyTorch 模型调试与故障排除指南
在深度学习领域,PyTorch 成为开发和训练神经网络的主要框架之一。本文为 PyTorch 开发者提供全面的调试指南,涵盖从基础概念到高级技术的内容。目标读者包括初学者、中级开发者和高级工程师。本文探讨常见问题及解决方案,帮助读者理解 PyTorch 的核心概念、掌握调试策略、识别性能瓶颈,并通过实际案例获得实践经验。无论是在构建简单神经网络还是复杂模型,本文都将提供宝贵的洞察和实用技巧,帮助开发者更高效地开发和优化 PyTorch 模型。
56 3
PyTorch 模型调试与故障排除指南
|
2月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(一):torch.cat()模块的详解
这篇博客文章详细介绍了Pytorch中的torch.cat()函数,包括其定义、使用方法和实际代码示例,用于将两个或多个张量沿着指定维度进行拼接。
113 0
Pytorch学习笔记(一):torch.cat()模块的详解
|
2月前
|
存储 并行计算 PyTorch
探索PyTorch:模型的定义和保存方法
探索PyTorch:模型的定义和保存方法
|
2月前
|
机器学习/深度学习 算法 PyTorch
Pytorch的常用模块和用途说明
肆十二在B站分享PyTorch常用模块及其用途,涵盖核心库torch、神经网络库torch.nn、优化库torch.optim、数据加载工具torch.utils.data、计算机视觉库torchvision等,适合深度学习开发者参考学习。链接:[肆十二-哔哩哔哩](https://space.bilibili.com/161240964)
55 0
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
探索PyTorch:自动微分模块
探索PyTorch:自动微分模块