Pytorch torch.nn库以及nn与nn.functional有什么区别?

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Pytorch torch.nn库以及nn与nn.functional有什么区别?

tocrch.nn库

  • torch.nn是专门为神经网络设计的模块化接口
  • nn构建于autograd之上,可以用来定义和运行神经网络
  • nn.Parameter
  • nn.Linear&nn.conv2d等等
  • nn.functional
  • nn.Module
  • nn.Sequential

nn.Parameter

  • 定义可训练参数
  • self.my_param=nn.Parameter(torch.randn(1))
  • self.register_parameter
  • nn.ParameterList&nn.ParameterDict
这个类实际上是将一个Parameter的List转为ParameterList,如下例所示[nn.Parameter(torch.randn(10, 10)) for i in range(10)]类型是List,List的每个元素是Parameter,然后这个List作为参数传入这个类构造ParameterList类型。ParameterList输入一定是一个Parameter的List,其他类型会报错,在注册时候就会提示元素不是Parameter类型。
self.params = nn.ParameterList([nn.Parameter(torch.randn(10, 10)) for i in range(10)])

输入参数是个普通字典,然后转换为ParameterDict类型。

self.params = nn.ParameterDict({ 
        'left': nn.Parameter(torch.randn(5, 10)), 
        'right': nn.Parameter(torch.randn(5, 10))
})

nn.Linear&nn.conv2d&nn.ReLU&nn.maxPool2d&nn.MSELoss等等

  • 各种神经网络层的定义,继承于nn.Module的子类
  • self.conv1=nn.Conv2d(1,6(5,5))
  • 调用时:slef.conv1(x)
  • 参数为parameter类型
  • layer=nn.Linear(1,1)
  • layer.weight=nn.Parameter(torch.FloatTensor([[0]]))
  • layer.bias=nn.Parameter(torch.FloatTensor([0]))

nn.functional

  • 包含torch.nn库中所有函数,包含大量loss和activation function
  • torch.nn.functional.conv2d(input,weight,bias=None,stride=1,padding=0,dilation=1,groups=1)
  • 没有学习参数的(eg.maxpool,loss_func,activation func)等根据个人选择使用http://nn.functional.xxxhttp://nn.xxx
  • 关于dropout层,推荐使用http://nn.xxx。因为一般情况下只有训练时才用dropout,在eval不需要dropout。使用nn.Dropout,在调用model.eval()后,模型的dropout层都关闭,但用nn.functional.dropout,在调用model.eval()后不会关闭dropout.

nn与nn.functional有什么区别?

nn.Sequential

一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数

# Example of using Sequential
        model = nn.Sequential(
                  nn.Conv2d(1,20,5),
                  nn.ReLU(),
                  nn.Conv2d(20,64,5),
                  nn.ReLU()
                )
        # Example of using Sequential with OrderedDict
        model = nn.Sequential(OrderedDict([
                  ('conv1', nn.Conv2d(1,20,5)),
                  ('relu1', nn.ReLU()),
                  ('conv2', nn.Conv2d(20,64,5)),
                  ('relu2', nn.ReLU())
                ]))

nn.ModuleList

它可以以列表的形式来保持多个子模块。

