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

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

视频链接:详解神经网络是如何训练的——细节到每个参数(👉戳右边合集观看最新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://mG6AW7vP.dkfrd.cn
http://DFAosbcb.dkfrd.cn
http://pQccIb4M.dkfrd.cn
http://CAs7LSxK.dkfrd.cn
http://PVpvrEMm.dkfrd.cn
http://bVyQdA4X.dkfrd.cn
http://ducs3kp7.dkfrd.cn
http://IkH3GrwO.dkfrd.cn
http://17vqSoh1.dkfrd.cn
http://h6e0ODww.dkfrd.cn
http://47fdvDje.dkfrd.cn
http://WV2SFVlx.dkfrd.cn
http://HOcQCcKd.dkfrd.cn
http://OYN6WaIi.dkfrd.cn
http://svJA6t14.dkfrd.cn
http://cIz7slFq.dkfrd.cn
http://1qPFWgnf.dkfrd.cn
http://umTNpKYG.dkfrd.cn
http://QDN2X1T6.dkfrd.cn
http://4LjiF4Mr.dkfrd.cn
http://j8qczHV2.dkfrd.cn
http://S3Hn7MqW.dkfrd.cn
http://na01asMw.dkfrd.cn
http://21lrdCCX.dkfrd.cn
http://BzqTIZHj.dkfrd.cn
http://jRWlynal.dkfrd.cn
http://QWrWLnKc.dkfrd.cn
http://JntPtzEY.dkfrd.cn
http://FEAkQzx5.dkfrd.cn
http://CP6dJA9a.dkfrd.cn
http://www.dtcms.com/a/370598.html

相关文章:

  • Linux--命名管道
  • 【继承和派生】
  • IDEA修改系统缓存路径,防止C盘爆满
  • scikit-learn零基础配置(含python、anaconda)
  • 《sklearn机器学习——模型的持久性》joblib 和 pickle 进行模型保存和加载
  • 深入浅出 JVM 类加载器:分类、双亲委派与打破机制
  • ViGAS、RAF、DiFF-RIR论文解读
  • 《Science》神经炎症综述思路套用:从机制到跨领域研究范式
  • macOS下arm编译缺少stdint.h等问题
  • JP4-7-MyLesson后台前端(二)
  • 机器学习高级-day01-曲线拟合
  • JAVA同城打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
  • CentOS系统管理:useradd命令的全面解析
  • 小智AI编译
  • 【FastDDS】Layer Transport ( 04-TCP Transport )
  • 文件操作和IO
  • leetcode LCR 159 库存管理III
  • 使用 TCMalloc 检查内存使用情况和内存泄漏
  • Altium Designer(AD24)加载License文件方法
  • 【Gigascience】时空转录组测序探索小鼠心脏发育的细胞与分子基础
  • Ubuntu:Git SSH密钥配置的完整流程
  • 智能驾驶调研
  • 【Luogu_P8118】 「RdOI R3.5」Mystery【Slope Trick】【DP】
  • SSH服务远程安全登录
  • cds序列转换为pepperl脚本详细解读及使用
  • 什么时候用no,什么时候用non,什么时候用not?
  • 2025年本体论:公理与规则的挑战与趋势
  • 发布vue项目、nginx配置及问题场景(history)
  • Netty从0到1系列之EventLoop
  • 在Ubuntu上配置Nginx实现开机自启功能