我将28×28像素的MNIST图像转换成了张量,代码如下:
dataset = MNIST(root='data/', train=True, transform=transforms.ToTensor())
当我运行以下代码时:
img_tensor, label = dataset[0]
print(img_tensor.shape, label)
输出显示形状为torch.Size([1, 28, 28])
。为什么是1x28x28的形状?第一个维度代表什么?与28×28相比,1x28x28有什么意义?
回答:
作为矩阵的图像通常有三个维度:通道、宽度和高度。当然,28
和28
分别是宽度和高度。在这种情况下,1
代表通道。那么什么是通道呢?每个像素由三种颜色表示:红色、蓝色和绿色。每种颜色对应一个颜色通道,因此通常有3个通道(RGB)。这使得图像的维度为(3, W, H)。那么为什么这里是1呢?因为MNIST图像是黑白的,因此不需要三种不同的颜色通道来表示最终颜色,一个通道就足够了,所以对于黑白图像,维度是(1, W, H)。下面有一张图片来可视化这些维度:
来源:https://commons.wikimedia.org/wiki/File:RGB_channels_separation.png
所以你看,对于黑白图像,你只需要一个通道。通常你可以忽略这个1维度,但PyTorch要求有通道维度。