date
summary
tags
category

相关基础知识

直接跑代码还是很难完全理解代码的过程,所以我决定从更基础的pytorch相关操作学起,尽管第一周有一部分的介绍。

view操作

返回一个有相同数据但大小不同的tensor。 返回的tensor必须有与原tensor相同的数据和相同数目的元素,但可以有不同的大小。一个tensor必须是连续的contiguous()才能被查看。
举例子:
简单来说,view主要起了一个张量形状重塑的操作,核心的逻辑就是重新排列维度使张量的结构改变,但需要底层存储时数据连续(相当于将一块连续的内存重新定义了行列形成不同结构的张量)
-1的作用:占位符,让pytorch自动计算该维度大小,确保新的形状元素总数与原来张量总数保持一致。
📑
计算规则:推断维度 = 总元素数 / 其他指定维度的乘积例如: 若x有24个元素,则x.view(-1, 8)→形状为 [3, 8](因 24/8=3)。 若x有32个元素,则结果为 [4, 8](32/8=4)。
核心特性:前面提到了,1️⃣共享内存,因此不存在数据拷贝,仅修改数据的呈现形式,前后变量共享同一块内存。2️⃣连续性要求。view操作仅适用于连续内存,如果x不连续需要先使用x.contiguous() 使其连续或者该用reshape() 函数达到同样效果。
⚠️
注意:新形状的元素总数必须与原始张量元素总数一致,在使用占位符自动计算时也要保证另一列(行)数可以被整除
工程应用场景:
  1. CNN特征图展平:
    1. RNN序列数据重塑。
      1. 将时间步序列展平以输入线形层。
     

    autograd自动微分

    对Tensor上所有操作进行自动微分的包,对pytorch中的神经网络相当重要。
    torch.Tensor是包的核心类,设置其属性为requires_grad为True,则会开始跟踪对于tensor的所有操作。再调用backward()函数计算所有梯度。
    要停止 tensor 历史记录的跟踪,可以调用detach(),它将其与计算历史记录分离,并防止将来的计算被跟踪。

    PyTorch神经网络

    神经网络可以用torch.nn 来构建。它是基于autograd自动梯度来定义一些模型,一个nn.Module 包括层和一个方法forward,它会返回输出。
    比如一个数字图片识别的网络,是一个简单的前馈神经网络,它接手输入,让输入一个接着一个的通过一些层,最后给出输出。
    一个典型神经网络的训练过程有如下几点:
    1. 定义一个包含可训练参数的神经网络
    1. 迭代整个输入
    1. 通过神经网络处理输入
    1. 计算损失
    1. 反向传播梯度到神经网络的参数
    1. 更新网络参数(一个简单的更新参数的方法:weight = weight - learning_rate *gradient)

    二维卷积层

    class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
    二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)的计算方式:
    说明:
    • bigotimes: 表示二维的相关系数计算
    • stride: 控制相关系数的计算步长
    • dilation: 用于控制内核点之间的距离
    • groups: 控制输入和输出之间的连接: group=1,输出是所有的输入的卷积;group=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这两个输出连接起来。
    💡
    参数kernel_sizestridepaddingdilation可以是一个int的数据,此时卷积height和width值相同;也可以是一个tuple数组,tuple第一维度表示height的数值,tuple的第二维度表示width的数值
    Parameters:参数列表解释
    • in_channels(int):输入信号的通道
    • out_channels(int):卷积产生的通道
    • kerner_size(int or tuple):卷积核的尺寸
    • stride(int or tuple, optional):卷积步长
    • padding(int or tuple, optional):输入的每一条边补充0的层数
    • dilation(int or tuple, optional):卷积核元素之间的间距
    • groups(int, optional):从输入通道到输出通道的阻塞连接数
    • bias(bool, optional):如果bias=True,添加偏置
    例子:
    📑
    总结卷积核:
    • 步长、填充、空洞卷积d的值类型如果为tuple类型时,第一个参数控制height方向,第二个参数控制width方向
    • 步长为2时,下采样,可以压缩特定方向的信息,只关注特定方向。比如stride = (2,1)时宽度方向的信息保留。
    • 边界填充是为了保留边缘信息。
    • dilation=(3, 1):意味着高度方向的卷积核间距为3,等效扩大感受野为9
      • 仅扩大感受野但是不增加参数量(代替大的卷积核,减少了计算量),用于大范围捕获上下文
        体现在运算过程如下图:(dilation为2的时候,此时感受野为5)
        notion image
    本实验仅用到了二维卷积核,故只详细看了该部分的接口内容。

    池化层

    class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
    对于输入信号的输入通道,提供2维最大池化(max pooling)操作。
    如果输入的大小是(N,C,H,W),那么输出的大小是(N,C,H_out,W_out)和池化窗口大小(kH,kW)的关系是:
    参数说明:
    • kernel_size(int or tuple):max pooling的窗口大小
    • stride(int or tuple, optional):max pooling的窗口移动的步长。默认值是kernel_size
    • padding(int or tuple, optional):输入的每一条边补充0的层数
    • dilation(int or tuple, optional):一个控制窗口中元素步幅的参数
    • return_indices:如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助
    • ceil_mode:如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
    💡
    与卷积核类似的参数列表类似:
    参数kernel_sizestridepaddingdilation数据类型: 可以是一个int类型的数据,此时卷积height和width值相同; 也可以是一个tuple数组(包含来两个int类型的数据),第一个int数据表示height的数值,tuple的第二个int类型的数据表示width的数值
    举例:
     
    推断维度 = 总元素数 / 其他指定维度的乘积例如: 若 x有 24 个元素,则 x.view(-1, 8)→ 形状为 [3, 8](因 24/8=3)。 若 x有 32 个元素,则结果为 [4, 8](32/8=4)。

    复现网络

    notion image
     
     
    相关文章
    notion快速搭个人博客(真的超快!)ouc新芽第一周