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

如何进行神经网络的模型训练(视频代码中的知识点记录)

视频链接:详解神经网络是如何训练的——细节到每个参数(👉戳右边合集观看最新Transformer相关教程)_哔哩哔哩_bilibili

1.nn.Parameter()

在 PyTorch 中,nn.Parameter() 是一个特殊的类(torch.nn.Parameter),用于定义神经网络中可学习的参数(如权重、偏置等)。它是 torch.Tensor 的子类,核心作用是:当把 Parameter 对象赋值给 nn.Module 类(或其子类,如自定义模型、层)的属性时,会自动被注册为模型的参数,并参与训练时的梯度计算和更新。

  • nn.Parameter 会被自动纳入模型的参数管理,是 “可学习参数” 的官方标记方式。
    import torch
    from torch import nn
    class Model(nn.Module):def __init__(self):super().__init__()self.w=nn.Parameter(torch.randn(2,3))self.b=nn.Parameter(torch.zeros(2))def forward(self,x):return x@self.w.t()+self.b
    model=Model()
    for name,param in model.named_parameters():print(f"参数名:{name},形状:{param.shape}")

    注意:在 PyTorch 中,torch.randn(4, 3) 会生成一个形状为 (4, 3) 的张量,其元素是服从标准正态分布(均值为 0,标准差为 1)的随机数。因此,self.w 的具体数值是随机生成的,每次运行代码都会得到不同的结果。

2.损失函数标准差的计算

其中data_train.iloc[i:i+4, :-1]是panda中按位置提取数据的操作,是一个panda_DataFrame对象,要求变量名不能有空格,由此命名为data_train。i:i+4表示选取从索引 i 到 i+3 的连续 4 行数据,:-1表示选取除最后一列之外的所有列。而只有-1表示选取最后一列。

3.self的用法

不是所有的类中的函数(方法)都有self参数,类的方法有实例化方法,类方法,静态方法。

实例化方法要求第一个参数是self,self 代表调用该方法的实例对象本身。

类方法:用 @classmethod 装饰,第一个参数必须是 cls(代表类本身),不需要 self
作用:操作类的属性或创建实例(与类相关,不依赖具体实例)。

静态方法:用 @staticmethod 装饰,既不需要 self,也不需要 cls,本质上是定义在类命名空间中的普通函数。
作用:提供与类相关的工具功能,不依赖类或实例的状态。

4.pyTorch模型训练步骤

初始化模型 → 2. 初始化优化器(依赖模型参数,需在模型之后)→ 3. 准备数据 → 4. 循环训练(多轮 Epoch)

每轮训练:梯度清零 → 前向传播(算 y_pred)→ 计算损失 → 反向传播(算梯度)→ 优化器更新参数(用梯度调参)

import torch
from torch import nn
import numpy as np
import pandas as pd
from torch.optim import AdamWclass Model(nn.Module):def __init__(self):super().__init__()self.w = nn.Parameter(torch.tensor([[0.1,0.2],[0.2,0.3],[0.1,0.3]]))  # 权重:(1,2),对应2个特征self.b = nn.Parameter(torch.tensor([0.0,0.1,0.2]))     # 偏置:self.softmax=nn.Softmax(-1)def forward(self, x):# 修正:用squeeze()将输出从(3,1)转为(3,),与y的形状完全匹配return self.softmax((x @ self.w.t() + self.b).squeeze()  )@staticmethoddef loss(y_pred, y):return ((y_pred - y) ** 2).mean()  # MSE损失if __name__ == '__main__':# 1. 初始化模型model = Model()print(model.w) print(model.b)# 2. 初始化优化器(必须在模型之后)optimizer = AdamW(params=model.parameters(),lr=0.1  # 学习率)# 3. 准备训练数据data_list = [[1, 2, 3, 4],   # x取前2列[1,2],y取最后1列[4][2, 3, 4, 5],   # x取[2,3],y取[5][3, 4, 5, 6]    # x取[3,4],y取[6]]data_train = pd.DataFrame(data_list)# 4. 训练循环(核心修正部分)epochs = 10  # 训练轮次for epoch in range(epochs):  # 外部epoch循环:用epoch而非i,避免变量冲突# 关键1:每个epoch重置损失列表,不累积历史损失epoch_loss_list = []  # 关键2:内部数据循环用j,避免与外部epoch变量冲突(原代码用i覆盖)for j in range(0, len(data_train), 4):  #核心作用是从 data_train 的第 0 个元素开始,每间隔 4 个元素取一个索引 j,通常用于 批量处理数据(比如每次处理 4 个样本,即批量大小为 4)# 提取特征x:前2列,形状(3,2)(3个样本,每个样本2个特征)x = torch.tensor(np.array(data_train.iloc[j:j+3, :-2]), dtype=torch.float32)# 提取标签y:最后1列,形状(3,)(3个样本,每个样本1个标签)y = torch.tensor(np.array(data_train.iloc[j:j+3, -1]), dtype=torch.float32)# 前向传播:得到y_pred(形状(3,))y_pred = model(x)# 计算当前批次损失batch_loss = Model.loss(y_pred, y)# 收集当前epoch的批次损失epoch_loss_list.append(batch_loss)# 5. 反向传播与参数更新(关键修正:顺序和梯度清零)optimizer.zero_grad()  # 关键3:先清零梯度,再反向传播(原代码顺序颠倒)total_epoch_loss = sum(epoch_loss_list)  # 当前epoch的总损失(不累积历史)total_epoch_loss.backward()  # 对当前epoch的总损失反向传播optimizer.step()  # 更新参数# 6. 打印训练日志(观察损失下降和参数更新)print(f"Epoch: {epoch+1:2d} | Total Loss: {total_epoch_loss.item():.4f}")print(model.w)print(model.b)y_preds=[torch.round(y_pre) for y_pre in y_pred]print('#########',y_preds)accuracy=(np.array(y_pred)==(np.array(y))).mean()print('Accaracy:',accuracy)

