当前位置: 首页 > news >正文

第三十三天打卡复习

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]

  • 权重矩阵(形状:[input_dim, hidden_units]

  • 偏置向量(形状:[hidden_units]

  • 计算过程

    Z¹ = X · W¹ + b¹  # 线性变换
    A¹ = σ(Z¹)        # 激活函数(如ReLU/Sigmoid)
    • :加权和(未激活值)

    • :激活后的输出(作为下一层输入)


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.神经网络

在训练过程中监控模型在测试集(或验证集)上的性能。这样做有两个关键目的:

  1. 检测过拟合:当训练损失下降但测试损失上升时,表明模型开始记忆训练数据而非学习泛化模式

  2. 确定最佳停止点:通过测试集表现选择最佳模型,避免欠拟合或过拟合

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)适用场景
    SGD0.01-0.10.9-0.99基础优化
    Adam0.0001-0.001β1=0.9, β2=0.999默认首选
    RMSprop0.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)

    @浙大疏锦行

相关文章:

  • Java 中 i++ 与 ++i 的区别及常见误区解析
  • 《Effective Python》第六章 推导式和生成器——使用类替代生成器的 `throw` 方法管理迭代状态转换
  • 行列式详解:从定义到应用
  • C++的多态特性及private
  • Go的隐式接口机制
  • Vue中安装插件的方式
  • 技巧小结:外部总线访问FPGA寄存器
  • 登高架设作业实操考试需要注意哪些安全细节?
  • 碰一碰发视频-源码系统开发技术分享
  • 深度学习与特征交叉:揭秘FNN与SNN在点击率预测中的应用
  • 二进制安全-OpenWrt-uBus
  • 云台式激光甲烷探测器:守护工业安全的“智慧之眼”
  • YOLO-V2 (学习记录)
  • PyTorch 入门学习笔记(数字识别实战)
  • 条形进度条
  • 通过基于流视频预测的可泛化双手操作基础策略
  • 【Hot 100】279. 完全平方数
  • Spring 官方推荐构造函数注入
  • win11中使用grep命令
  • 红外遥控器接收实验:Simulink应用层开发
  • 昌吉市住房和城乡建设局网站/企业网页设计与推广
  • 西安做网站选哪家/杭州百度优化
  • 网站建网站建站/网站可以自己做吗
  • 电子商务网站建设与维护的教学/独立站网站
  • 我国中小企业网站建设/seo是什么岗位简称
  • php网站模块修改/公司宣传软文