ModuleList 能够像python列表一样被索引访问,而且其中的模块会被正确地登记注册,而且它保存的模块可以被所有Module方法可见,之所以不能直接用python列表来保存,是因为PyTorch需要自动跟踪计算图并计算自动梯度,如果直接使用python列表或者python字典来保存module,那么无法正确地自动计算梯度.
class MyModule(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])
    def forward(self, x):
        # ModuleList can act as an iterable, or be indexed         using ints
        for i, l in enumerate(self.linears):
            x = self.linears[i // 2](x) + l(x)
            return x

nn.ModuleDict

class MyModule(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.choices = nn.ModuleDict({
                'conv': nn.Conv2d(10, 10, 3),
                'pool': nn.MaxPool2d(3)
        })
        self.activations = nn.ModuleDict([
                ['lrelu', nn.LeakyReLU()],
                ['prelu', nn.PReLU()]
        ])
    def forward(self, x, choice, act):
        x = self.choices[choice](x)
        x = self.activations[act](x)
        return x

nn.Module

  • 它是一个抽象概念,既可以表示神经网络中的某个层(layer),也可以表示一个包含很多层的神经网络
  • model.parameters()
  • model.buffers()
  • model.state_dict()
  • model.modules() 迭代遍历模型的所有子层,所有子层即指nn.Module子类
  • forward(),to()

1698843917107.jpg

Parameters VS buffers

  • 一种是反向传播需要被optimizer更新的,称之为 parameter(如权重等)
  • self.register_parameter("param",param)
  • self.param=nn.Parameter(torch.randn(1))
  • 一种是反向传播不需要被optimizer更新,称之为 buffer(一些阈值之类的)
  • self.register_buffer(''my_buffer,torch.randn(1))

模型状态字典state_dict() & load_state_dict

1、state_dict()

返回一个包含 Module 实例完整状态的字典,包括参数和缓冲区,字典的键值是参数或缓冲区的名称

2、load_state_dict(state_dict, strict=True)

从 state_dict 中复制参数和缓冲区到 Module 及其子类中

  • state_dict:包含参数和缓冲区的 Module 状态字典
  • strict:默认 True,是否严格匹配 state_dict 的键值和 Module.state_dict()的键值
torch.save(obj=model.state_dict().f="modles/net.pth")
model.load_state_dict(torch.load("models/net.pth"))
相关文章
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
583 0
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
|
4月前
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch 中的动态图与静态图:理解它们的区别及其应用场景
【8月更文第29天】深度学习框架中的计算图是构建和训练神经网络的基础。PyTorch 支持两种类型的计算图:动态图和静态图。本文旨在阐述这两种计算图的区别、各自的优缺点以及它们在不同场景下的应用。
817 0
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习框架:Pytorch与Keras的区别与使用方法
深度学习框架:Pytorch与Keras的区别与使用方法
|
4月前
|
机器学习/深度学习 存储 PyTorch
【深度学习】Pytorch面试题:什么是 PyTorch?PyTorch 的基本要素是什么?Conv1d、Conv2d 和 Conv3d 有什么区别?
关于PyTorch面试题的总结,包括PyTorch的定义、基本要素、张量概念、抽象级别、张量与矩阵的区别、不同损失函数的作用以及Conv1d、Conv2d和Conv3d的区别和反向传播的解释。
263 2
|
5月前
|
机器学习/深度学习 PyTorch TensorFlow
在深度学习中,数据增强是一种常用的技术,用于通过增加训练数据的多样性来提高模型的泛化能力。`albumentations`是一个强大的Python库,用于图像增强,支持多种图像变换操作,并且可以与深度学习框架(如PyTorch、TensorFlow等)无缝集成。
在深度学习中,数据增强是一种常用的技术,用于通过增加训练数据的多样性来提高模型的泛化能力。`albumentations`是一个强大的Python库,用于图像增强,支持多种图像变换操作,并且可以与深度学习框架(如PyTorch、TensorFlow等)无缝集成。
|
5月前
|
数据可视化 计算机视觉 异构计算
确保您已经安装了必要的库,包括`torch`、`torchvision`、`segmentation_models_pytorch`、`PIL`(用于图像处理)和`matplotlib`(用于结果可视化)。您可以使用pip来安装这些库:
确保您已经安装了必要的库,包括`torch`、`torchvision`、`segmentation_models_pytorch`、`PIL`(用于图像处理)和`matplotlib`(用于结果可视化)。您可以使用pip来安装这些库:
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】16. Pytorch中神经网络模型的构造方法:Module、Sequential、ModuleList、ModuleDict的区别
【从零开始学习深度学习】16. Pytorch中神经网络模型的构造方法:Module、Sequential、ModuleList、ModuleDict的区别
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
Pytorch 与 Tensorflow:深度学习的主要区别(1)
Pytorch 与 Tensorflow:深度学习的主要区别(1)
209 2
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习:Pytorch 与 Tensorflow 的主要区别(2)
深度学习:Pytorch 与 Tensorflow 的主要区别(2)
101 0