云计算百科
云计算领域专业知识百科平台

PyTorch 深度学习笔记(三)PyTorch 张量基础——从零开始掌握 Tensor

系列导读:本系列共 6 篇,从 PyTorch 框架入门到实战案例,带你系统掌握深度学习开发。上一篇:PyTorch 优势全解析——为什么科研和工业都爱它

一、什么是张量(Tensor)

1.1 张量是 PyTorch 的核心

张量是 PyTorch 中最核心的数据抽象,可以理解为:

  • 元素为同一种数据类型的多维矩阵
  • 与 NumPy 数组类似,但支持 GPU 加速和自动微分
  • 以"类"的形式封装,内置丰富的运算和方法

1.2 张量的维度(阶)

在这里插入图片描述

张量的维度数量称为阶(Rank)或维数,通过 ndim 属性查看:

阶数名称示例形状
0 标量(Scalar) torch.tensor(5) []
1 向量(Vector) torch.tensor([1, 2, 3]) [3]
2 矩阵(Matrix) torch.tensor([[1,2],[3,4]]) [2, 2]
3 三维张量 一张彩色图片 [C, H, W] [3, 224, 224]
4 四维张量 一个批次图片 [B, C, H, W] [64, 3, 224, 224]

import torch

# 0 阶张量(标量)
x0 = torch.tensor(2)
print(f"x0: {x0}, 阶数: {x0.ndim}, 形状: {x0.size()}")
# 输出:x0: 2, 阶数: 0, 形状: torch.Size([])

# 1 阶张量(向量)
x1 = torch.tensor([1, 2, 3])
print(f"阶数: {x1.ndim}, 形状: {x1.shape}")
# 输出:阶数: 1, 形状: torch.Size([3])

# 2 阶张量(矩阵)
x2 = torch.tensor([[2, 3, 4], [5, 6, 7]])
print(f"阶数: {x2.ndim}, 形状: {x2.size()}")
# 输出:阶数: 2, 形状: torch.Size([2, 3])

1.3 张量的关键属性

属性说明示例
shape / size() 张量形状 torch.Size([2, 3])
ndim / dim() 维度数量 2
dtype 数据类型 torch.float32
numel() 元素总数 6
device 存储设备 cpu / cuda:0

二、张量的创建方式

2.1 从数据创建

# 根据指定数据创建张量
data = torch.tensor([1, 2, 3])
print(data)

# 指定数据类型
data = torch.tensor([1, 2, 3], dtype=torch.float32)
print(data.dtype) # torch.float32

2.2 根据形状创建(随机初始化)

# 创建 2 行 3 列的浮点张量,默认 float32
data = torch.Tensor(2, 3)
print(data)

# 注意:Tensor 大写用于创建空张量
# tensor 小写用于从数据创建

2.3 创建指定类型的张量

# 各类张量创建方式
data = torch.IntTensor([2, 3]) # int32
data = torch.LongTensor([2, 3]) # int64
data = torch.FloatTensor([2.5, 3]) # float32(默认)
data = torch.DoubleTensor([2, 3]) # float64

# 不显示的类型:FloatTensor→float32,LongTensor→int64

2.4 线性张量

# 固定步长生成 [start, end, step),左闭右开
data = torch.arange(0, 10, 2)
print(data) # tensor([0, 2, 4, 6, 8])

# 固定元素数生成 [start, end],左闭右闭的等差数列
data = torch.linspace(0, 9, 10)
print(data) # tensor([0., 1., 2., …, 9.])

2.5 随机张量 ⭐⭐⭐

# 标准正态分布随机数
data = torch.randn(2, 3)
print(data)

# 随机整数 [low, high),左闭右开
data = torch.randint(low=0, high=10, size=(4, 6))
print(data)

# 设置随机种子,保证可复现
torch.manual_seed(100)
data = torch.randn(2, 3)
print('随机数种子:', torch.initial_seed())

2.6 创建全 0 / 全 1 / 全指定值张量

# 全 0 张量
data = torch.zeros(3, 2)

# 根据形状创建全 0(复制输入张量的形状)
base = torch.tensor([3, 2])
data = torch.zeros_like(base)

# 全 1 张量
data = torch.ones(3, 2)
data = torch.ones_like(base)

# 全指定值
data = torch.full((2, 2), 10) # 全 10
data = torch.full_like(base, 20) # 根据 base 的形状,全 20

易错点:

  • torch.zeros(3) → 默认 float32
  • torch.zeros_like(数据) → 类型跟着输入走

三、张量数据类型转换

3.1 张量与 NumPy 互转

import numpy as np
import torch

# === 张量 → NumPy(共享内存!)===
data_tensor = torch.tensor([1, 3, 4])
data_numpy = data_tensor.numpy()

# ⚠️ 共享内存:修改一个,另一个也变
data_numpy[0] = 100
print(data_tensor) # tensor([100, 3, 4])

# 使用 copy 避免共享
data_numpy = data_tensor.numpy().copy()

# === NumPy → 张量 ===
data_numpy = np.array([1, 3, 4])

# 方式 1:共享内存
data_tensor = torch.from_numpy(data_numpy)

# 方式 2:不共享内存(推荐)
data_tensor = torch.tensor(data_numpy)
# 或
data_tensor = torch.from_numpy(data_numpy).clone()

3.2 提取标量值

# 只有单元素张量才能用 item()
x = torch.tensor([2])
print(x.item()) # 2

x = torch.tensor(22)
print(x.item()) # 22

# 多元素张量不能用 item()
x = torch.randint(0, 4, (3, 2))
# print(x.item()) # ❌ 报错!

3.3 类型转换方法

data = torch.full((3, 2), 10)
print(data.dtype) # torch.int64

# 方式 1:type() 方法
data = data.type(torch.float64)

# 方式 2:简洁方法(推荐 ⭐⭐⭐)
data = data.double() # float64
data = data.float() # float32
data = data.int() # int32
data = data.long() # int64
data = data.short() # int16


四、张量基础总结

操作方法说明
从数据创建 torch.tensor(data) 最常用
按形状创建 torch.Tensor(m, n) 随机初始化
指定类型创建 torch.FloatTensor() 等 明确数据类型
线性序列 torch.arange() / linspace() 等差数列
随机张量 torch.randn() / randint() 正态/均匀分布
全值张量 torch.zeros() / ones() / full() 0/1/指定值
转 NumPy .numpy() 共享内存
从 NumPy 转 torch.from_numpy() / torch.tensor() 后者不共享
类型转换 .float() / .double() / .int() 简洁推荐
取标量值 .item() 仅单元素可用

五、下一篇预告

PyTorch 深度学习笔记(四):张量运算与变形——数值计算与索引进阶

将详细介绍张量的点乘、矩阵乘法、统计函数、索引操作(布尔索引、多维索引),以及 reshape、transpose、view 等形状变换操作。


如果这篇文章对你有帮助,欢迎点赞、收藏、关注!你的支持是我持续创作的动力。

赞(0)
未经允许不得转载:网硕互联帮助中心 » PyTorch 深度学习笔记(三)PyTorch 张量基础——从零开始掌握 Tensor
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!