各位观众老爷,有想要了解的大模型相关内容都可以评论私信,我会及时总结出来哦😀

--推一下我的机器人女友公众号-“千寻与千羽”,打造你的专属女友,赶紧尝试一下吧,有时间会出详细教程哦--

目录

一、深度学习框架

二、pytorch框架环境安装

三、pytorch张量使用

一、深度学习框架

1、什么是深度学习?

深度学习是机器学习中的一种特殊学习方法,它不依赖于数据的特征进行训练,而是自己总结特征进行预测;深度学习的主要结构就是神经网络(下一期)。

2、深度学习的框架

1)pytorch框架:Meta开发的框架,动态图模式,生态强大、入门容易,代码量少

2)Tensflow框架:Google开发的框架,静态图模式,工业部署强大,底层高效

3)PaddlePaddle框架:百度开发的框架,动态图静态图都支持,中文支持友好,适合国产化要求的项目

4)ONNX:多家国外大厂联合开发的模型文件通用格式,适用于跨框架、跨平台的模型部署

os:静态图、动态图的含义

静态图就像是提前规划好的路线,在运行之前就把整个计算流程都定义好,然后按照这个固定的流程去执行,这样可以做一些优化,让程序运行得更快。动态图呢,就比较灵活啦,它是边运行边定义计算流程,就像你走路的时候可以随时改变方向一样,更适合调试和快速开发。

二、pytorch框架环境安装

1、使用pycharmIDE进行开发,anaconda做包管理器,创建conda环境:

有需要讲解anaconda的话可以留言

最好使用管理员身份,在开始菜单找到Anaconda prompt,执行以下命令:

  • 创建默认目录的conda环境:conda create -n 环境名称 python=3.12(版本号)
  • 创建指定目录conda环境:conda create --prefix 绝对路径 python= 3.12(版本号)
  • 切换/激活指定环境:conda activate 环境名
  • 删除环境(不讲不讲,万一初学者删了出问题就完了)
  • 查看所有环境:conda env list

2、nvidia相关cuda环境安装

3、安装pytorch模块

  • 下载:https://download.pytorch.org/whl/cu126/torch/,cu126是本地安装的cuda的版本号
    cp310是python版本
  • conda窗口到下载所在目录下
    pip install "torch-2.9.1+cu126-cp310-cp310-win_amd64.whl"

4、无nvidia显卡和amd显卡,需要使用内存计算,忽略之前3步,直接

  • pip install torch下载最新,不支持cuda

三、pytorch张量使用

下面详细介绍一下pytorch框架,主要分为两部分,即张量和自动微分。


张量主要作用在我看来就是对样本数据进行加工处理的,以满足模型的格式和内容需要,张量常常和numpy、pandas做数据转换,建议可以学习一下numpy和pandas。

1、张量概念分类

张量是pytorch框架的基本数据格式,其实就是数学中的数组。

0维张量也叫标量,对应数学中的数字;

1维张量也叫向量,对应数学中的一维数组;

2维张量也叫矩阵,对应数学中的二位数组;

多维张量也就是高维数组。


2、张量创建

根据指定数据创建张量

  • torch.tensor()
  • data = torch.tensor(10) 0维
  • data = np.random.randn(2, 3)  传numpy
    data = torch.tensor(data)
  • data = [[10., 20., 30.], [40., 50., 60.]]  传list
    data = torch.tensor(data)

按照形状或根据数据创建张量

  • torch.Tensor()
  • data = torch.Tensor(2, 3)  2行3列
  • data = torch.Tensor([10])  一维
  • data = torch.Tensor([10, 20])

创建指定类型张量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 

  • data = torch.IntTensor(2, 3)
  • data = torch.IntTensor([2.5, 3.3])
  • data = torch.ShortTensor()  # int16
    data = torch.LongTensor()   # int64
    data = torch.FloatTensor()  # float32
    data = torch.DoubleTensor() # float64

创建一维张量

  • torch.arange(start, end, step) 
  • torch.linspace(start, end, steps) 

创建随机张量

        创建随机种子
        torch.initial_seed()    #  使用系统时间戳随机种子
        torch.manual_seed(2026) # 自定义设置

  • torch.rand(2,3) 创建数值0-1的2行3列随机张量
  • torch.randn(2,3)  标准正态分布的随机张量
  • torch.randint(0,10,(2,3)) 创建0-10的2行3列随机整数向量

特殊张量

  • torch.ones()全1张量
  • torch.zeros() 全0 张量
  • torch.full([2, 3], 10) 自定义全10张量

3、类型转换

元素类型设置

  • torch.tensor(dtype=) 中使用dtype指定
  • t1.type(torch.DoubleTensor)
  • t2=t1.int()、t2=t1.double() t2=t1.half()半精度

张量->numpy

  • n1 = t1.numpy()   共享内存方式
  • n1 = t1.numpy().copy()  不共享内存方式

numpy -->张量

  • t1 = torch.from_numpy(n1) 共享内存方式
  • t1 = torch.from_numpy(n1).clone()  不共享内存方式
  • t1 = torch.tensor(numpy对象)   不共享内存方式

标量和数值转换

  • num = t1.item() 获取标量数值

4、张量运算

常见运算

        add、sub、mul、div、neg      # 不会修改原数据

        add_、sub_、mul_、div_、neg_    # 带下划线会修改原数据(共享内存)

        data = torch.randint(0, 10, [2, 3])

运算函数

  •         均值data.mean
  •         平方torch.pow()
  •         平方根 torch.sqrt()
  •         求和sum()
  •         指数计算 exp()
  •         对数计算log()\log10()\log2()

点乘:*  mul()

        t1 * t2,t2.mul(t1)   点乘:两个张量shape一致

       对应位置相乘

