nn.Parameter和nn.Linear、nn.ModuleList和nn.Sequential区别

self.weight = nn.Parameter(torch.FloatTensor(out_features, in_features)) 和self.weight = nn.Linear(in_features, out_features) 有什么区别?

  1. 初始化方式不一样,nn.Parameter初始化方式需要指定,nn.Linear默认是Kaiming初始化
  2. nn.Linear默认有个bias

nn.ModuleList和nn.Sequential区别

nn.ModuleList不会自动连接子模块,需要在forward方法中显式地调用每个模块的前向传播。但是nn.Sequential是一种便捷的方式,用于定义按顺序执行的神经网络层

nn.ModuleList示例

import torch
import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.layers = nn.ModuleList([nn.Linear(10, 10) for _ in range(3)])
    
    def forward(self, x):
        for layer in self.layers:
            x = layer(x)
        return x

# 实例化模型并进行前向传播
model = MyModel()
input_tensor = torch.randn(5, 10)
output = model(input_tensor)
print(output)
  1. nn.Sequential通过有序的子模块
import torch
import torch.nn as nn

# 定义模型
model = nn.Sequential(
    nn.Linear(10, 20),
    nn.ReLU(),
    nn.Linear(20, 10)
)

# 进行前向传播
input_tensor = torch.randn(5, 10)
output = model(input_tensor)
print(output)
  1. nn.Sequential通过字典的方式
# 使用OrderedDict
from collections import OrderedDict

model = nn.Sequential(OrderedDict([
    ('fc1', nn.Linear(10, 20)),
    ('relu', nn.ReLU()),
    ('fc2', nn.Linear(20, 10))
]))

# 进行前向传播
input_tensor = torch.randn(5, 10)
output = model(input_tensor)
print(output)
在 PyTorch 中,`nn.ModuleList` `nn.Sequential` 都不会自动地进行参数初始化。但是,如果你在 `nn.Sequential` 中使用了 PyTorch 中的标准层,那么这些层的参数会被自动初始化。例如,如果你在 `nn.Sequential` 中加入了一个 `nn.Linear` 层,那么这个层的权重偏置就会被自动初始化。 如果你使用了自定义的层或者模块,那么你需要自己手动初始化参数。通常情况下,可以在层或者模块的构造函数中进行参数初始化。PyTorch 中常用的参数初始化方法有: - `torch.nn.init.xavier_uniform_(tensor)`:使用 Xavier 初始化方法对权重进行初始化。 - `torch.nn.init.kaiming_uniform_(tensor)`:使用 He 初始化方法对权重进行初始化。 - `torch.nn.init.constant_(tensor, val)`:使用常数值对权重进行初始化。 - `torch.nn.init.zeros_(tensor)`:使用零值对权重进行初始化。 这些方法都可以直接对权重张量进行操作,例如: ```python import torch.nn as nn class MyLayer(nn.Module): def __init__(self, in_dim, out_dim): super(MyLayer, self).__init__() self.weight = nn.Parameter(torch.Tensor(out_dim, in_dim)) self.bias = nn.Parameter(torch.Tensor(out_dim)) nn.init.xavier_uniform_(self.weight) nn.init.zeros_(self.bias) def forward(self, x): return torch.matmul(x, self.weight.t()) + self.bias ``` 这个自定义的层中,我们手动创建了权重偏置张量,并且使用 Xavier 零值初始化方法进行了初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值