pytorch里面的nn库:torch.nn.modules、torch.nn.functional、torch.nn.parameter、torch.nn.Sequential

torch.nn是专门为神经网络设计的模块化接口
torch.nn构建与autograd之上,可以用来定义和运行神经网络

介绍一下四大库:torch.nn.modules、torch.nn.functional、torch.nn.parameter、torch.nn.Sequential

torch.nn.modules

************torch.nn.modules*************
torch.nn.MSELoss
torch.nn.CrossEntropyLoss 
torch.nn.Conv2d # 封装的是卷积神经网络层
torch.nn.Embedding
torch.nn.LSTM
torch.nn.Linear
torch.nn.dropout
torch.nn.LeakyReLU

封装的每一层就是一个模块
// An highlighted block
var foo = 'bar';
// An highlighted block
var foo = 'bar';

torch.nn.functional

************torch.nn.functional************
torch.nn.functional.conv2d
torch.nn.functional.embedding
torch.nn.functional.bilinear

torch.nn.functional & torch.nn.modules有什么区别?

torch.nn.functional & torch.nn.modules有什么区别?

1) 类型不同:torch.nn.functional是函数,torch.nn.modules是类
函数:只是进行简单的 数学运算而已。functional中的函数是一个确定的不变的运算公式,输入数据产生输出就ok,
类:会自动提取可学习的参数 深度学习中会有很多权重是在不断更新的,不可能每进行一次forward就用新的权重重新来定义一遍函数来进行计算,
所以说就会采用类的方式,以确保能在参数发生变化时仍能使用我们之前定好的运算步骤。

2) 如果模型有可学习的参数,最好使用nn.Module对应的相关layer,否则二者都可以使用,没有什么区别:
比如此例中的Relu其实没有可学习的参数,只是进行一个运算而已,所以使用的就是functional中的relu函数, 而卷积层和全连接层都有可学习的参数,
所以用的是nn.Module中的类。 不具备可学习参数的层,将它们用函数代替,这样可以不用放在构造函数中进行初始化。

3) nn.functional.xxx 需要自己定义 weight,每次调用时都需要手动传入 weight,而 nn.xxx 则不用,举例如下

示例:

import torch
import torch.nn as nn
import torch.nn.functional as F

# torch.nn 定义的CNN
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()

        self.conv_1 = nn.Conv2d(1, 16, krenel_size=5, padding=0)
        self.relu_1 = nn.ReLU(inplace=True)
        self.maxpool_1 = nn.MaxPool2d(kernel_
### 如何使用 PyTorch 中的 `torch.nn.Module` 创建模型 #### 定义自定义神经网络模型 为了创建一个基于 `torch.nn.Module` 的自定义神经网络模型,需继承该类并重写其构造函数 (`__init__`) 和前向传播方法 (`forward`). 这种方式不仅限于简单的层堆叠;通过组合不同的子模块,可以构建复杂的架构。 ```python import torch.nn as nn import torch.nn.functional as F class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() # 初始化卷积层和其他组件 self.conv1 = nn.Conv2d(1, 20, kernel_size=5) self.conv2 = nn.Conv2d(20, 20, kernel_size=5) def forward(self, x): # 实现数据流经各层的过程 x = F.relu(self.conv1(x)) return F.relu(self.conv2(x)) ``` 上述代码展示了如何利用 `torch.nn.Module` 来搭建具有两层卷积操作的简单图像分类器[^2]. #### 参数管理和共享权重 当希望某些部分之间共享相同的参数时,可以直接声明这些参数作为属性,并在多个地方调用相应的函数来应用它们。这使得实现如循环结构或特定形式的权值绑定变得容易得多. ```python import torch import torch.nn as nn import torch.nn.functional as F class SharedWeightModel(nn.Module): def __init__(self): super(SharedWeightModel, self).__init__() # 显式定义可训练参数 self.weight = nn.Parameter(torch.rand(32, 16, 5, 5)) self.bias = nn.Parameter(torch.rand(32)) def forward(self, x): # 对同一组参数执行两次不同位置上的卷积运算 x1 = F.conv2d(x, self.weight, self.bias) x2 = F.conv2d(x, self.weight, self.bias) return x1 + x2 ``` 此示例说明了怎样借助 `nn.Parameter` 类型的对象以及来自 `torch.nn.functional` 命名空间内的工具来进行更灵活的设计[^3]. #### 添加线性变换层 除了卷积外,全连接(即密集)层也是常见的组成部分之一。下面的例子介绍了如何引入这样的转换: ```python import torch import torch.nn as nn linear_module = nn.Linear(in_features=5, out_features=3) input_data = torch.randn(2, 5) # 随机生成一批二维输入数据 output = linear_module(input_data) # 执行一次完整的正向传递过程 ``` 这里展示了一个非常基础的应用场景——将五个维度的数据映射到三个新维度上[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值