神经元(Neuron)
神经元是神经网络的基本单元,它接收输入信号,通过加权求和后与偏置(bias)相加,然后通过激活函数处理以产生输出。
神经元的权重和偏置是网络学习过程中需要调整的参数。
输入和输出:
- 输入(Input):输入是网络的起始点,可以是特征数据,如图像的像素值或文本的词向量。
- 输出(Output):输出是网络的终点,表示模型的预测结果,如分类任务中的类别标签。
神经元接收多个输入(例如x1, x2, ..., xn),如果输入的加权和大于激活阈值(activation potential),则产生二进制输出。

神经元的输出可以看作是输入的加权和加上偏置(bias),神经元的数学表示(这里,wj 是权重,xj 是输入,而 Bias 是偏置项。):

层(Layer)
输入层和输出层之间的层被称为隐藏层,层与层之间的连接密度和类型构成了网络的配置。
神经网络由多个层组成,包括:
- 输入层(Input Layer):接收原始输入数据。
- 隐藏层(Hidden Layer):对输入数据进行处理,可以有多个隐藏层。
- 输出层(Output Layer):产生最终的输出结果。
![image]()
模型构建流程
PyTorch模型构建分为四个核⼼步骤:
核⼼API介绍
nn模块:
PyTorch的nn模块是PyTorch框架中一个非常重要的模块,它提供了多种神经网络层和一些常用的初始化方法。
nn.Module 类:
nn.Module是所有自定义神经网络模型的基类。用户通常会从这个类派生自己的模型类,并在其中定义网络层结构以及前向传播函数(forward pass)。
预定义层(Modules):
- 包括各种类型的层组件,例如卷积层(
nn.Conv1d,nn.Conv2d,nn.Conv3d)、全连接层(nn.Linear)、激活函数(nn.ReLU,nn.Sigmoid,nn.Tanh)等。
Linear() :
通常用于设置网络中的全连接层。入参有两个:第一个为输入样本大小,第二个为,输出样本大小。
Linear.weight.data用于访问线性层的权重参数张量,支持直接读取或修改权重值。
权重修改示例
- 直接赋值:
net.layer1.weight.data = torch.Tensor(np.random.normal(size=(1,2),scale=0.01,loc=0))可覆盖权重值 。 np.random.normal()函数用于生成服从正态分布的随机数,用来初始化神经网络的权重参数。具体参数作用如下:
-
size=(1, 2):指定输出张量的形状,这里生成一个1行2列的矩阵6 -
scale=0.01:设置正态分布的标准差,控制随机数的分散程度3 -
loc=0:设置正态分布的均值,决定随机数的中心位置3
这样生成的权重矩阵会以0为中心,数值在±0.01范围内波动,是深度学习常用的权重初始化方法之一,有助于模型训练的稳定性。
-
- 初始化方法:支持Kaiming初始化(
torch.nn.init.kaiming_normal_)或常数初始化(torch.nn.init.constant_) 。
注意事项
- 权重需与输入维度匹配,例如
torch.nn.Linear(2,1)的权重形状为(1,2)。 - 修改权重后需确保梯度计算正常,避免影响后续训练 。
容器类:
nn.Sequential:允许将多个层按顺序组合起来,形成简单的线性堆叠网络。nn.ModuleList和nn.ModuleDict:可以动态地存储和访问子模块,支持可变长度或命名的模块集合。
损失函数(Loss Functions):
torch.nn包含了一系列用于衡量模型预测与真实标签之间差异的损失函数,例如均方误差损失(nn.MSELoss)、交叉熵损失(nn.CrossEntropyLoss)等。
实用函数接口(Functional Interface):
nn.functional(通常简写为F),包含了许多可以直接作用于张量上的函数,它们实现了与层对象相同的功能,但不具有参数保存和更新的能力。例如,可以使用F.relu()直接进行 ReLU 操作,或者F.conv2d()进行卷积操作。
初始化方法:
torch.nn.init提供了一些常用的权重初始化策略,比如 Xavier 初始化 (nn.init.xavier_uniform_()) 和 Kaiming 初始化 (nn.init.kaiming_uniform_()),这些对于成功训练神经网络至关重要。
import torch import torch.nn as nn import torch.optim as optim# 定义神经网络 class SimpleNN(nn.Module):
'''
- fc1 的输出维度是 128,这个张量直接作为 fc2 的输入,因此需要让 fc2 的 in_features 也等于 128。这个数值是人为设计的,确保层与层之间的张量尺寸匹配。
- 若 fc1 输出 256,就必须将 fc2 的输入改为 256,否则张量形状不匹配会报错。
'''
def __init__(self):super(SimpleNN, self).__init__()# 定义一个输入层到隐藏层的全连接层self.fc1 = nn.Linear(28 * 28, 128) # 输入层到隐藏层----输入 28×28 像素(例如 MNIST 手写数字)的输入,这里把展平后的 784 维像素映射到 128 维隐藏表示# 定义一个隐藏层到输出层的全连接层self.fc2 = nn.Linear(128, 10) # 把 128 维隐藏表示映射到 10 维输出(对应 10 个类别)。def forward(self, x):# 前向传播过程x = x.view(-1, 28 * 28) # 展平输入x = torch.relu(self.fc1(x)) # 激活函数ReLU,常用于隐藏层。x = self.fc2(x) # 输出层return x# 创建模型实例 model = SimpleNN()# 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01)# 示例输入 input = torch.randn(1, 28, 28) # 随机生成一个28x28的输入 output = model(input) # 前向传播 loss = criterion(output, torch.tensor([3])) # 假设真实标签为3# 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step()print("输出:", output) print("损失:", loss.item())
激活函数
激活函数的选择方法
对于隐藏层:
什么是 Softmax()
Softmax 函数,又称归一化指数函数,它使用指数函数将输入向量归一化为概率分布(每一个元素的范围都在( 0 , 1 ) (0,1)(0,1) 之间,并且所有元素的和为 1 11)。Softmax 函数多用于多分类问题中。
具体文章:https://blog.csdn.net/jarodyv/article/details/143743683
对于输出层:
损失函数(Loss Function)
损失函数用于衡量模型的预测值与真实值之间的差异。
常见的损失函数包括:
- 均方误差(MSELoss):回归问题常用,计算输出与目标值的平方差。
- 交叉熵损失(CrossEntropyLoss):分类问题常用,计算输出和真实标签之间的交叉熵。
- BCEWithLogitsLoss:二分类问题,结合了 Sigmoid 激活和二元交叉熵损失。
优化器(Optimizer)
优化器负责在训练过程中更新网络的权重和偏置。
主要用在模型训练阶段,用于更新模型中可学习的参数。优化器主要用在模型训练阶段,用于更新模型中可学习的参数。torch.optim提供了多种优化器接口,比如Adam、RAdam、SGD、ASGD、LBFGS等,Optimizer是所有这些优化器的父类。
optim模块是用于实现各种优化算法的核心组件,支持SGD、Adam等主流优化器,并提供参数分组、状态管理等功能。
常见的优化器包括:
- SGD(随机梯度下降)
- Adam(自适应矩估计)
- RMSprop(均方根传播)
核心公共方法说明:

