动手学深度学习(Pytorch版)代码实践 -卷积神经网络-14模型构造

14模型构造

python 复制代码
import torch
from torch import nn
from torch.nn import functional as F

#通过实例化nn.Sequential来构建我们的模型, 层的执行顺序是作为参数传递的
net1 = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256,10))
"""
nn.Sequential定义了一种特殊的Module, 即在PyTorch中表示一个块的类, 
它维护了一个由Module组成的有序列表。 
注意,两个全连接层都是Linear类的实例, Linear类本身就是Module的子类。 
另外,到目前为止,我们一直在通过net(X)调用我们的模型来获得模型的输出。 
这实际上是net.__call__(X)的简写。
 这个前向传播函数非常简单: 
 它将列表中的每个块连接在一起,将每个块的输出作为下一个块的输入。
"""
X1 = torch.rand(2,20)
print(net1(X1))

#自定义块
class MLP(nn.Module):
    # 用模型参数声明层。这里,我们声明两个全连接的层
    def __init__(self):
        # 调用MLP的父类Module的构造函数来执行必要的初始化。
        # 这样,在类实例化时也可以指定其他函数参数,例如模型参数params
        super().__init__()
        self.hidden = nn.Linear(20, 256) #隐藏层
        self.out = nn.Linear(256, 10) #输出层
    
    # 定义模型的前向传播,即如何根据输入X返回所需的模型输出
    def forward(self, X):
        # 注意,这里我们使用ReLU的函数版本,其在nn.functional模块中定义。
        return self.out(F.relu(self.hidden(X)))
X2 = torch.rand(2,20)  
net2 = MLP()
print(net2(X2))

#顺序块
class MySequential(nn.Module):
    def __init__(self, *args):
        super().__init__()
        # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
        # 同时列出数据和数据下标
        for idx, module in enumerate(args):
            # 这里,module是Module子类的一个实例。我们把它保存在'Module'类的成员
            # 变量_modules中。_module的类型是OrderedDict
            self._modules[str(idx)] = module
            # _modules的主要优点是:
            # 在模块的参数初始化过程中, 系统知道在_modules字典中查找需要初始化参数的子块。
            # _modules 是 PyTorch 中 nn.Module 类的一个属性,用于自动管理和存储模型的子模块。
    def forward(self, X):
        # OrderedDict保证了按照成员添加的顺序遍历它们
        for block in self._modules.values():
            X = block(X)
        return X

X3 = torch.rand(2,20)
#MySequential的用法与之前为Sequential类编写的代码相同
net3 = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
print(net3(X3))


#在前向传播函数中执行代码
class FixedHiddenMLP(nn.Module):
    def __init__(self):
        super().__init__()
        # 不计算梯度的随机权重参数。因此其在训练期间保持不变
        self.rand_weight = torch.rand((20,20), requires_grad=False)
        self.linear = nn.Linear(20, 20)

    def forward(self, X):
        X = self.linear(X)
        # 使用创建的常量参数以及relu和mm函数
        X = F.relu(torch.mm(X, self.rand_weight) + 1)
        # 复用全连接层。这相当于两个全连接层共享参数
        X = self.linear(X)
        # 控制流
        while X.abs().sum() > 1:
            X = X / 2
        return X.sum()
    
X4 = torch.rand(2,20)
net4 = FixedHiddenMLP()
print(net4(X4))

#混合搭配各种组合块
class NestMLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(nn.Linear(20, 64), nn.ReLU(),
                                 nn.Linear(64, 32), nn.ReLU())
        self.linear = nn.Linear(32, 16)
    
    def forward(self, X):
        return self.linear(self.net(X))

X5 = torch.rand(2,20)
net5 = nn.Sequential(NestMLP(), nn.Linear(16, 20), FixedHiddenMLP())
print(net5(X5))

"""
tensor([[ 0.0843, -0.1867,  0.0457,  0.1082, -0.0236, -0.1245, -0.0184,  0.0233,
          0.1765, -0.1390],
        [ 0.0129, -0.1441,  0.1156, -0.0327,  0.0044, -0.0510,  0.0715, -0.0162,        
          0.0137, -0.1148]], grad_fn=<AddmmBackward>)
tensor([[-0.1180,  0.0799, -0.0260,  0.0529,  0.0055, -0.1481,  0.1311, -0.1334,        
          0.1224,  0.0713],
        [-0.0610,  0.0789, -0.0321,  0.0154,  0.0246, -0.1857,  0.0652, -0.0461,        
          0.1029,  0.1205]], grad_fn=<AddmmBackward>)
tensor([[-0.0571, -0.1119,  0.0851,  0.1362, -0.0945,  0.0078,  0.2157, -0.1273,        
         -0.0017,  0.1981],
        [-0.0049, -0.0103,  0.0114, -0.0101, -0.1034,  0.0204,  0.1531,  0.0481,        
          0.1361, -0.0403]], grad_fn=<AddmmBackward>)
tensor(0.3121, grad_fn=<SumBackward0>)
tensor(0.1369, grad_fn=<SumBackward0>)
"""
相关推荐
麻瓜生活睁不开眼3 小时前
Android16修改全局桌面视图边框四直角显示为弧边圆角
android·java·深度学习
workflower3 小时前
装备企业的 AI 路线图
人工智能·深度学习·机器学习·设计模式·机器人
西柚研究生1234567 小时前
创建自己的数据集(GoogLeNet)
深度学习·神经网络·cnn
逻辑君10 小时前
基于 PPO 的双足机器人行走控制
人工智能·深度学习·机器人
美狐美颜SDK开放平台12 小时前
直播APP开发,美颜SDK和相机SDK有什么区别?
android·深度学习·数码相机·ios·直播美颜sdk·视频美颜sdk
逻辑君13 小时前
基于 A2C 算法的双足机器人行走控制
人工智能·深度学习·算法·机器学习·机器人
罗西的思考14 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 — (14)— Teacher
人工智能·笔记·深度学习·算法·机器学习
薛定e的猫咪14 小时前
如何高效构建一个RAG知识库 dify实例与常见问题
人工智能·深度学习
手写码匠15 小时前
华为云Flexus+DeepSeek征文|DeepSeek+RAG知识库实战:基于Flexus X实例与Dify构建企业级智能问答系统
人工智能·深度学习·算法·aigc
bittersuite15 小时前
LeNet,AlexNet
人工智能·深度学习·机器学习