nn.Module详解

本文介绍了PyTorch中nn.Module类的关键功能,包括查看模型结构、模型参数,以及apply函数在初始化权重中的应用。还详细讨论了state_dict用于存储和加载模型参数,以及各种参数和子模块的管理方法。

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

#最有用的两个功能
#1、查看模型结构:
print(mdoel)

#2、查看结构的模型参数
print(model.named_parameters())
print(model.subModel.conv1[0].weight.size)

# 详解nn.Module
import torch.nn as nn
import torch.nn.functional as F
import torch
from torchsummary import summary

class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.linear1 = nn.Linear(20,40)
        self.conv1 = nn.Conv2d(1,20,5)
        self.conv2 = nn.Conv2d(20,20,5)


    def forward(self,x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))
    
# add_module:往当前模块中添加子模块,所以主模块可以通过点号访问子模块,最后会加在self._modules[name] = module

# apply:可以访问所有子模块,通过.children()方法,对所有子模块的参数进行初始化
# eg:@torch.n-_grad()
# def init_weights(m):
#     print(m)
#     if type(m) == nn.Linear:
#         m.weight.fill_(1.0)

#         print(m.weight)
# net = nn.Sequential(nn.Linear(2,2),nn.Linear(2,2))
# # 遍历net中所有的子模块,将子模块传入该函数,然后对子模块的参数赋值
# net.apply(init_weights)

# buffers
# register_parameter:当前模块中添加参数,最后会self._parameters[name] = param

# Parameter:作为模块的参数,不要写tensor类型

# children:返回所有的子模块

# cpu/cuda:将所有的模型和参数都搬到相应设备上.通过apply,将所有的模块参数传入

# eval:将模型设置为评估模式,会遍历所有子模块设为false。影响DropOut,BatchNorm上有区别

# get_parameter:根据字符串得到一个模型里面的参数,先解析字符串得到module_path

# get_submodule :根据字符串得到子模块

# load_state_dict:加载模型的所有参数和buffer
# state_dict:每个模块都有参数和buffer变量
# _save_to_state_dict:保存当前模块的参数和buffer
# _load_from_state_dict:读取当前模块参数和buffer

# named_parameters():模型中所有的参数和值
# for name, param in self.named_parameters():
#     print(name,param)

# requies_grad:参数是否需要更新

# type:将所有的模型参数转化数据类型

# to_empty 

# to(torch.double):所有的浮点数据类型都转换成float64

# zero_grad:清除梯度

# __repr__:魔法方法 str(model)

# __dir__:dir(model)当前模块的名称和参数


if __name__=='__main__':
    model = Model()
    model.eval()
    print(summary(model,(1,28,28)))
    # print(type(A.children()))
    for name, param in model.named_parameters():
        print(name,param.size())

    # 打印所有子模块名字和特征参数,返回的是有序字典
    model._modules()
    # 返回自身和子模块,跟_modules()相比,多了一个自身模块
    for p in model.named_modules():
        print(p)
    # 打印'linear1'层的特征参数
    model._modules['linear1']
    # 打印 linear1里面的weight参数
    model._modules['linear1'].weight
    # 打印数据类型
    model._modules['linear1'].weight.dtype

    # 返回空字典,当前模块的参数,而不是遍历子模块里面的参数
    model._parameters
    # 包含当前模块参数和子模块的参数
    for p in model.parameters:
        print(p)
    # 字典,包含参数名字和参数值
    for name, param in model.named_parameters():
        print(name,param.size())
    model._buffers

    # 子模块的名称和子模块本身,与_modules只是返回的格式不一样,其他无区别
    for p in model.named_children():
        print(p)



    # 所有的参数名字和参数
    model.state_dict()


    # 只能保存模型的参数,不能保存优化器参数
    torch.save(model.state_dict(),'model_weight.pth')
    # 加载模型的参数
    model.load_state_dict(torch.load('model_weights.pth'))

`nn.Module` 是 PyTorch 中用于构建神经网络模型的基类。所有自定义的神经网络模型都应该继承自 `nn.Module` 类。`nn.Module` 类提供了很多有用的方法,使得神经网络模型的构建和训练变得更加简单。 `nn.Module` 类的常用方法: - `__init__(self)`: 初始化函数,用于定义模型的结构和参数; - `forward(self, input)`: 前向传播函数,用于定义模型的计算过程; - `parameters(self)`: 返回模型中所有需要训练的参数(权重和偏置); - `named_parameters(self)`: 返回模型中所有需要训练的参数及其名称; - `zero_grad(self)`: 将模型中所有参数的梯度设置为0; - `to(self, device)`: 将模型移动到指定的设备上(如:CPU或GPU); - `train(self, mode=True)`: 设置模型为训练模式,当模型中包含一些会改变的操作时(如:Dropout),需要调用该方法; - `eval(self)`: 设置模型为评估模式,当模型中包含一些不会改变的操作时(如:BatchNorm),需要调用该方法。 下面是一个简单的例子,展示了如何使用 `nn.Module` 类来构建一个神经网络模型: ```python import torch.nn as nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) def forward(self, x): x = nn.functional.relu(nn.functional.max_pool2d(self.conv1(x), 2)) x = nn.functional.relu(nn.functional.max_pool2d(self.conv2(x), 2)) x = x.view(-1, 320) x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return nn.functional.log_softmax(x, dim=1) ``` 在这个例子中,我们定义了一个名为 `Net` 的模型,继承自 `nn.Module` 类。在 `__init__` 方法中,我们定义了模型的结构和参数,包括两个卷积层和两个全连接层。在 `forward` 方法中,我们定义了模型的计算过程,包括卷积、池化、全连接和激活操作。我们还可以通过调用其他 `nn.Module` 类中的方法,如 `nn.functional.relu` 和 `nn.functional.log_softmax` 等,来方便地构建模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值