Skip to content

使用 Tensor 张量表示数据

类型数学名称维度举例
标量Scalar0D3.14、-5
向量Vector1D[1, 2, 3]
矩阵Matrix2D[[1, 2], [3, 4]]
高阶张量Tensor3D+图像、视频、时间序列等

PyTorch 张量操作速查表

操作函数功能描述示例(代码)输出维度(示意)
unsqueeze(dim)增加一个维度x = torch.randn(28, 28); x.unsqueeze(0)(1, 28, 28)
squeeze(dim)删除为 1 的维度x = torch.randn(1, 28, 28, 1); x.squeeze()(28, 28)
reshape(*shape)改变形状(自动计算维度)x.reshape(60, -1)如:(60, 12288)
view(*shape)和 reshape 类似,更底层x.view(32, -1)(32, ?), 不推荐动态使用
permute(dims)调整维度顺序x.permute(0, 3, 1, 2)(B, C, H, W)
transpose(a, b)交换两个维度x.transpose(1, 2)(B, W, H)
repeat(*sizes)扩展复制数据(复制张量)x.repeat(10, 1, 1, 1)(10, 28, 28, 1)
expand(*sizes)扩展视图(共享内存,不复制数据)x.expand(10, -1, -1, -1)(10, 28, 28, 1)
flatten()拉平成一维或指定维度范围x.flatten(start_dim=1)如:(B, C×H×W)
stack(tensors)按新维度堆叠张量torch.stack([x1, x2, x3], dim=0)(3, H, W)
cat(tensors)沿现有维度拼接torch.cat([x1, x2], dim=0)(B1+B2, H, W)
split(sz, dim)切分张量torch.split(x, 5, dim=0)[张量1, 张量2, ...]
chunk(N, dim)均等切分张量(按份分)torch.chunk(x, 4, dim=1)[张量1, 张量2, 张量3, 张量4]

PyTorch 张量操作全功能对照表(实战 + 函数分类篇)

分类操作符 / 函数功能简述示例 & 说明
🎯 基本构造torch.arange(h).type(dtype)构建一维整数序列,并指定类型torch.arange(10).type(torch.float32) 生成 [0. 1. 2. ... 9.]
torch.zeros(shape) / torch.ones(shape)构建全 0 / 全 1 的张量,常用于初始化torch.zeros((2, batch_size, 128))
torch.from_numpy(ndarray)从 NumPy 数组转换为 Torch 张量(共享内存)torch.from_numpy(np_array)
x.new_zeros(shape)用已有张量的 dtype / device 创建新张量x.new_zeros((3, 128))
🧩 张量结构变换reshape() / view() / flatten()改变形状或拉平x.view(B, -1)
squeeze() / unsqueeze()添加或删除维度x.unsqueeze(1)
permute() / transpose()改变维度顺序,常用于图像 / 音频处理x.permute(0, 2, 1)
stack() / cat() / dstack()合并张量:stack = 新维度;cat = 沿原维;dstack = 沿 depth 维堆叠torch.dstack([a, b]) → (B, H, W*2)
split() / chunk()拆分张量torch.chunk(x, 4, dim=1)
🔧 数学操作torch.matmul(a, b)矩阵乘法(自动广播)a.matmul(b) 类似 numpy 的 dot
torch.sin(x) / torch.cos(x)对张量每个元素做 sin / cos 操作torch.sin(t * 2 * pi)
torch.sqrt(x) / pow(x, 0.5)平方根 / 幂操作x.pow(0.5)
torch.exp(x) / log(x)指数 / 对数-
torch.abs(x)取绝对值-
🎵 信号处理torch.stft(...)短时傅里叶变换(语音 / 音频常用)torch.stft(x, n_fft, hop, win)
torch.hann_window(N)汉宁窗函数(用于窗口加权)torch.hann_window(512).pow(0.5)
return_complex=False控制 STFT 是否返回复数张量设置为 False 得到 (real, imag)
🧠 类型控制x.float() / x.int()改变数据类型x.float()
.to(dtype=torch.float32, device=...)精准设置数据类型与设备(CPU / CUDA)x.to(dtype=torch.float32)
.cpu() / .cuda()转移张量设备-

场景举例:骚操作集合展示

1、图像处理前准备(如 MNIST)

python
img = torch.randn(28, 28)  # 灰度图
img = img.unsqueeze(0).unsqueeze(0)  # → (1, 1, 28, 28)

2、模拟时序张量 → STFT(语音模型)

python
x = torch.randn(20480)  # 约1秒音频
x = torch.stft(x, 512, 256, 512, window=torch.hann_window(512).pow(0.5), return_complex=False)
x = x[None]  # 增加 batch 维度,变成 (1, Freq, Time, 2)

3、股票/天气数据批量初始化

python
x = torch.zeros((2, batch_size, 128)).float()  # 两组特征,批次数据,维度128

4、创建时间采样信号 + 三角波

python
t = torch.arange(0, 1000).float() / 1000  # 时间轴
wave = torch.sin(2 * math.pi * 440 * t)  # 440Hz 正弦波

常见 CNN 输入格式转换

原始维度格式目标格式用法
(28, 28)(1, 28, 28, 1)x.unsqueeze(0).unsqueeze(-1)
(B, H, W, C)(B, C, H, W)x.permute(0, 3, 1, 2)
(B, C, H, W)(B, -1)x.reshape(B, -1) or x.flatten(1)

实战场景速记

  • 图像加载 → unsqueeze + permute
  • 视频序列 → reshape + flatten
  • 时间序列 → permute + squeeze
  • CNN 输出展平 → flatten(1)
  • 多样本合并 → cat
  • 数据扩增 → repeat

灰度图像

  • 如 MNIST
  • 原始是二维的,形状为 (height, width),CNN 要求输入是三维的,所以需 reshape 成 (height, width, 1)
  • 类比:就像黑白照片只有“亮度”一个通道,但你得打包成一个通道才能送给 CNN,不然模型看不懂
py
(28, 28) → (28, 28, 1)

彩色图像

  • 如 CIFAR-10
  • 三维的 (height, width, channels),一般是 3 个通道:RGB
  • 类比:彩色图像天生带着“红绿蓝”三把刷子
py
(32, 32, 3)  # 代表一个 RGB 彩色图像

视频数据

  • 视频 = 多帧图像序列,所以是四维张量:(num_frames, height, width, channels)
  • 类比:视频是一本“动态相册”,每一帧都是一张图,模型就像翻书一样看过去
py
(60, 64, 64, 3)  # 60帧的视频,每帧 64x64 的彩色图像

天气预报数据

假设我们要预测接下来几天的温度、湿度、风速:

  • 数据结构为多种变量(features),随时间变化的序列
  • 三维张量表示:(batch_size, time_steps, features)
  • 类比:每一行都是一条天气记录,模型就像在看多地同时的气象日记
python
(128, 7, 3)  # 128 个城市,过去 7 天,每天3个指标(温度、湿度、风速)

股票数据

结构类似天气预报,用于时间序列预测:

  • 通常是按时间排列的开盘价、收盘价、成交量等多指标组合
  • 形状也是:(batch_size, time_steps, features)
  • 类比:模型就像盯着每支股票的 K 线图,试图从过去看未来
python
(64, 30, 5)  # 64 只股票,过去 30 天,5 个指标

声音数据

  • mels
  • TTS Cosy Spark 海螺 火山