(1)什么是reshape
reshape 就是“重新排队”。
你可以想象:你有一排小朋友,他们排成一行,现在老师说:
“重新站队,我们现在要每两个人一组,一共几组。”
这就是 reshape —— 换一种排队的方式,人(数据)没变,只是队形变了。
举个超简单的例子:
有6个数字:
[1, 2, 3, 4, 5, 6]
这是一个一行六列的排法(形状叫(1,6))
我们现在想把它改成二行三列:
import torch
x = torch.tensor([1, 2, 3, 4, 5, 6])
y = torch.reshape(x, (2, 3))
print(y)
输出:
tensor([[1, 2, 3],
[4, 5, 6]])
(2)reshape的特点
要记住的重点 | 意思 |
---|
数据不变 | reshape 不会动数据,只是换形状 |
总个数不变 | 比如有 6 个数,那 reshape 后也要是 6 个数 |
支持自动计算 | 用 -1 表示“这个我不算,让电脑帮我算” |
自动计算示例(用-1):
x = torch.tensor([1, 2, 3, 4, 5, 6])
y = torch.reshape(x, (-1, 2))
print(y)
我们只告诉它每组2个数,电脑自动算出组数是3:
tensor([[1, 2],
[3, 4],
[5, 6]])
(3)reshape和图像有关吗
是的!比如一张图片是:
-
3 个颜色通道(RGB)
-
每个通道大小是 32x32(像素)
图片的形状就是 (3, 32, 32)
,但有时候模型要你把它“展平”成一排用 —— reshape 就派上用场啦!
首先,需要了解图像是怎么存在电脑里的:
举个最常见的彩色图片例子:
-
一张彩色图像其实由 3 个颜色通道组成:红(R)、绿(G)、蓝(B)
-
每个通道是一张黑白图片(只表示某种颜色强度)
-
每个通道的大小可能是 32 × 32(比如 CIFAR10)
那么这张图片再PyTorch中的形状就是:
(3, 32, 32) # 意思是:3 个通道,每个通道 32 高 × 32 宽
这就叫做图像的“张量形状”(Tensor shape)
其次,为什么要reshape图像:
有时候我们训练的模型,比如线性层(nn.Linear
),只接受一维向量,不认得三维的图像形状。
所以我们就需要先把图像从这种:
(3, 32, 32) → 3 × 32 × 32 = 3072 个数
变成一维的:
(3072,) 或 (1, 3072)
这个时候就用到reshape了
举例说明:
import torch
# 假设这是一个 3x32x32 的图像
img = torch.rand(3, 32, 32)
# reshape 成一维向量
img_flat = img.reshape(-1) # 变成 (3072,)
print(img_flat.shape)
最后,一句话总结就是:图像在深度学习中,其实就是一个“多维数组”,reshape 就是用来调整这个数组的形状,方便模型处理。
(4)总结
-
reshape
是“换形状”,就像重新排队一样 -
不会动里面的数据
-
总人数不能变(元素个数要一样)
-
可以用
-1
让电脑自动算一个维度