点积(矩阵乘法)

        t1 @ t2 , torch.matmul(t1,t2) :矩阵乘法:t1列等于t2行

        A的形状是 (m, n)
        B的形状是 (n, p)
        结果C的形状是 (m, p)

        行列相乘

        [[1, 2, 3], [4, 5, 6]] @ [[1, 2], [3, 4], [5, 6]]
        第一行:[1, 2, 3] · [1, 3, 5] = 1×1 + 2×3 + 3×5 = 22
        第一行:[1, 2, 3] · [2, 4, 6] = 1×2 + 2×4 + 3×6 = 28
        第二行:[4, 5, 6] · [1, 3, 5] = 4×1 + 5×3 + 6×5 = 49
        第二行:[4, 5, 6] · [2, 4, 6] = 4×2 + 5×4 + 6×6 = 64

        最终得到【【22,28】,【49,64】】


5、索引切片

  • 行列索引 data[0]第0行 data[:,0]所有行的第0列
  • 列表索引 data[[0, 1], [2, 3]]    # 返回 (0, 2)、(1, 3) 两个位置的元素
  • 范围索引 data[:3, :2]    # 前3行的前2列数据,data[2:, :2]     # 第2行到最后的前2列数据
  • 布尔索引 data[data[:, 2] > 5]   # 第2列大于5的行数据
  • 多位索引 data[1, :, :]     # 获取0轴上的第2个数据   data[:, 0, :]    # 获取1轴上的第一个数据

6、形状操作

1) reshape() 改变数据维度形状,要求该斌前后元素个数一致

            reshape(3,2) 改成3行2列的数据

            reshape(-1,2) 负1表示自动推断大小

2)view()用于修改连续张量的形状,修改后仍然连续,默认创建张量内存就是连续的

3)contiguous :把不连续张量改造为连续张量

4)squeeze/unsqueeze:移除长度是1的维度/增加长度为1的维度

        squeeze(dim=0) 如果0维度上长度为1,则移除

        unsqueeze(dim=0)  在0轴增加长度为1的维度

5)transpose:交换张量的两个维度

        transpose(1,2) 交换第1、2维度

6)permute:重新排序张量的维度

        permute(2,3,1,0)  打乱原维度重新组成维度,按照2,3,1,0的维度重排

7、张量拼接

1) torch.cat()

  • 作用:在 已有维度 上拼接张量,不增加新维度。

  • 要求:所有张量在除拼接维度外的其他维度上形状必须完全相同。

  • 输出形状:拼接维度的尺寸等于各张量在该维度尺寸之和,其余维度不变。

  • 示例

    import torch
    a = torch.randn(2, 3)
    b = torch.randn(2, 3)
    c = torch.cat([a, b], dim=0)  # 沿第0维拼接 → 形状 (4, 3)
    d = torch.cat([a, b], dim=1)  # 沿第1维拼接 → 形状 (2, 6)

2)torch.stack()

  • 作用:在 新维度 上堆叠张量,会插入一个新的维度。

  • 要求:所有张量形状必须 完全相同

  • 输出形状:新维度的大小等于张量个数,原张量的所有维度依次向后顺延。

  • 示例

    a = torch.randn(2, 3)
    b = torch.randn(2, 3)
    e = torch.stack([a, b], dim=0)  # 新维度在最前 → 形状 (2, 2, 3)
    f = torch.stack([a, b], dim=1)  # 新维度在第1维 → 形状 (2, 2, 3)  # 注意:此处(2,2,3)中第一个2是原第0维大小,第二个2是张量个数
    g = torch.stack([a, b], dim=2)  # 新维度在最后 → 形状 (2, 3, 2)

8、自动微分torch.autograd

前向传播:模型给根据输入和当前参数计算预测值和损失的过程

反向传播:模型计算损失值和每个参数变化关系(梯度)自动微分就是为了计算这些梯度。

以线性连接为例 

import torch
# 1. 当X为标量时梯度的计算
def test01():
    x = torch.tensor(5)
    # 目标值
    y = torch.tensor(0.)
    # 设置要更新的权重和偏置的初始值
    w = torch.tensor(1., requires_grad=True, dtype=torch.float32)
    b = torch.tensor(3., requires_grad=True, dtype=torch.float32)
    # 设置网络的输出值
    z = x * w + b  # 矩阵乘法
    # 设置损失函数,并进行损失的计算
    loss = torch.nn.MSELoss()
    loss = loss(z, y)
    # 自动微分
    loss.backward()
    # 打印 w,b 变量的梯度
    # backward 函数计算的梯度值会存储在张量的 grad 变量中
    print("W的梯度:", w.grad)
    print("b的梯度", b.grad) 

       这段代码输出结果  W的梯度: tensor(80.) b的梯度 tensor(16.)

原因分析

  1. 前向传播

    • 输入 x = 5,权重 w = 1,偏置 b = 3,则网络输出 z = x * w + b = 5*1 + 3 = 8

    • 目标值 y = 0,损失函数采用均方误差(MSELoss,默认 reduction='mean'),对于标量输入,损失值为 loss = (z - y)² = (8 - 0)² = 64

  2. 反向传播(梯度计算)

    • 损失 loss = z²,其中 z = 5w + b

    • 根据链式法则:

      • ∂loss/∂z = 2z = 2*8 = 16

      • ∂z/∂w = x = 5

      • ∂z/∂b = 1

    • 因此:

      • ∂loss/∂w = ∂loss/∂z * ∂z/∂w = 16 * 5 = 80

      • ∂loss/∂b = ∂loss/∂z * ∂z/∂b = 16 * 1 = 16

梯度值被存储在 w.grad 和 b.grad 中,即 80 和 16。

更多推荐