5,前向传播和反向传播的区别

6.nn.Linear()

nn.Linear 是 PyTorch(torch.nn 模块)中实现线性变换的核心层类,本质是对输入数据执行「矩阵乘法 + 偏置加法」操作,公式为:
y = x · Aᵀ + b
其中:x 是输入,A 是层的权重矩阵,b 是偏置向量(可选),y 是输出。它是神经网络中构建全连接层、输入输出层的基础组件。

import torch
from torch import nn
torch.random.manual_seed(42)class F1(nn.Module):def __init__(self):super().__init__()self.softmax=nn.Softmax(-1)self.linear=nn.Linear(4,3)def forward(self,x):return self.softmax(self.linear(x))f=F1()
X=torch.tensor([[1.2,2.1,3.3,4.5],[2.3,3.4,4.5,5.1]
])y_pred=f(X)
print(y_pred)
print(f.linear.weight)
print(f.linear.bias)

7.密集张量与稀疏张量的区别

密集张量存储全部元素(包括大量无意义的零值 / 无效值),稀疏张量仅存储 “有意义的非零 / 有效元素” 及其位置,二者适用于不同数据场景。

稀疏张量: 例如一个3×4 的表格,若只有 2 个非零值,只需记录这 2 个值的 “行号、列号” 和 “值本身”,无需记录其他零值。

密集张量:比如一个 3×4 的表格,即使大部分单元格是 0,也会把每个单元格的内容(包括 0)都记录下来。

8.TensorFlow,Pytorch和Transfrom的关系

TensorFlow 和 PyTorch 是 “平行的深度学习工具”,都能将 “Transformer 这个序列建模方案” 转化为可训练、可运行的模型;Transformer 依赖这两个框架(或其他框架)实现,而两个框架则通过支持 Transformer,拓展了自身处理序列任务的能力。

http://www.xdnf.cn/news/20310.html

相关文章:

  • 2025最新超详细FreeRTOS入门教程:第一章 FreeRTOS移植到STM32
  • dp算法的种类
  • 制衣跟单高效管理软件推荐
  • linux 安全与防护,全方向讲解
  • 华清远见25072班I/O学习day6
  • Qt绘图功能学习笔记
  • 北斗导航 | 导航定位中的卡尔曼滤波算法:原理、公式及C代码详解
  • XXL-JOB基本使用
  • MyBatis高频问题-动态sql
  • 计算机网络:以太网中的数据传输
  • golang连接influxdb的orm操作
  • halcon-亚像素边缘提取教程
  • PyTorch 模型文件介绍
  • element-plus 表单校验-表单中包含多子组件表单的校验
  • (数据结构)哈希碰撞:线性探测法 vs 拉链法
  • 基于区块链的IoMT跨医院认证系统:Python实践分析
  • Flink中的事件时间、处理时间和摄入时间
  • Joplin-解决 Node.js 中 “digital envelope routines::unsupported“ 错误
  • 自旋锁/互斥锁 设备树 iic驱动总线 day66 67 68
  • 输入2.2V~16V 最高输出20V2.5A DCDC升压芯片MT3608L
  • 计算机网络:网络设备在OSI七层模型中的工作层次和传输协议
  • 鸿蒙 BLE 蓝牙智能设备固件升级之DFU升级方式(Nordic芯片)
  • macbook intel 打开cursor会闪退
  • MySQL集群高可用架构(MHA高可用架构)
  • Process Explorer进阶(第三章3.3):深入理解进程详情
  • [Windows] AdGuard.v7.21.5089.0 中文直装电脑版
  • cds序列转换为pepperl脚本详细解读及使用
  • Python多线程编程全面指南
  • web自动化测试
  • Elasticsearch优化从入门到精通