神经网络搭建案例

本章通过讲解神经网络搭建案例,演示一个建议的神经网络是如何搭建的

导包

import torch
import torch.nn as nn
from torchsummary import summary # 计算模型参数,查看模型结构

一、搭建神经网络,即:自定义继承:nn.Module

1.代码讲解

1.1 基础结构辨析

class ModelDemo(nn.Module): 定义一个类,这个类继承于nn.Module
nn.Module也是一个类,这里作为父类调用,我们定义的类是建立在这个父类基础之上的
super() 定位当前类的父类;父类 nn.Module 本身有一个初始化函数 init,用来初始化它内部管理参数、网络层的底层结构;因此super().__init__()手动执行一遍父类的初始化流程。

1.2 搭建神经网络与初始化

之后开始搭建神经网络,定义了linear1、linear2、output(这三个都是对象,对象里面有数据,也有方法),并对其进行初始化

1.3 前向传播

x = torch.sigmoid(self.linear1(x)):
self.linear1(x)会进行加权求和;虽然linear1是一个对象,但它继承了执行 nn.Module 父类里的 call 内部逻辑,向这个对象传入参数,就可以执行内部封装好的加权求和公式。
加权求和之后,就会进行sigmoid激活函数,然后继续传入下一个隐藏层

1.4 返回预测值

这个类中的函数会返回最后经过神经网络迭代后的x

2. 代码模块

class ModelDemo(nn.Module):
    # todo: 1.1 在init魔法方法中,完成初始化:父类成员,及 神经网络搭建
    def __init__(self):
        # 1.1 初始化父类成员.(把父类本该自带的基础配置、存储容器、工具功能全部实例化到你的模型对象上;)
        super().__init__()
        # 1.2 搭建神经网络 ——>隐藏层 + 输入层
        # 隐藏层1:输入特征3,输出特征3
        self.linear1 = nn.Linear(3,3)
        # 隐藏层2:输入特征3,输出特征2
        self.linear2 = nn.Linear(3,2)
        # 输出层:输入特征2,输出特征2
        self.output = nn.Linear(2,2)

        # 1.3 对隐藏层进行参数初始化.
        # 隐藏层1
        nn.init.xavier_normal_(self.linear1.weight)
        nn.init.zeros_(self.linear1.bias)

        # 隐藏层2
        nn.init.kaiming_normal_(self.linear2.weight)
        nn.init.zeros_(self.linear2.bias)
    # todo: 1.2 前向传播: 输入层——>隐藏层——>输出层
    def forward(self, x): #这里的forward是固定的,不能随便改
        # 1.1 第一层 隐藏层计算:加权求和 + 激活函数(sigmoid)
        # 分解版写法
        # x = self.linear1(x) # 加权求和,对输入的x执行之前所定义好的nn.Linear(3,3)模型;也就是拿已经建好的网络层,对输入数据做一次线性变换;
        # x= torch.sigmoid(x) # 激活函数

        # 合并版写法
        x = torch.sigmoid(self.linear1(x))
        # 1.2 第2层:隐藏层计算:加权求和 + 激活函数(ReLu)
        x = torch.relu(self.linear2(x))

        # 1.3 第3层 输出层计算:加权求和 + 激活函数(Softmax)
        # dim = -1,表示按行计算,一条样本一条样本的处理
        x = torch.softmax(self.output(x), dim=-1)

        # 1.4 返回预测值
        return x

二、模型训练

1.代码详解

1.1 创建模型对象

我们之前定义了一个类ModelDemo,这是类,相当于一张设计图纸、一个模板,只有结构规则,没有具体数据,不能直接干活。
ModelDemo():对着这张图纸,生产一个实实在在的实体。
my_model =:把生产出来的这个实体,起名叫 my_model。
最终结论:my_model = 实例 / 对象。

1.2 调用神经网络模型 ——>进行模型训练

output = my_model(data):my_model是用类创造出来的一个对象,这个对象继承了父类nn.Module,直接向对象传入参数会自动执行forward方法(nn.Module定义好的);但如果是自己写的,就需要先用.来指定方法传入参数

1.3 计算和查看模型参数

torchsummary.summary 会模拟一次前向传播,顺着 my_model(data) 这条链路走一遍网络,逐层记录每一层:输入输出形状、参数数量、可训练参数量,最后打印整张网络结构总览。

2.代码模块

def train():
    # 1.创建模型对象.
    my_model = ModelDemo()
    # print(f'my_model:{my_model}')

    # 2. 创建数据集样本,随机生成
    data = torch.randn(size=(5,3))
    print(f'data: {data},shape: {data.shape},data.requires_grad:{data.requires_grad}') # 默认False

    # 3. 调用神经网络模型 ——>进行模型训练
    output = my_model(data) # 底层自动调用了 forward方法() 前向传播
    print(f'output:{output}')
    print(f'output.shape:{output.shape},output.requires_grad:{output.requires_grad}')

    # 4. 计算和查看模型参数
    print('========计算模型参数=========')
    # 参1:(神经网络模型对象),参2:输入数据维度(5行3列)
    summary(my_model, input_size=(5,3))

    print('========查看模型参数=========')
    for name,param in my_model.named_parameters():
        print(f'name:{name},param:{param}')
        print('\n')

三、测试

if __name__ == '__main__':
    train()
posted @ 2026-07-12 12:31  王新文  阅读(5)  评论(0)    收藏  举报