【Pytorch--代码技巧】各种论文代码常见技巧

本文涉及的产品
大数据开发治理平台 DataWorks,不限时长
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
简介: 博主在阅读论文原代码的时候常常看见一些没有见过的代码技巧,特此将这些内容进行汇总

 博主在阅读论文原代码的时候常常看见一些没有见过的代码技巧,特此将这些内容进行汇总

1 torch.view()

作用:重置Tensor对象维度

注意点:参数中的-1表示系统自动判断,因此每个view里面只能出现一个-1

x = torch.randn(4,4)
# 重置为向量
x.view(16).size()
# 重置为多维矩阵
x.view(2,2,4).size()
# -1 数字用法
x.view(-1,8).sieze

image.gif

torch.Size([16])
torch.Size([2,2,4])
torch.Size([2,8])

image.gif

2  torch.unsqueeze()

作用:升维,最常见的就是unsqueeze(-1)表示将一维升到二维

x = torch.randn(4)
x = x.unsqueeze(-1)

image.gif

torch.Size([16,1])

image.gif

3 torch.expand()

作用:升维

# x 维度为[4]
x =torch.tensor([1,2,3,4])
# x1 维度为[3,1,4]
x1 = x.expend(3,1,4)
print(x1)
>>> 
tensor([[[1, 2, 3, 4]],
        [[1, 2, 3, 4]],
        [[1, 2, 3, 4]]])

image.gif

torch.Size([16,1])

image.gif

4 torch.transpose(0, 1)

作用:转置

注意:

1 只能拓展维度,比如 A的shape为 2x4的,不能 A.expend(1,4),只能保证原结构不变,在前面增维,比如A.shape(1,1,4)

2 可以增加多维,比如x的shape为(4),x.expend(2,2,1,4)只需保证本身是4

3 不能拓展低维,比如x的shape为(4),不能x.expend(4,2)

x = torch.randn(16,1)
x = x.transpose(0,1)

image.gif

torch.Size([1,16])

image.gif

5 去除对角线元素

一般使用z方法,因为x方法对float不可用而z可以

x = torch.randint(1, 4, (4, 4))
y = x ^ torch.diag_embed(torch.diag(x))
z = x - torch.diag_embed(torch.diag(x))

image.gif

tensor([[2, 2, 2, 1],
        [3, 1, 1, 2],
        [3, 1, 3, 1],
        [3, 1, 2, 2]])
tensor([[0, 2, 2, 1],
        [3, 0, 1, 2],
        [3, 1, 0, 1],
        [3, 1, 2, 0]])
tensor([[0, 2, 2, 1],
        [3, 0, 1, 2],
        [3, 1, 0, 1],
        [3, 1, 2, 0]])

image.gif

6 torch.gather()

作用:根据维度dim按照索引列表index从input中选取指定元素

b = torch.Tensor([[1,2,3],[4,5,6]])
print(b)
index_1 = torch.LongTensor([[0,1],[2,0]])
index_2 = torch.LongTensor([[0,1,1],[0,0,0]])
print (torch.gather(b, dim=1, index=index_1))
print (torch.gather(b, dim=0, index=index_2))

image.gif

tensor([[1., 2., 3.],
        [4., 5., 6.]])
tensor([[1., 2.],
        [6., 4.]])
tensor([[1., 5., 6.],
        [1., 2., 3.]])

image.gif

7 nn.Parameter()

作用:将一个不可训练的tensor转换为一个有梯度的可训练的tensor。往往用在需要自己定义的bisa中

self.bias = nn.Parameter(torch.ones([5]))
output = self.Weight(x) + self.bias

image.gif

8 nn.Sequential

作用:将多个网络模块组合成一个模块,需要注意的是相邻的两个网络模块之间的输入输出尺寸

self.block = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(512 * 2, 128),
            nn.Linear(128, 16),
            nn.Linear(16, num_classes),
            nn.Softmax(dim=1)
        )

image.gif

9 nn.moduleList

作用:将多个网络模块放到一个类List中,后续可以从中进行调用

# 定义三个输入channels为1,输出channels为2,卷积核为[2,768]、[3,768]、[4,768]的卷积
        self.convs = nn.ModuleList(
            [nn.Conv2d(in_channels=1, out_channels=self.num_filters,
                       kernel_size=(k, 768), ) for k in self.filter_sizes])

image.gif

10 nn.MaxPool2d

作用:MaxPooling,提取重要信息,去掉不重要信息,从而减少计算开销

image.gif编辑

