Appearance
使用 Tensor 张量表示数据
| 类型 | 数学名称 | 维度 | 举例 |
|---|---|---|---|
| 标量 | Scalar | 0D | 3.14、-5 |
| 向量 | Vector | 1D | [1, 2, 3] |
| 矩阵 | Matrix | 2D | [[1, 2], [3, 4]] |
| 高阶张量 | Tensor | 3D+ | 图像、视频、时间序列等 |
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() # 两组特征,批次数据,维度1284、创建时间采样信号 + 三角波
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 海螺 火山