本篇文章致于搭建一个框架最为简单的基础神经网络模块 ,将通过注释与代码对整体内容做详细的讲解 ,只要有一点基础 ,就都能够听懂

首先讲解一下搭建神经网络的步骤: 具体步骤在我上一篇文章 [深度学习篇学习回顾与心得2]https://blog.csdn.net/2402_88373328/article/details/158977079?fromshare=blogdetail&sharetype=blogdetail&sharerId=158977079&sharerefer=PC&sharesource=2402_88373328&sharefrom=from_link

搭建神经网络的步骤:

1- 定义一个类 ,继承自 nn.Module

2-实现两个方法:

        __init__ 方法

                - 初始化父类

                - 设置属性值

                - 定义神经网络结构: 隐藏层有几层 ,输出的的结构是怎样的等等

                - 参数初始化 w 和 b 进行初始化

        forward前向传播方法

                将数据送入到搭建好的网络模型中 ,对模型进行训练

接下来是代码部分

import torch                # 用于访问 PyTorch 框架的核心功能
import torch.nn as nn       # 专门用于构建神经网络的组件 ,torch.nn是torch模块的子组件
# pip install torchsummary  # 查看神经网络模型各层参数信息的工具
from torchsummary import summary

class MyModel(nn.Module):
    def __init__(self):
        # a、初始化父类:也就是调用父类中的初始化方法
        super().__init__()

        # b、设置属性值/参数值【目前不需要】

        # c、定义神经网络结构:输入层不需要定义,要定义隐藏层有几层、输出层是怎样的等
        # 1.1- 隐藏层
        # 第一层隐藏层
        """
            参数解释:
                in_features:输入的特征个数。也就是上游神经元的个数
                out_features:输出的特征个数。也就是本层神经元的个数
        nn.linear() 就表示线性求和函数
        """
        self.linear1 = nn.Linear(in_features=3,out_features=3)

        # 第二层隐藏层
        self.linear2 = nn.Linear(in_features=3,out_features=2)

        # 1.2- 输出层
        self.output = nn.Linear(in_features=2,out_features=2)

        # d、参数初始化:w、b如何进行初始化
        # 隐藏层1的初始化
        nn.init.xavier_normal_(self.linear1.weight)  # w初始化
        nn.init.zeros_(self.linear1.bias)   # b初始化

        # 隐藏层2的初始化
        nn.init.kaiming_normal_(self.linear2.weight)  # w初始化
        nn.init.zeros_(self.linear2.bias)  # b初始化

    def forward(self,data):
        """
        前向传播。对模型进行训练,也就是得到预测结果
        :param data: 前向传播送入到网络结构中的样本数据。类型是张量tensor
        :return:
        """

        # 1- 数据经过第一层隐藏层
        # 1.1- 分开版
        # 先进行线性求和
        # linear1_result = self.linear1(data)
        # 再将线性求和结果给到激活函数,得到激活值
        # data = torch.sigmoid(linear1_result)

        # 1.2- 合并版【推荐】
        data = torch.sigmoid(self.linear1(data))

        # 2- 数据经过第二层隐藏层
        data = torch.relu(self.linear2(data))

        # 3- 数据经过输出层得到输出结果
        """
        数据并不是一次只处理一条数据,而是批量传入,这就导致了多维数据,
        而softmax中dim的默认参数为None,这会使得softmax()会不分维度
        将所有的数据全部展开计算概率值,这样的结果往往是错误的,
        我们需要的是softmax对每组数据中的每条数据进行概率值计算,
        这就是写上dim=-1的理由
            dim=-1:不管列表嵌套多少层,全部只对最里层(最后一个维度)的数据(最后一个维度代表的即单条数据的特征数据)进行统计
        """
        return torch.softmax(self.output(data),dim=-1)

# 测试网络模型
if __name__ == '__main__':
    # 1- 准备训练数据:目前的需求中,每条样本必须有3个特征
    # 创建服从标准正态分布(均值为 0,方差为 1)的随机张量
    # batch size(数据数量) ,input features(每条数据的特征数)
    # 10:多少条样本;3:每条样本多少个特征
    data = torch.randn(10, 3)

    # 2- 创建神经网络模型对象
    my_model = MyModel()

    # 3- 模型训练:将数据输入到神经网络中,进行前向传播
    # 内部自动调用forward方法
    output = my_model(data)
    print(f"预测结果是:{output}")
    print(f"预测结果形状:{output.shape}")

    print("-" * 30)

    # 4- 查看神经网络的概要信息【理解】
    """
        summary(参数1,参数2,参数3):查看神经网络各层参数的信息
            参数1:神经网络算法实例对象
            参数2:输入的特征个数,类型必须是元组
            参数3:输入的每个批次样本条数,任意
    """
    summary(my_model, (3,), 2)

对于代码中仍然不理解的地方可以通过询问AI大模型相关问题进行进一步的深入 ,后续还会有具体的代码实战代码理解 ,对于想学习深度学习的新同学们,这段简单代码是必须要掌握的

                

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