欢迎光临
我们一直在努力

pytorch张量

一.什么是张量(Tensor)?

1.通俗解释

张量就是PyTorch 里专门用来存数字、做计算的多维数组,是整个 PyTorch 的核心数据载体。
类比:

  • 普通数字(单个数值)→ 0维张量
  • 列表/一维数组 [1,2,3] → 1维张量(向量)
  • 表格/矩阵 [[1,2],[3,4]] → 2维张量(矩阵)
  • 多张表格叠在一起(比如多张图片)→ 3维/4维张量

核心作用:神经网络的所有数据(输入图片、标签、权重、偏置)全都要用张量存储,所有运算也都基于张量完成。

2.专业定义

张量是支持自动微分、硬件加速(CPU/GPU)、多维结构化的数值容器,区别于 Python 原生列表、NumPy 数组,它是为深度学习量身设计的。

3.张量 vs 普通列表 / NumPy 数组

1.** Python 列表**:只能存数据,不能GPU加速、不支持自动求导,运算慢;
2. NumPy 数组:多维数组、运算快,但无法直接放到GPU,没有深度学习必备的自动微分功能;
3. PyTorch 张量:兼容数组逻辑,支持CPU/GPU切换、原生自动求导、深度学习算子,是深度学习标配。

二.张量的维度(Rank/阶)与形状(Shape)

维度是张量最关键的概念,维度 = 有几层中括号,形状 shape 用来描述每一层有多少个元素。

1.0维张量(标量 Scalar)

  • 形态:单个数字,没有中括号
  • 例子:5、3.14
  • 维度: dim=0
  • shape:空 ()
  • 用途:损失值、准确率、单个阈值

import torch
t0 = torch.tensor(5)
print(t0) # tensor(5)
print(t0.dim()) # 0 维度数
print(t0.shape) # torch.Size([]) 形状

2.1维张量(向量 Vector)

  • 形态:一层中括号,类似 Python 列表
  • 例子: [1, 2, 3, 4]
  • 维度: dim=1
  • shape: (元素个数,)
  • 用途:一维特征、标签数组、简单序列数据

import torch
t1 = torch.tensor([1,2,3,4])
print(t1.dim()) # 1
print(t1.shape) # torch.Size([4])

3.2维张量(矩阵 Matrix)

  • 形态:两层中括号,类似 Excel 表格、数学矩阵
  • 格式:[[行1], [行2], …]
  • shape: (行数, 列数)
  • 维度:dim=2
  • 用途:全连接层数据、表格型数据集

import torch
#2行3列
t2 = torch.tensor([[1,2,3],[4,5,6]])
print(t2.dim()) # 2
print(t2.shape) # torch.Size([2, 3])

4.3维张量

  • 形态:三层中括号,矩阵的堆叠
  • shape:(矩阵个数, 行数, 列数)
  • 维度:dim=3
  • 经典用途:单通道图片、文本词向量序列

举例: (3, 2, 2) → 3个 2行2列 的矩阵

import torch
t3 = torch.randn(3, 2, 2) # 随机生成3×2×2张量
print(t3.shape) # torch.Size([3, 2, 2])

5.4维张量(深度学习常用)

重中之重,图像、卷积网络全靠它!
标准格式(PyTorch 图像默认):

