Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

PyTorch——激活函数调用的最佳实践


整体说明

  • 在PyTorch中,调用激活函数有几种常见方法:

    • 方法一 :通过 torch.relu() 直接调用激活函数【几乎不会使用,常用torch.nn.functional.relu()方式替代】
      • 使用时不需要实例化对象,适合用于简单的函数式调用
      • 它接受一个张量作为输入,并对这个张量应用ReLU操作
    • 方法二 :使用 torch.nn.functional.relu()(通常简写为 F)直接调用激活函数,一种函数式的方式来应用ReLU激活函数
      • 使用时不需要实例化对象,适合用于简单的函数式调用
      • 和torch.relu()类似,但它提供了更多的灵活性,比如你可以通过参数控制是否进行原地操作(inplace)等
      • 从技术角度来看,使用 torch.relu 和 F.relu 最终调用了相同的底层实现
    • 方法三 :通过 torch.nn.ReLU() 创建对象后调用
      • 这是ReLU作为一个层(layer)的形式出现,属于torch.nn模块。当你需要将ReLU作为一个网络的一部分时使用
      • 在使用前需要先实例化一个ReLU对象,然后可以像其他层一样调用这个对象。这种方式更适合于构建神经网络模型的架构中,因为它遵循了面向对象的设计理念,可以方便地集成到模型定义中
  • 总结来说,如果你只是想应用ReLU而不考虑网络结构,可以直接使用torch.relu()或torch.nn.functional.relu()。若你在构建一个复杂的神经网络并且希望以层的形式组织你的激活函数,则推荐使用torch.nn.ReLU()。对于更细粒度的控制需求,如执行原地操作来节省内存,torch.nn.functional.relu()是更好的选择


使用 torch.nn.functional 调用激活函数

  • 设计目的 : torch.nn.functional 提供了一系列函数式接口,适用于直接对张量执行操作,比如激活函数、池化等。这种方式非常适合用于需要灵活地应用不同操作的场景
  • 典型使用场景 : 当你需要在模型外部或者在自定义的前向传播逻辑中灵活地应用某些操作时,F 模块下的函数是非常有用的。例如,在定义一个自定义的 forward 方法时,你可以直接对输入张量调用 F.relu()
    1
    2
    3
    4
    5
    import torch
    import torch.nn.functional as F

    input_tensor = torch.randn(2, 3)
    output_tensor = F.relu(input_tensor)

使用 torch.nn.ReLU 调用激活函数

  • 设计目的 : 尽管 torch 下也有可以直接调用的激活函数(如 torch.relu),但这种做法并不常见
  • 典型使用场景 : 实际上,对于激活函数这类操作,更推荐使用 torch.nn.functional 或者对应的 nn 模块中的类(例如 torch.nn.ReLU)。这是因为它们提供了更清晰的设计模式,并且与PyTorch的整体设计理念更加一致
    1
    2
    3
    4
    5
    6
    import torch
    import torch.nn as nn

    relu_layer = nn.ReLU()
    input_tensor = torch.randn(2, 3)
    output_tensor = relu_layer(input_tensor)

总结

  • F 模块提供了一种更为灵活的方式来调用激活函数和其他层操作,因为它允许你直接将这些操作应用于任何张量,而不需要先将其包装在一个模块中
  • 使用 torch.nn.functional 或者对应的 nn 模块中的类来调用激活函数有助于保持代码的一致性和提高代码的可读性,这是由于PyTorch社区普遍采用这样的编码风格
  • 因此,尽管从技术角度来看,使用 torch.relu 和 F.relu 最终调用了相同的底层实现,但为了遵循最佳实践和保持代码的一致性,推荐使用 F.relu 或者 nn.ReLU 来应用ReLU激活函数。这样做不仅使得代码更具可读性,也更容易维护

PyTorch——计算机视觉torchvision

PyTorch中有个torchvision包,里面包含着很多计算机视觉相关的数据集(datasets),模型(models)和图像处理的库(transforms)等
本文主要介绍数据集中(ImageFolder)类和图像处理库(transforms)的用法


PyTorch预先实现的Dataset

  • ImageFolder

    1
    from torchvision.datasets import ImageFolder
  • COCO

    1
    from torchvision.datasets import coco
  • MNIST

    1
    from torchvision.datasets import mnist
  • LSUN

    1
    from torchvision.datasets import lsun
  • CIFAR10

    1
    from torchvision.datasets import CIFAR10

ImageFolder

  • ImageFolder假设所有的文件按照文件夹保存,每个文件夹下面存储统一类别的文件,文件夹名字为类名

  • 构造函数

    1
    ImageFolder(root, transform=None, target_transform=None, loader=default_loader)
    • root:在root指定的路径下寻找图片,root下面的每个子文件夹就是一个类别,每个子文件夹下面的所有文件作为当前类别的数据
    • transform:对PIL Image进行的转换操作,transform的输入是使用loader读取图片的返回对象
      • PIL是 Python Imaging Library 的简称,是Python平台上图像处理的标准库
    • target_transform:对label的转换, 默认会自动编码
      • 默认编码为从0开始的数字,如果我们自己将文件夹命名为从0开头的数字,那么将按照我们的意愿命名,否则命名顺序不确定
      • 测试证明,如果文件夹下面是root/cat/, root/dog/两个文件夹,则自动编码为{‘cat’: 0, ‘dog’: 1}
      • class_to_idx属性存储着文件夹名字和类别编码的映射关系,dict
      • classes属性存储着所有类别,list
    • loader:从硬盘读取图片的函数
      • 不同的图像读取应该用不同的loader
      • 默认读取为RGB格式的PIL Image对象
      • 下面是默认的loader
        1
        2
        3
        4
        5
        6
        def default_loader(path):
        from torchvision import get_image_backend
        if get_image_backend() == 'accimage':
        return accimage_loader(path)
        else:
        return pil_loader(path)

transfroms详解

  • 包导入

    1
    from torchvision.transforms import transforms
  • transforms包中包含着很多封装好的transform操作

    • transforms.Scale(size):将数据变成制定的维度
    • transforms.ToTensor():将数据封装成PyTorch的Tensor类
    • transforms.Normalize(mean, std): 将数据标准话,具体标准化的参数可指定
  • 可将多个操作组合到一起,同时传入 ImageFolder 等对数据进行同时操作,每个操作被封装成一个类

    1
    2
    3
    4
    simple_transform = transforms.Compose([transforms.Resize((224,224))
    ,transforms.ToTensor()
    ,transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
    train = ImageFolder('dogsandcats/train/',simple_transform)
  • torchvision.transforms.transforms包下的操作类都是基于torchvision.transforms.functional下的函数实现的

    • 导入torchvision.transforms.functional的方式
      1
      from torchvision.transforms import functional
1…201202203…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4