第三十三天打卡复习
torch 库
1. 张量操作
torch 库提供了张量(Tensor)数据结构,类似于 NumPy 的多维数组,但张量可以在 GPU 上运行以加速计算。
2. 自动求导
torch.autograd 模块实现了自动求导功能,这对于训练神经网络至关重要。通过设置 requires_grad=True ,PyTorch 会跟踪所有涉及该张量的操作,并在调用 backward() 方法时自动计算梯度。
3. 神经网络模块
torch.nn 模块提供了构建神经网络所需的各种组件,如层、损失函数等。可以通过继承 torch.nn.Module 类来定义自定义的神经网络。
4. 优化器
torch.optim 模块提供了各种优化算法,如随机梯度下降(SGD)、Adam 等,用于更新神经网络的参数。
5. GPU 加速
torch.cuda 模块允许将张量和模型移动到 GPU 上进行计算,从而加速训练过程。可以使用 torch.cuda.is_available() 检查 GPU 是否可用。
全连接神经网络(Fully Connected Neural Network)
也被称为多层感知机(Multilayer Perceptron, MLP),是一种基本的神经网络结构。
1. 输入层(Input Layer)
输入层是神经网络的第一层,负责接收原始数据。输入层的神经元数量通常取决于输入数据的特征数量。例如,若输入数据是一个包含 784 个像素值的手写数字图像(28x28 像素),那么输入层就会有 784 个神经元,每个神经元对应一个像素值。输入层并不对数据进行任何计算,只是简单地将数据传递给下一层。
2. 隐藏层(Hidden Layer)
隐藏层位于输入层和输出层之间,可以有一层或多层。隐藏层的神经元通过权重和偏置对输入数据进行非线性变换,从而学习数据中的复杂模式和特征。每一层的神经元都与上一层的所有神经元相连接,这就是“全连接”的含义。隐藏层的神经元数量和层数是超参数,需要根据具体问题进行调整。更多的隐藏层和神经元通常能学习到更复杂的模式,但也可能导致过拟合。
3. 输出层(Output Layer)
输出层是神经网络的最后一层,负责输出最终的预测结果。输出层的神经元数量取决于具体的任务。例如,在二分类问题中,输出层通常只有一个神经元,输出一个介于 0 和 1 之间的概率值;在多分类问题中,输出层的神经元数量等于类别数,每个神经元输出对应类别的概率。
4. 前向传播顺序
前向传播(Forward Propagation)是神经网络的核心计算过程,指输入数据从输入层逐层传递到输出层的过程。以下是详细步骤和计算顺序(以全连接网络为例):
1. 输入层 → 第一个隐藏层
-
输入数据:
X
(形状:[batch_size, input_dim]
) -
权重矩阵:
W¹
(形状:[input_dim, hidden_units]
) -
偏置向量:
b¹
(形状:[hidden_units]
) -
计算过程:
Z¹ = X · W¹ + b¹ # 线性变换 A¹ = σ(Z¹) # 激活函数(如ReLU/Sigmoid)
-
Z¹
:加权和(未激活值) -
A¹
:激活后的输出(作为下一层输入)
-
2. 隐藏层 → 隐藏层(多层时)
-
第 k 层计算(k ≥ 2):
Zᵏ = Aᵏ⁻¹ · Wᵏ + bᵏ # 前一层输出作为输入 Aᵏ = σ(Zᵏ)
-
关键点:
-
每层的输入是前一层的激活输出
Aᵏ⁻¹
-
权重矩阵
Wᵏ
形状为[prev_units, current_units]
-
3. 最后一个隐藏层 → 输出层
-
输入:
Aᴸ⁻¹
(最后隐藏层输出) -
输出层权重:
Wᴸ
(形状:[last_hidden_units, output_dim]
) -
计算:
Zᴸ = Aᴸ⁻¹ · Wᴸ + bᴸ Ŷ = g(Zᴸ) # 输出层激活函数
-
分类任务:
g
通常用 Softmax(多分类)或 Sigmoid(二分类) -
回归任务:
g
可以是恒等函数(无激活)
-
5.神经网络
在训练过程中监控模型在测试集(或验证集)上的性能。这样做有两个关键目的:
-
检测过拟合:当训练损失下降但测试损失上升时,表明模型开始记忆训练数据而非学习泛化模式
-
确定最佳停止点:通过测试集表现选择最佳模型,避免欠拟合或过拟合
6.参数
1.num_epochs
num_epochs = 20000 # 训练的轮数
-
作用:定义模型将完整遍历整个训练数据集的次数
-
典型值:
-
简单任务:100-500
-
中等任务:500-2000
-
复杂任务:2000-10000(本例20000偏大,可能是复杂任务或调试目的)
-
-
注意事项:
-
过小:模型欠拟合
-
过大:可能导致过拟合且浪费计算资源
-
通常配合早停机制使用
-
2. model.forward(X_train)
与 model(X_train)
outputs = model.forward(X_train) # 显式调用 # outputs = model(X_train) # 隐式调用
-
作用:执行前向传播计算
-
关键区别:
-
forward()
:直接调用前向传播方法 -
model()
:通过PyTorch的__call__
魔术方法隐式调用forward()
,推荐使用
-
-
参数:
-
X_train
:训练数据张量,形状通常为[batch_size, features]
-
3. criterion 损失函数
loss = criterion(outputs, y_train)
-
作用:计算模型预测值与真实标签之间的差异(损失函数)
-
常见选择:
-
分类任务:
nn.CrossEntropyLoss()
(多分类),nn.BCELoss()
(二分类) -
回归任务:
nn.MSELoss()
(均方误差) -
自定义损失:可继承
nn.Module
实现
-
-
参数:
-
outputs
:模型预测值 -
y_train
:真实标签
-
4. optimizer
optimizer.zero_grad() # 梯度清零 loss.backward() # 反向传播 optimizer.step() # 参数更新
-
优化器三件套:
-
zero_grad()
:清零梯度缓存(防止梯度累积) -
backward()
:自动计算梯度(反向传播) -
step()
:根据梯度更新权重参数
-
-
常见优化器类型:
# 创建示例 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
关键参数:
-
优化器 学习率(lr) 动量(momentum) 适用场景 SGD 0.01-0.1 0.9-0.99 基础优化 Adam 0.0001-0.001 β1=0.9, β2=0.999 默认首选 RMSprop 0.001 - RNN/LSTM
5. loss.item()
losses.append(loss.item())
-
作用:loss 一般是一个包含单个元素的张量(Tensor), item() 是张量对象的一个方法,其作用是将仅含一个元素的张量转换为 Python 的标量(如 float 类型)。因此, loss.item() 就是把存储损失值的张量转换为 Python 标量值,方便后续打印、记录或者进一步处理。
-
必要性:
-
PyTorch张量包含梯度信息,
.item()
剥离计算图 -
减少内存占用(避免保存完整计算图)
-
便于Python数值操作(绘图、打印等)
-
6. 日志打印控制
if (epoch + 1) % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
-
关键参数:
-
100
:日志打印间隔(平衡信息量与输出量) -
:.4f
:格式化损失值显示4位小数
-
-
设计考量:
-
大模型/大数据集:增大间隔(如500-1000)
-
调试阶段:减小间隔(如10-50)
-
7. 隐藏的重要参数
学习率 (Learning Rate)
-
作用:控制参数更新步长的超参数
-
影响:
-
过大:震荡/发散
-
过小:收敛缓慢
-
-
设置方法:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 关键参数
批量大小 (Batch Size)
-
作用:每次迭代使用的样本数
-
影响:
-
大batch:训练稳定,内存要求高
-
小batch:噪声大,正则化效果强
-
-
典型位置:
# 在DataLoader中设置 train_loader = DataLoader(dataset, batch_size=64)
@浙大疏锦行