PyTorch学习总结(五)——torch.nn

这篇博客详细介绍了PyTorch中的torch.nn模块,包括Parameters、Containers的使用,如Module类的功能,以及Pooling Layers、Padding Layers和Sparse layers的相关操作。通过示例展示了如何添加子模块、设置模型状态、加载参数,并探讨了不同类型的池化层和填充层。此外,还提到了如何访问和操作稀疏层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述


Parameters

class torch.nn.Parameter()

Variable的一种,常被用于模块参数(module parameter)。

Parameters 是 Variable 的子类。Paramenters和Modules一起使用的时候会有一些特殊的属性,即:当Paramenters赋值给Module的属性的时候,他会自动的被加到 Module的 参数列表中(即:会出现在 parameters() 迭代器中)。将Varibale赋值给Module属性则不会有这样的影响。 这样做的原因是:我们有时候会需要缓存一些临时的状态(state), 比如:模型中RNN的最后一个隐状态。如果没有Parameter这个类的话,那么这些临时变量也会注册成为模型变量。

Variable 与 Parameter的另一个不同之处在于,Parameter不能被 volatile(即:无法设置volatile=True)而且默认requires_grad=True。Variable默认requires_grad=False。

Containers

class torch.nn.Module

add_module(name, module)

将一个 child module 添加到当前 modle。 被添加的module可以通过 name属性来获取。 例:

import torch.nn as nn
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.add_module("conv", nn.Conv2d(10, 20, 4))
        #self.conv = nn.Conv2d(10, 20, 4) is the same as above
model = Model()
print(model.conv)

输出:

Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))

children()

Returns an iterator over immediate children modules. 返回当前模型 子模块的迭代器。

import torch.nn as nn
class Model(nn.Module):
    def __init__
### PyTorch 中 `torch.nn.utils.weight_norm` 的弃用情况 在 PyTorch 的开发历程中,某些功能可能会被标记为过时并最终移除。关于 `torch.nn.utils.weight_norm` 的具体弃用版本信息,在官方文档和社区讨论中并未明确指出其完全废弃的时间点[^1]。然而,可以确认的是,自 PyTorch 1.7 版本起,`weight_norm` 功能已被推荐使用更灵活的替代方案——通过 `nn.Parameter` 或者其他模块化设计来实现权重标准化的效果。 #### 替代方案 对于需要实现类似 `weight_norm` 功能的需求,开发者通常会采用以下几种方式: 1. **手动实现权重规范化** 可以通过定义新的参数并将原始权重分解为其大小和方向部分来模拟 `weight_norm` 的行为。例如: ```python import torch import torch.nn as nn class WeightNormLinear(nn.Module): def __init__(self, in_features, out_features): super(WeightNormLinear, self).__init__() self.weight_v = nn.Parameter(torch.randn(out_features, in_features)) self.weight_g = nn.Parameter(torch.ones(out_features)) self.bias = nn.Parameter(torch.zeros(out_features)) def forward(self, x): weight_normalized = self.weight_g.unsqueeze(-1) * (self.weight_v / torch.norm(self.weight_v, dim=-1, keepdim=True)) return torch.matmul(x, weight_normalized.t()) + self.bias ``` 2. **利用 Spectral Normalization** 如果目标是为了控制模型的 Lipschitz 常数,可以考虑使用谱归一化(Spectral Normalization),它可以通过 `torch.nn.utils.spectral_norm` 实现类似的约束效果[^4]。 3. **基于最新 API 进行重构** 自 PyTorch 高级优化器引入以来,许多旧的功能逐渐被淘汰。因此建议重新评估需求,并尝试借助更高层次的设计模式完成相同的目标。 需要注意的是,尽管目前尚未有确切记录表明某个特定版本正式删除了该函数,但在实际项目维护过程中应尽量避免依赖已标注为 deprecated 的特性[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值