张量小记
张量是在数学、物理、计算机等领域的一个重要的学术名词,看起来很高大上(实际有时候也雀食酱紫),在这里煮啵简要通俗的说说这玩意是个啥,补药一听到张量就想起麻辣烫了大馋猫(虽然煮啵曾经也是)。
通俗易懂的张量(Tensor)讲解
1. 什么是张量?
说人话:张量(Tensor)是一种 “多维数据表”,可以用来存储和处理多维信息。
标量、向量、矩阵与张量的关系
维度 | 名称 | 示例 | 直观理解 |
---|---|---|---|
0 维 | 标量(Scalar) | 3.14 3.14 3.14, 42 42 42 | 一个普通的数 |
1 维 | 向量(Vector) | [ 1 , 2 , 3 ] [1, 2, 3] [1,2,3] | 一行数,类似一个箭头 |
2 维 | 矩阵(Matrix) | [ 1 2 3 4 ] \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} [1324] | 一个表格,像 Excel 数据表 |
3 维 | 3 阶张量 | 彩色图像( 28 × 28 × 3 28\times28\times3 28×28×3) | 一本书,每一页是一个矩阵 |
4 维 | 4 阶张量 | 视频( 100 × 28 × 28 × 3 100\times28\times28\times3 100×28×28×3) | 一部电影,每一帧是一个 3 维数据 |
2. 现实中的张量
张量在现实世界无处不在:
- 灰度图片(2 阶张量):黑白图片是一个 28 × 28 28 \times 28 28×28 的矩阵。
- 彩色图片(3 阶张量):一张你的英俊潇洒的自拍 1960 × 1280 1960\times1280 1960×1280 的彩色图片有 R、G、B 三个颜色通道,因此是 28 × 28 × 3 28 \times 28 \times 3 28×28×3 的数据。
- 视频(4 阶张量):如果小电影有 100 帧,每一帧是一个彩色图片,那整个视频是一个 100 × 1920 × 1280 × 3 100 \times 1920 \times 1280 \times 3 100×1920×1280×3 的数据。
简单来说,张量就是更高维的数据表!
3. 张量的坐标变换
张量的一个重要特点是:无论坐标系怎么变,它的本质不变。举个例子:
- 标量(如温度):无论在哪个国家, 3 0 ∘ C 30^{\circ}C 30∘C 还是 3 0 ∘ C 30^{\circ}C 30∘C。
- 向量(如风速):风速 5 m/s 5 \text{m/s} 5m/s 向东,如果换个坐标系,它的 x x x、 y y y 分量会变,但风速本身不变。
- 矩阵(如应力):比如房子受到的压力,在不同角度看可能不同,但压力本身是不变的。
这就是张量的变换规则,确保它可以在不同坐标系下正确描述物理现象。
4. 张量的计算
(1) 张量加法
如果两个张量的形状相同,比如:
A = [ 1 2 3 4 ] , B = [ 5 6 7 8 ] A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} A=[1324],B=[5768]
那么:
A + B = [ 1 + 5 2 + 6 3 + 7 4 + 8 ] = [ 6 8 10 12 ] A + B = \begin{bmatrix} 1+5 & 2+6 \\ 3+7 & 4+8 \end{bmatrix} = \begin{bmatrix} 6 & 8 \\ 10 & 12 \end{bmatrix} A+B=[1+53+72+64+8]=[610812]
(2) 张量乘法
如果是矩阵乘法:
A × B = 矩阵相乘 A \times B = \text{矩阵相乘} A×B=矩阵相乘
如果是更高阶张量,就会用更复杂的计算方式,比如 张量积(Tensor Product)。
5. 张量的应用
(1) 物理学(广义相对论)
爱因斯坦的广义相对论用张量描述引力:
R μ ν − 1 2 g μ ν R + Λ g μ ν = 8 π G c 4 T μ ν R_{\mu\nu} - \frac{1}{2} g_{\mu\nu} R + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4} T_{\mu\nu} Rμν−21gμνR+Λgμν=c48πGTμν
这里的 $ g_{\mu\nu} $ 就是度量张量,它决定了空间的形状。
(2) 机器学习
在 深度学习(如 TensorFlow、PyTorch)中,所有数据(图片、音频、文本)都存储成张量。例如:
- 一张图片是一个 3 维张量。
- 一个批次(Batch)图片是一个 4 维张量。
(3)在计算机视觉中的应用 (煮啵夹带私活嘿嘿)
张量(Tensor)在**计算机视觉(Computer Vision, CV)**中至关重要,因为几乎所有的视觉数据都可以用张量表示和处理。下面是张量在计算机视觉中的主要应用,以及相关的详细讲解。
1. 计算机视觉中的张量表示
在计算机视觉任务中,图片、视频等数据都可以表示为张量。例如:
(1) 图片(Image)
一张灰度图片可以用 二维张量(矩阵) 表示:
- 假设有一张 28 × 28 28 \times 28 28×28 的黑白图片,每个像素点存储一个灰度值( 0 ∼ 255 0 \sim 255 0∼255)。
- 这就是一个 ( H , W ) (H, W) (H,W) 形状的 2D 张量,即 28 × 28 28 \times 28 28×28 的矩阵。
一张彩色图片是一个 三维张量:
- 彩色图片有 RGB 通道(红、绿、蓝),每个通道都是一个 H × W H \times W H×W 的矩阵。
- 这构成了一个 ( H , W , C ) (H, W, C) (H,W,C) 形状的 3D 张量,例如 28 × 28 × 3 28 \times 28 \times 3 28×28×3。
(2) 视频(Video)
视频是由**多张图片(帧)**组成的,所以它是一个 四维张量:
( N , H , W , C ) (N, H, W, C) (N,H,W,C)
其中:- N N N 表示帧数(Frame number)。
- H , W H, W H,W 是图片高度和宽度。
- C C C 是通道数(RGB = 3)。
例如,一个 60 60 60 帧的视频,分辨率 1920 × 1080 1920 \times 1080 1920×1080,RGB 通道,就可以用:
( 60 , 1080 , 1920 , 3 ) (60, 1080, 1920, 3) (60,1080,1920,3)
的 4D 张量来表示。
(3) 批量处理(Batch Processing)
在深度学习中,我们通常一次处理多个样本,例如:
- 一个批次(Batch)有 32 32 32 张图片,每张是 28 × 28 × 3 28 \times 28 \times 3 28×28×3,则数据是:
( B , H , W , C ) = ( 32 , 28 , 28 , 3 ) (B, H, W, C) = (32, 28, 28, 3) (B,H,W,C)=(32,28,28,3)
这就是 5 维张量(5D Tensor),用于批量训练神经网络。
2. 张量在计算机视觉任务中的应用
(1) 图像分类(Image Classification)
任务:给定一张图片,判断其类别,比如 猫 / 狗 分类。
- 输入: ( H , W , C ) (H, W, C) (H,W,C) 形状的张量(如 224 × 224 × 3 224 \times 224 \times 3 224×224×3)。
- 模型(CNN): 使用卷积神经网络(CNN)处理。
- 输出: 一个类别概率向量(如 [ 0.9 , 0.1 ] [0.9, 0.1] [0.9,0.1] 代表 90% 是猫,10% 是狗)。
示例网络:
输入 → CNN 层 → 全连接层 → Softmax 输出 \text{输入} \rightarrow \text{CNN 层} \rightarrow \text{全连接层} \rightarrow \text{Softmax 输出} 输入→CNN 层→全连接层→Softmax 输出
- CNN 提取特征,如边缘、纹理、形状等。
- 最终输出一个 张量,代表每个类别的概率。
(2) 目标检测(Object Detection)
任务:检测图片中的多个目标,输出它们的位置和类别。
- 输入: ( H , W , C ) (H, W, C) (H,W,C) 形状的张量(如 416 × 416 × 3 416 \times 416 \times 3 416×416×3)。
- 模型: 使用 YOLO / Faster R-CNN 等目标检测网络。
- 输出: 一个 多维张量,表示多个目标的类别和边界框。
示例输出:
( N , 5 ) = ( 3 , [ x , y , w , h , c l a s s ] ) (N, 5) = (3, [x, y, w, h, class]) (N,5)=(3,[x,y,w,h,class])
- 这里的 N N N 是检测到的目标数(比如 3 个)。
- 每个目标由 5 个数值表示:
- x , y , w , h x, y, w, h x,y,w,h 表示目标框的位置(中心点坐标 + 宽高)。
- c l a s s class class 表示类别(如 1 = 狗,2 = 猫)。
(3) 语义分割(Semantic Segmentation)
任务:给图片的每个像素分类,比如区分“人”和“背景”。
- 输入: ( H , W , C ) (H, W, C) (H,W,C) 形状的图片张量。
- 模型: U-Net、DeepLabV3+ 等语义分割网络。
- 输出: ( H , W , K ) (H, W, K) (H,W,K) 形状的张量,其中 K K K 是类别数。
示例:
- 对于 512 × 512 512 \times 512 512×512 的图片,输出是 ( 512 , 512 , 2 ) (512, 512, 2) (512,512,2),每个像素都有两个数值,分别表示“前景”和“背景”的概率。
(4) 实例分割(Instance Segmentation)
任务:不仅要分割出物体,还要区分不同个体,比如图中有 3 只狗,要给它们不同编号。
- 输入: ( H , W , C ) (H, W, C) (H,W,C) 的图片张量。
- 输出: ( H , W , N ) (H, W, N) (H,W,N),其中 N N N 是检测到的实例个数。
Mask R-CNN 是一个典型的实例分割模型,它的输出是一个 多通道张量:
- 一个通道是目标类别。
- 另一个通道是目标的边界框坐标。
- 还有一个通道是掩码(Mask),表示像素级区域。
(5) 生成对抗网络(GANs)
任务:用深度学习生成新图像,比如生成逼真的人脸。
- 输入: 一个随机向量张量(如 [ 100 ] [100] [100])。
- 生成器(Generator): 把 1D 张量转换成 3D 图片张量。
- 输出: ( H , W , C ) (H, W, C) (H,W,C) 形状的张量,表示合成图像。
GANs 结构:
随机噪声 → G ( z ) → 生成假图片 → D ( x ) → 判别真假 \text{随机噪声} \rightarrow G(z) \rightarrow \text{生成假图片} \rightarrow D(x) \rightarrow \text{判别真假} 随机噪声→G(z)→生成假图片→D(x)→判别真假
- 生成器 G 生成图片张量。
- 判别器 D 评估真假。
3. 计算机视觉中张量的操作
在 PyTorch / TensorFlow 里,我们常用以下操作:
转换形状(Reshape)
x = torch.randn(1, 3, 224, 224) # (Batch, Channel, Height, Width) x = x.view(3, 224, 224) # 去掉 batch 维度
2.张量归一化(Normalization)
x = x / 255.0 # 将像素值缩放到 [0, 1]
3.维度变换(Permute / Transpose)
x = x.permute(2, 0, 1) # 从 (H, W, C) 变为 (C, H, W)
4.卷积运算(Convolution)
pythonCopyEditconv = torch.nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
output = conv(x) # 经过 3x3 卷积,得到新的张量
6. 总结
- 张量是一种“多维数组”,可以是 0 维(标量)、1 维(向量)、2 维(矩阵)或更高维。
- 张量的核心是“坐标无关”,无论你换什么坐标系,它的数学性质都不变。
- 张量在现实世界中无处不在,在物理学、计算机科学、深度学习等领域都非常重要。