Optimizer的init函数接收两个参数:一个是需要被优化的参数,其形式必须是Tensor或者dict;另一个是优化选项,包括学习率、衰减率等。第一个位置通常是model.parameters()填充,如有其他要求,也可手动写一个dict作为输入。仅需要保证dict中存在['params']键即可,其他键可以按照自己的要求填写。
神经网络类型
- 前馈神经网络(Feedforward Neural Networks):数据单向流动,从输入层到输出层,无反馈连接。
- 卷积神经网络(Convolutional Neural Networks, CNNs):适用于图像处理,使用卷积层提取空间特征。
- 循环神经网络(Recurrent Neural Networks, RNNs):适用于序列数据,如时间序列分析和自然语言处理,允许信息反馈循环。
- 长短期记忆网络(Long Short-Term Memory, LSTM):一种特殊的RNN,能够学习长期依赖关系。
torch.utils.data
torch.utils.data是PyTorch中用于数据处理的核心模块,主要功能包括数据集管理、数据加载和批处理。
核心组件
Dataset:是一个抽象类,是所有自定义数据集的基类。它的核心功能是定义如何获取单个样本。若需要自定义数据集,必须实现以下两个方法:
__len__(self):返回整个数据集的大小(即样本数量)。
__getitem__(self, index):根据索引返回一个样本(包括输入数据和标签)。
这类设计使得 Dataset 更像是一个“按需取样”的接口,适合处理静态数据、文件索引、或内存中的数据。
DataLoader:是一个封装迭代器,用于将 Dataset 封装成可批量读取的迭代器。其核心功能包括:
批量读取(batching)、打乱数据顺序(shuffling)、多进程加载(multiprocessing)、数据拼接方式(collate_fn)、GPU内存优化(pin_memory)、丢弃不完整的批次(drop_last)
DataLoader 是训练模型时的核心组件,它将数据读取与模型训练解耦,提升训练效率和代码可读性。
参考:
https://m.runoob.com/pytorch/pytorch-neural-network.html
https://blog.csdn.net/weixin_42291376/article/details/150536397