其一共有6个基本参数

    • kernel_size:池化窗口大小,输入单值如3则为3×3,输入元组如(3,2)则为3×2
    • stride:步长,单值元组均可。默认与池化窗口大小一致
    • padding:填充,单值元组均可。默认为0
    • dilation:控制窗口中元素步幅,不重要!
    • return_indices:布尔类型,返回最大值位置索引
    • ceil_mode:布尔类型,默认为False。False为向下取整,True为向上取整

    11 permute()

    作用:根据位置进行维度转化

    >>> x = torch.randn(2, 3, 5) 
    >>> x.size() 
    torch.Size([2, 3, 5]) 
    >>> x.permute(2, 0, 1).size() 
    torch.Size([5, 2, 3])

    image.gif

    12 torch.cat(inputs,dim)

    作用:根据维度进行Tensor拼接

    b = torch.cat(a, 4)

    image.gif

    13 torch.clamp(input, min, max, out=None)

    作用:将维度限制在min和max之间

    sum_mask = torch.clamp(sum_mask, min=1e-9)

    image.gif


    目录
    相关文章
    |
    1月前
    |
    机器学习/深度学习 算法 PyTorch
    RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
    RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
    706 1
    |
    1月前
    |
    机器学习/深度学习 关系型数据库 MySQL
    大模型中常用的注意力机制GQA详解以及Pytorch代码实现
    GQA是一种结合MQA和MHA优点的注意力机制,旨在保持MQA的速度并提供MHA的精度。它将查询头分成组,每组共享键和值。通过Pytorch和einops库,可以简洁实现这一概念。GQA在保持高效性的同时接近MHA的性能,是高负载系统优化的有力工具。相关论文和非官方Pytorch实现可进一步探究。
    328 4
    |
    15天前
    |
    机器学习/深度学习 PyTorch 算法框架/工具
    【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
    【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
    |
    15天前
    |
    机器学习/深度学习 PyTorch 算法框架/工具
    【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
    【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
    |
    15天前
    |
    机器学习/深度学习 PyTorch 算法框架/工具
    【从零开始学习深度学习】27.卷积神经网络之VGG11模型介绍及其Pytorch实现【含完整代码】
    【从零开始学习深度学习】27.卷积神经网络之VGG11模型介绍及其Pytorch实现【含完整代码】
    |
    15天前
    |
    机器学习/深度学习 算法 PyTorch
    【从零开始学习深度学习】25.卷积神经网络之LeNet模型介绍及其Pytorch实现【含完整代码】
    【从零开始学习深度学习】25.卷积神经网络之LeNet模型介绍及其Pytorch实现【含完整代码】
    |
    15天前
    |
    机器学习/深度学习 PyTorch 算法框架/工具
    【从零开始学习深度学习】29.卷积神经网络之GoogLeNet模型介绍及用Pytorch实现GoogLeNet模型【含完整代码】
    【从零开始学习深度学习】29.卷积神经网络之GoogLeNet模型介绍及用Pytorch实现GoogLeNet模型【含完整代码】
    |
    1月前
    |
    机器学习/深度学习 存储 并行计算
    深入解析xLSTM:LSTM架构的演进及PyTorch代码实现详解
    xLSTM的新闻大家可能前几天都已经看过了,原作者提出更强的xLSTM,可以将LSTM扩展到数十亿参数规模,我们今天就来将其与原始的lstm进行一个详细的对比,然后再使用Pytorch实现一个简单的xLSTM。
    74 2
    |
    1月前
    |
    机器学习/深度学习 并行计算 PyTorch
    【多GPU炼丹-绝对有用】PyTorch多GPU并行训练:深度解析与实战代码指南
    本文介绍了PyTorch中利用多GPU进行深度学习的三种策略:数据并行、模型并行和两者结合。通过`DataParallel`实现数据拆分、模型不拆分,将数据批次在不同GPU上处理;数据不拆分、模型拆分则将模型组件分配到不同GPU,适用于复杂模型;数据和模型都拆分,适合大型模型,使用`DistributedDataParallel`结合`torch.distributed`进行分布式训练。代码示例展示了如何在实践中应用这些策略。
    821 2
    【多GPU炼丹-绝对有用】PyTorch多GPU并行训练:深度解析与实战代码指南
    |
    1月前
    |
    PyTorch 算法框架/工具
    使用Pytorch Geometric 进行链接预测代码示例
    该代码示例使用PyTorch和`torch_geometric`库实现了一个简单的图卷积网络(GCN)模型,处理Cora数据集。模型包含两层GCNConv,每层后跟ReLU激活和dropout。模型在训练集上进行200轮训练,使用Adam优化器和交叉熵损失函数。最后,计算并打印测试集的准确性。
    41 6

    热门文章

    最新文章