全连接神经网络
全连接神经网络
- 3.3.1 特点
- 3.3.2 计算步骤
- 3.3.3 基本组件认知
- 激活函数组件
- 损失函数组件
- 优化器
- 3.3.3 创建全连接神经网络
前馈神经网络(Feedforward Neural Network,FNN)是一种最基本的神经网络结构,其特点是信息从输入层经过隐藏层单向传递到输出层,没有反馈或循环连接。
全连接神经网络(Fully Connected Neural Network,FCNN)是前馈神经网络的一种,每一层的神经元与上一层的所有神经元全连接,常用于图像分类、文本分类等任务。
如上图,网络中每个神经元:
z1=x1∗w1+x2∗w2+b1z2=x1∗w1+x2∗w2+b2z3=x1∗w1+x2∗w2+b3z_1 = x_1*w_1 + x_2*w_2+b_1 \\ z_2 = x_1*w_1 + x_2*w_2+b_2 \\ z_3 = x_1*w_1 + x_2*w_2+b_3 z1=x1∗w1+x2∗w2+b1z2=x1∗w1+x2∗w2+b2z3=x1∗w1+x2∗w2+b3
说明:三个等式中的w1和w2在这里只是为了方便表示对应x1和x2的权重,实际三个等式中的w值是不同的。
向量x为:[x1,x2][x_1,x_2][x1,x2]
向量w:(w1,w2w1,w2w1,w2)\begin{pmatrix}w_1,w_2\\w_1,w_2\\w_1,w_2 \end{pmatrix}w1,w2w1,w2w1,w2,其形状为(3,2),3是神经元节点个数,2是向量x的个数
向量z:[z1,z2,z3][z_1,z_2,z_3][z1,z2,z3]
向量b:[b1,b2,b3][b_1,b_2,b_3][b1,b2,b3]
所以用向量表示为:
z=(z1,z2,z3)=(x1,x2)(w1,w1,w1w2,w2,w2)+(b1,b2,b3)=(x1,x2)(w1,w2w1,w2w1,w2)T+(b1,b2,b3)=xwT+bz = \begin{pmatrix}z_1,z_2,z_3 \end{pmatrix}=\begin{pmatrix}x_1,x_2 \end{pmatrix}\begin{pmatrix}w_1,w_1,w_1\\w_2,w_2,w_2\end{pmatrix}+\begin{pmatrix}b_1,b_2,b_3 \end{pmatrix}=\begin{pmatrix}x_1,x_2 \end{pmatrix}\begin{pmatrix}w_1,w_2\\w_1,w_2\\w_1,w_2 \end{pmatrix}^T + \begin{pmatrix}b_1,b_2,b_3 \end{pmatrix}=xw^T+b z=(z1,z2,z3)=(x1,x2)(w1,w1,w1w2,w2,w2)+(b1,b2,b3)=(x1,x2)w1,w2w1,w2w1,w2T+(b1,b2,b3)=xwT+b
- x是输入数据,形状为 (batch_size, in_features)。
- W是权重矩阵,形状为 (out_features, in_features)。
- b是偏置项,形状为 (out_features,)。
- z是输出数据,形状为 (batch_size, out_features)。、
batch_size:数据或者样本的数量,即数据的条数
in_features:一条数据中x的数量(x的特征数量)
out_features:一个y的特征数量
3.3.1 特点
- 全连接层: 层与层之间的每个神经元都与前一层的所有神经元相连。
- 权重数量: 由于全连接的特点,权重数量较大,容易导致计算量大、模型复杂度高。
- 学习能力: 能够学习输入数据的全局特征,但对于高维数据却不擅长捕捉局部特征(如图像就需要CNN)。
3.3.2 计算步骤
- 数据传递: 输入数据经过每一层的计算,逐层传递到输出层。
- 激活函数: 每一层的输出通过激活函数处理。
- 损失计算: 在输出层计算预测值与真实值之间的差距,即损失函数值。
- 反向传播(Back Propagation): 通过反向传播算法计算损失函数对每个权重的梯度,并更新权重以最小化损失。
3.3.3 基本组件认知
先初步认知,他们用法基本一样的,后续在学习深度神经网络和卷积神经网络的过程中会很自然的学到更多组件!
官方文档: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,则不会学习偏置项。
线性层使用代码:
'''线性层的使用'''x=torch.tenor([1,2,3,4,5],dtype=torch.float).view(-1,1)y=torch.tensor([3,5,7,9,11], dtype=torch.float).view(-1,1)model=nn.Linear(x.size(1),y.size(1))
- 使用nn.Linear(in_features,out_features)
- 注意Linear的参数与x,y的特征值有关,x,y维度要进行处理不能是一维
如果模型中线性层按顺序叠加,也可以使用nn.Sequential构建模型。nn.Sequential
是一个顺序容器,内置了自动的前向传播逻辑,它会自动将输入数据依次传递给其中的每一层,并执行前向传播,不需要显式定义 forward()
方法。
import torch
from torch import nninput_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.均方误差损失(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()
分类任务的损失函数:
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()
:参数更新;是优化器的核心方法,用于根据计算得到的梯度更新模型参数。优化器会根据梯度和学习率等参数,调整模型的权重和偏置。
3.3.3 创建全连接神经网络
创建一个最基本的全连接神经网络(也称为多层感知机,MLP)通常需要以下:步骤和方法