pytorch人工智能之torch.gather算子用法示例

PyTorch人工智能之torch.gather算子用法示例

torch.gather是PyTorch中的一个重要算子,用于在指定维度上收集输入张量中指定索引处的值。在本文中,我们将介绍torch.gather的用法,并提供两个示例说明。

torch.gather的用法

torch.gather的语法如下:

torch.gather(input, dim, index, out=None)

其中,参数含义如下:

  • input:输入张量。
  • dim:指定维度。
  • index:索引张量。
  • out:输出张量。

torch.gather的作用是在input张量的dim维度上,根据index张量中的索引,收集input张量中对应位置的值,并将结果存储在输出张量out中。

示例1:使用torch.gather实现分类任务

下面是一个示例,演示了如何使用torch.gather实现分类任务:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = torch.relu(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = torch.relu(x)
        x = self.pool(x)
        x = x.view(-1, 16 * 5 * 5)
        x = self.fc1(x)
        x = torch.relu(x)
        x = self.fc2(x)
        x = torch.relu(x)
        x = self.fc3(x)
        return x

# 加载数据集,并使用DataLoader创建数据加载器
train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

# 进行模型训练
for epoch in range(10):
    for i, (inputs, targets) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

        # 打印训练日志
        print('Epoch: %d, Batch: %d, Loss: %.4f' % (epoch+1, i+1, loss.item()))

    # 在测试集上测试模型
    test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
    test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=128, shuffle=False)
    correct = 0
    total = 0
    with torch.no_grad():
        for inputs, targets in test_loader:
            outputs = net(inputs)
            _, predicted = torch.max(outputs.data, 1)
            total += targets.size(0)
            correct += (predicted == targets).sum().item()

    # 打印测试日志
    print('Epoch: %d, Test Accuracy: %.2f%%' % (epoch+1, 100 * correct / total))

在这个示例中,我们首先定义了一个包含卷积层、池化层、全连接层等的卷积神经网络。然后,我们加载了CIFAR10数据集,并使用DataLoader创建了数据加载器。然后,我们定义了一个交叉熵损失函数和一个SGD优化器。最后,我们进行了模型训练,并在测试集上测试了模型的泛化能力。

示例2:使用torch.gather实现双线性插值

下面是一个示例,演示了如何使用torch.gather实现双线性插值:

import torch

def bilinear_interpolate(im, x, y):
    # 获取图像大小
    _, _, h, w = im.size()

    # 计算四个相邻像素的坐标
    x0 = torch.floor(x).long()
    x1 = x0 + 1
    y0 = torch.floor(y).long()
    y1 = y0 + 1

    # 确保坐标不超出图像范围
    x0 = torch.clamp(x0, 0, w-1)
    x1 = torch.clamp(x1, 0, w-1)
    y0 = torch.clamp(y0, 0, h-1)
    y1 = torch.clamp(y1, 0, h-1)

    # 计算四个相邻像素的权重
    wa = (x1.float() - x) * (y1.float() - y)
    wb = (x1.float() - x) * (y - y0.float())
    wc = (x - x0.float()) * (y1.float() - y)
    wd = (x - x0.float()) * (y - y0.float())

    # 收集四个相邻像素的值,并进行双线性插值
    Ia = im[:, :, y0, x0]
    Ib = im[:, :, y1, x0]
    Ic = im[:, :, y0, x1]
    Id = im[:, :, y1, x1]
    out = wa.unsqueeze(1) * Ia + wb.unsqueeze(1) * Ib + wc.unsqueeze(1) * Ic + wd.unsqueeze(1) * Id

    return out

# 创建输入张量
im = torch.randn(1, 3, 4, 4)

# 创建坐标张量
x = torch.tensor([0.5, 1.5, 2.5, 3.5])
y = torch.tensor([0.5, 1.5, 2.5, 3.5])

# 进行双线性插值
out = bilinear_interpolate(im, x, y)

# 打印结果
print(out)

在这个示例中,我们首先定义了一个bilinear_interpolate函数,用于实现双线性插值。然后,我们创建了一个输入张量im和一个坐标张量xy。最后,我们使用torch.gather实现了双线性插值,并打印了结果。

总结

本文介绍了torch.gather算子的用法,并提供了两个示例说明。在实现过程中,我们使用torch.gather实现了分类任务和双线性插值,展示了torch.gather的强大功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch人工智能之torch.gather算子用法示例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 转:pytorch优化器传入多个模型的参数

    pytorch 优化器(optim)不同参数组,不同学习率设置  

    PyTorch 2023年4月7日
    00
  • pytorch提取神经网络模型层结构和参数初始化

    torch.nn.Module()类有一些重要属性,我们可用其下面几个属性来实现对神经网络层结构的提取: torch.nn.Module.children() torch.nn.Module.modules() torch.nn.Module.named_children() torch.nn.Module.named_moduless() 为方面说明,我们…

    2023年4月8日
    00
  • PyTorch 如何检查模型梯度是否可导

    在PyTorch中,我们可以使用torch.autograd.gradcheck()函数来检查模型梯度是否可导。torch.autograd.gradcheck()函数会对模型的梯度进行数值检查,以确保梯度计算的正确性。下面是一个示例: import torch # 定义一个简单的模型 class Model(torch.nn.Module): def __…

    PyTorch 2023年5月15日
    00
  • pytorch搭建网络模型的4种方法

    import torch import torch.nn.functional as F from collections import OrderedDict   # Method 1 —————————————–   class Net1(torch.nn.Module):   def __init_…

    PyTorch 2023年4月7日
    00
  • Pytorch通过保存为ONNX模型转TensorRT5的实现

    PyTorch是一个流行的深度学习框架,而TensorRT是一个高性能的推理引擎。在实际应用中,我们可能需要将PyTorch模型转换为TensorRT模型以获得更好的推理性能。本文将详细讲解如何通过保存为ONNX模型转换PyTorch模型为TensorRT模型,并提供两个示例说明。 1. 保存为ONNX模型 在PyTorch中,我们可以使用torch.onn…

    PyTorch 2023年5月15日
    00
  • 强化学习 单臂摆(CartPole) (DQN, Reinforce, DDPG, PPO)Pytorch

    单臂摆是强化学习的一个经典模型,本文采用了4种不同的算法来解决这个问题,使用Pytorch实现。 DQN: 参考: 算法思想: https://mofanpy.com/tutorials/machine-learning/torch/DQN/ 算法实现 https://pytorch.org/tutorials/intermediate/reinforcem…

    PyTorch 2023年4月8日
    00
  • [pytorch]动态调整学习率

    问题描述 在深度学习的过程中,会需要有调节学习率的需求,一种方式是直接通过手动的方式进行调节,即每次都保存一个checkpoint,但这种方式的缺点是需要盯着训练过程,会很浪费时间。因此需要设定自动更新学习率的方法,让模型自适应地调整学习率。 解决思路 通过epoch来动态调整,比如每10次学习率为原来的0.1 实现示例: def adjust_learni…

    PyTorch 2023年4月8日
    00
  • windows环境 pip离线安装pytorch-gpu版本总结(没用anaconda)

    1.确定你自己的环境信息。 我的环境是:win8+cuda8.0+python3.6.5 各位一定要根据python版本和cuDa版本去官网查看所对应的.whl文件再下载! 2.去官网查看环境匹配的torch、torchversion版本信息,然后去镜像源下载对应的文件 (直接去官网下载会出现中断的情况,如果去官网下载建议尝试迅雷下载)或者镜像网站下载对应的…

    PyTorch 2023年4月7日
    00
合作推广
合作推广
分享本页
返回顶部