【pytorch(06)】全连接神经网络:基本组件认知,线性层、激活函数、损失函数、优化器

发布于:2025-08-10 ⋅ 阅读:(19) ⋅ 点赞:(0)

【pytorch(01)】CUDA、cuDNN、pytorch安装,神奇魔法解决网络问题

【pytorch(02)】Tensor(张量)概述、如何创建、常见属性,切换设备

【pytorch(03)】Tensor(张量)数据转换、常见操作(元素值运算、阿达玛积、相乘、形状操作)

【pytorch(04)】自动微分:基础概念,梯度计算,梯度上下文控制

【pytorch(05)】感知神经网络,构造人工神经元,深入神经网络(了解结构,如何构建),全连接神经网络

全连接神经网络:基本组件认知

先初步认知,他们用法基本一样的,后续在学习深度神经网络和卷积神经网络的过程中会很自然的学到更多组件!

官方文档:https://pytorch.org/docs/stable/nn.html

线性层组件

nn.Linear是 PyTorch 中的一个非常重要的模块,用于实现全连接层(也称为线性层)。它是神经网络中常用的一种层类型,主要用于将输入数据通过线性变换映射到输出空间。

torch.nn.Linear(in_features, out_features, bias=True)

参数说明:

in_features:

  • 输入特征的数量(即输入数据的维度)。
  • 例如,如果输入是一个长度为 100 的向量,则 in_features=100。

out_features:

  • 输出特征的数量(即输出数据的维度)。
  • 例如,如果希望输出是一个长度为 50 的向量,则 out_features=50。

bias:

  • 是否使用偏置项(默认值为 True)。
  • 如果设置为 False,则不会学习偏置项。

示例:构建3层全连接神经网络:在__init__方法中定义网络结构,在forward定义前向传播

import torch
from torch import nn
# 定义全连接神经网络模型
class MyFcnn(nn.Module):
    def __init__(self, input_size,out_size):
        # 父类初始化
        super(MyFcnn, self).__init__()
        # 定义线性层1
        self.fc1 = nn.Linear(input_size, 64)

        # 定义线性层2,输入要和第一层的输出一致
        self.fc2 = nn.Linear(64, 32)

        # 定义线性层3,输入要和第二层的输出一致
        self.fc3 = nn.Linear(32, out_size)

    def forward(self, x):
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.fc3(x)
        return x

input_size = 32
out_size = 1
model = MyFcnn(input_size,out_size)
print(model)

如果模型中线性层按顺序叠加,也可以使用nn.Sequential构建模型。nn.Sequential 是一个顺序容器,内置了自动的前向传播逻辑,它会自动将输入数据依次传递给其中的每一层,并执行前向传播,不需要显式定义 forward() 方法。

import torch
from torch import nn

input_size = 32
# 定义全连接神经网络模型
model = nn.Sequential(
    nn.Linear(input_size, 64),
    nn.Linear(64, 32),
    nn.Linear(32, 1)
)
print(model)

激活函数组件

激活函数的作用是在隐藏层引入非线性,使得神经网络能够学习和表示复杂的函数关系,使网络具备非线性能力,增强其表达能力。

常见激活函数:

sigmoid函数:

import torch.nn.functional as F
sigmoid = F.sigmoid()

tanh函数:

tanh = F.tanh()

ReLU函数:

import torch.nn as nn
relu = nn.ReLU()

LeakyReLU函数:

leaky_relu = nn.LeakyReLU(negative_slope=0.01)

softmax函数:

softmax = F.softmax

损失函数组件

损失函数的主要作用是量化模型预测值(y^)与真实值(y)之间的差异。通常,损失函数的值越小,表示模型的预测越接近真实值。训练过程中,通过优化算法(如梯度下降)最小化损失函数,从而调整模型的参数。

PyTorch已内置多种损失函数,在构建神经网络时随用随取!

文档:https://pytorch.org/docs/stable/nn.html#loss-functions

根据任务类型(如回归、分类等),损失函数可以分为以下几类:

1.回归任务的损失函数:

1.均方误差损失(MSE Loss)

  • 函数: torch.nn.MSELoss
import torch.nn as nn
loss_fn = nn.MSELoss()

2.L1 损失(L1 Loss)

也叫做MAE(Mean Absolute Error,平均绝对误差)

  • 函数: torch.nn.L1Loss
import torch.nn as nn
loss_fn = nn.L1Loss()

2.分类任务的损失函数:

1.交叉熵损失(Cross-Entropy Loss)

  • 函数: torch.nn.CrossEntropyLoss
cross_entropy_loss = nn.CrossEntropyLoss()
  • 参数:reduction:mean-平均值,sum-总和

  • 适用场景: 用于多分类任务。

2.二元交叉熵损失(Binary Cross-Entropy Loss)

  • 函数: torch.nn.BCELoss 或 torch.nn.BCEWithLogitsLoss
bce_loss = nn.BCELoss()
bce_with_logits_loss = nn.BCEWithLogitsLoss()
  • 适用场景: 用于二分类任务。

  • 特点: BCEWithLogitsLoss 更稳定,因为它结合了 Sigmoid 激活函数和 BCE 损失。

  • 注意:使用 nn.BCELoss 时,需要确保预测值经过 sigmoid 函数处理。如果预测值是 logits(即未经 sigmoid 处理的预测值),可以使用 nn.BCEWithLogitsLoss,它内部会自动应用 sigmoid 函数。

优化器

官方文档:https://pytorch.org/docs/stable/optim.html

在PyTorch中,优化器(Optimizer)是用于更新模型参数以最小化损失函数的核心工具。

PyTorch 在 torch.optim 模块中提供了多种优化器,常用的包括:

  • SGD(随机梯度下降)
  • Adagrad(自适应梯度)
  • RMSprop(均方根传播)
  • Adam(自适应矩估计)

核心方法有:

zero_grad():清空模型参数的梯度(将梯度置零)。必须在loss.backward()之前调用zero_grad(),避免梯度累积。

step():参数更新;是优化器的核心方法,用于根据计算得到的梯度更新模型参数。优化器会根据梯度和学习率等参数,调整模型的权重和偏置。

以SGD(随机梯度下降)优化器为例:

import torch
import torch.nn as nn
import torch.optim as optim

# 优化方法SGD的学习
def test003():
    model = nn.Linear(20, 60)
    criterion = nn.MSELoss()
    # 优化器:更新模型参数
    optimizer = optim.SGD(model.parameters(), lr=0.01)
    input = torch.randn(128, 20)
    output = model(input)
    # 计算损失及反向传播
    loss = criterion(output, torch.randn(128, 60))
    # 梯度清零
    optimizer.zero_grad()
    # 反向传播
    loss.backward()
    # 更新模型参数
    optimizer.step()
    
    print(loss.item())


if __name__ == "__main__":
    test003()
  • optim.SGD():优化器方法;是 PyTorch 提供的随机梯度下降(Stochastic Gradient Descent, SGD)优化器。
  • model.parameters():模型参数获取;是一个生成器,用于获取模型中所有可训练的参数(权重和偏置)。

注意:这里只是组件认识和用法演示,没有具体的模型训练功能实现