shape = (batch_size, channel, height, width)
翻译+拆解:

  • batch_size (批次):一次喂给模型多少张图片(批量训练)
  • channel (通道):色彩通道- 灰度图:单通道 channel=1
    • 彩色图(RGB):三通道 channel=3
  • height :图片高度(像素)
  • width :图片宽度(像素)
  • 例子:(8, 3, 256, 256)
    含义:一批8张RGB彩色图,每张图分辨率 256×256

    import torch
    #4维张量:8张图,3通道,256高,256宽
    t4 = torch.rand(8, 3, 256, 256)
    print(t4.dim()) # 4
    print(t4.shape) # torch.Size([8, 3, 256, 256])

    补充:高维张量

    5维及以上多用于视频、3D图像、多模态数据,逻辑和上面一致,层数=维度数。

    三.张量的数据类型(dtype)

    张量存储的数字分不同类型,对应整数、浮点数,深度学习中浮点型是主力。

    1.常用数据类型(专业名词+用途)

    类型名称用途场景
    torch.float32/torch.float 32位单精度浮点数 默认浮点类型,网络权重,输入数据最常用
    torch.float64/torch.double 64位单精度浮点数 高精度计算,深度学习极少用
    torch.int64/ torch.long 64位长整数 标签,分类索引(分类任务必备)
    torch.int32/ torch.int 32位整数 普通整数数据
    torch.bool 布尔型 掩码,条件判断

    2.小知识点

  • 直接用 torch.tensor() 创建时,整数默认 int64,小数默认 float32;
  • 神经网络计算必须用浮点型,分类标签必须用 long 型;
  • 类型转换:张量.to(目标类型)
  • 示例:

    import torch
    t = torch.tensor([1.1, 2.2])
    print(t.dtype) # torch.float32
    t_long = torch.tensor([0,1,2])
    print(t_long.dtype) # torch.int64

    四.张量的两大核心属性(深度学习独有)

    这是张量和 NumPy 数组最本质的区别。

    1.设备属性(device):CPU / GPU

    张量可以存放在CPU内存或GPU显存中,GPU 运算速度远快于CPU,训练模型必须用GPU。

    • device(type='cpu') :存放在CPU(默认)
    • device(type='cuda', index=0) :存放在0号GPU

    常用操作:

    import torch
    t = torch.rand(3,3)
    #1. 查看设备
    print(t.device) # cpu
    #2. 张量移到GPU
    t_gpu = t.cuda()
    #或写法(推荐,兼容性更好)
    t_gpu = t.to("cuda")
    #3. 张量移回CPU
    t_cpu = t_gpu.to("cpu")

    :::info
    重要规则:两个张量做运算,必须在同一个设备上,否则直接报错。

    :::

    2.梯度属性(requires_grad & grad):自动微分

    这是训练神经网络的灵魂,对应深度学习的反向传播、梯度下降。

    名词解释

  • requires_grad :是否开启自动求导
    • False (默认):普通数据,不计算梯度(图片、输入数据)
    • True :需要计算梯度(网络权重、参数)
  • grad :存储计算出来的梯度值
  • 通俗理解

    模型训练就是不断更新权重:

  • 前向传播:用张量(权重)计算预测结果
  • 反向传播:自动算出「权重该调大还是调小」→ 这个差值就是梯度
  • PyTorch 的张量原生支持这套流程,不用手动求导。
  • 示例:

    import torch
    #开启求导
    w = torch.tensor([2.0], requires_grad=True)
    y = w ** 2 # 计算 y = w²
    y.backward() # 反向传播,计算梯度
    print(w.grad) # tensor([4.]) 数学推导:y'=2w,w=2 → 梯度=4

    五.张量的创建方式(高频用法)

    日常编码最常用的创建函数,附通俗说明:

    1.从手动数据创建

    torch.tensor(列表/数值) :最基础,自定义数据

    import torch
    a = torch.tensor([1,2,3])

    2.创建全0 / 全1 张量

    • torch.zeros(形状) :所有元素为 0
    • torch.ones(形状) :所有元素为 1
      常用于初始化占位数据、掩码。

    import torch
    zeros = torch.zeros(2,3) # 2行3列全0
    ones = torch.ones(4) # 1维全1

    3.创建随机张量(深度学习最常用)

  • torch.rand(shape) :元素在 [0,1) 均匀分布随机数,初始化网络输入/特征
  • torch.randn(shape) :标准正态分布(均值0,方差1),初始化网络权重首选
  • import torch
    rand1 = torch.rand(3,3) # 0~1随机
    rand2 = torch.randn(2,4) # 正态分布随机

    4.等间隔序列

    torch.arange(起始, 结束, 步长) :类似 Python range ,生成有序数列

    import torch
    seq = torch.arange(0, 10, 2) # [0,2,4,6,8]

    六.张量维度变换(高频操作:变形、转置、拼接)

    处理图像、特征时几乎天天用,重点掌握。

    1.形状重塑: reshape() / view()

    **作用:**不改变元素总数,只改变维度结构。
    **规则:**新形状的元素总数 = 原形状总数
    可以用 -1 让 PyTorch 自动计算维度。

    import torch
    t = torch.rand(2, 4) # 总共 2*4=8 个元素
    t2 = t.reshape(4, 2) # 改成4行2列
    t3 = t.view(1, 2) # 自动计算第一维 → shape [4,2]

    2.增减维度: unsqueeze() / squeeze()

    • unsqueeze(dim) :增加一个维度(扩充批次/通道,处理单张图片必备)
    • squeeze(dim) :删除长度为1的维度(压缩多余维度)

    示例:单张图片 [3,256,256] → 模型要求4维 [1,3,256,256]

    import torch
    img = torch.rand(3, 256, 256) # 3维单张图
    img_batch = img.unsqueeze(0) # 在第0维加维度 → [1,3,256,256]
    img_restore = img_batch.squeeze(0) # 删除第0维 → 变回3维

    3.张量拼接: cat()

    把多个张量按指定维度拼在一起,常用于合并批次、合并特征。

    import torch
    a = torch.rand(2,3)
    b = torch.rand(2,3)
    c = torch.cat([a, b], dim=0) # 按行拼接 → shape [4,3]

    :::info
    对于二维张量 [行数, 列数]

    • dim = 0:代表行方向(第一个维度)
    • dim = 1:代表列方向(第二个维度)

    :::

    七.张量索引与切片(取数据)

    规则和 Python 列表、NumPy 完全一致:

    • t[索引] :取单个元素
    • t[起始:结束] :切片
    • 多维度: t[维度1, 维度2]

    示例(4维图像张量):

    import torch
    imgs = torch.rand(8,3,256,256)
    first_img = imgs[0] # 取第1张图 [3,256,256]
    first_two = imgs[0:2] # 取前2张图 [2,3,256,256]

    八.补充:张量和 NumPy 数组互转

    实战中经常混用两者,转换非常简单:

    1. 张量 → NumPy:tensor.numpy()

    2. NumPy → 张量:torch.from_numpy(ndarray)

    :::info
    注意:如果张量在GPU上,要先转到CPU再转NumPy。

    :::

    九.核心总结

    1. 本质:张量是 PyTorch 多维数值数组,深度学习唯一数据载体;

    2. 维度:中括号层数 = 维度,4维 (批次,通道,高,宽) 是图像标准格式;

    3. 两大独有特性:

    • device :支持 CPU/GPU 切换,加速运算;
    • requires_grad/grad :自动求导,支撑网络训练;

    4. 高频操作:创建张量、 reshape 变形、 unsqueeze/squeeze 增减维度、切片索引。

    赞(0)
    未经允许不得转载:171主机测评 » pytorch张量
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址