1. 不同的维度表示
图像的维度表示(H , W , C):
对于一张彩色图像,通常有三个通道(红、绿、蓝),每个通道都是一个二维矩阵。假设图像的高度为 H,宽度为 W,那么图像的维度表示为 (H, W, 3)。这里的 3 表示三个通道。
对于灰度图像,只有一个通道,其维度表示为 (H, W)。
PyTorch Tensor 的维度表示(batchSize , C , H , W ):
PyTorch Tensor 的维度表示通常是 (batch_size, channels, height, width),其中:
batch_size 表示一个批次中包含的样本数。
channels 表示图像的通道数,与图像的颜色通道数相对应。
height 表示图像的高度。
width 表示图像的宽度。
因此,一张彩色图像在 PyTorch Tensor 中的维度表示为 (1, 3, H, W),其中 1 表示批次大小为 1。一张灰度图像在 PyTorch Tensor 中的维度表示为 (1, 1, H, W)。
在处理图像时,这样的维度表示是为了与深度学习模型的输入格式相匹配。深度学习模型通常期望一批数据,即使只有一张图像,也需要在批次维度上进行表示。
unsqueeze 和 squeeze的用法
squeeze 单词的意思是 挤压、压缩。
unsqueeze
是 PyTorch 中的一个操作,用于在指定的维度上插入新的维度。这个操作在张量的形状中插入一个大小为 1 的新维度。详细解释一下 unsqueeze 的用法和作用:
new_tensor = original_tensor.unsqueeze(dim)
参数 dim: 要插入新维度的位置(维度索引,下标从0开始)。
例如,对于一个三维张量 tensor,形状为 (A, B, C),如果我们使用 tensor.unsqueeze(0),那么将在第 0 维(最前面)插入一个新的维度,形状变为 (1, A, B, C)。
squeeze
是 PyTorch 中的一个操作,用于去除张量中大小为 1 的维度。它的作用是在张量的形状中去除不必要的、大小为 1 的维度。详细解释一下 squeeze 的用法和作用:
new_tensor = original_tensor.squeeze(dim)
参数 dim (可选): 要去除的维度索引。如果指定了 dim,那么只会去除指定位置的大小为 1 的维度。如果不指定,则会将所有维度大小为1的维度去除掉。
例如,对于一个四维张量 tensor,形状为 (1, A, 1, B),如果我们使用 tensor.squeeze(),那么将去除所有大小为 1 的维度,形状变为 (A,B)。
如果我们使用 tensor.squeeze(2),那么只会去除第 2 维(从 0 开始计数)上的大小为 1 的维度,形状变为(1,A,B)
2. transforms.ToTensor()
transforms.ToTensor() 操作将图像的像素值转换为 PyTorch 的 Tensor 格式,并自动进行了归一化,使得像素值范围在 0 到 1 之间。具体来说,它会将图像中每个像素的整数值除以 255,将像素值缩放到 0 到 1 之间。
例如,对于一个像素值为 127 的灰度图像,经过 transforms.ToTensor() 后,其对应的值将变为 127/255 = 0.498。这个操作是为了将像素值标准化到一个更小的范围,有助于训练深度学习模型时的稳定性和收敛速度。
总之,transforms.ToTensor() 会将图像中的所有像素值缩放到 0 到 1 之间。
3.torch.argmax()
argmax函数
:torch.argmax(input, dim=None, keepdim=False)返回指定维度最大值的序号,dim给定的定义是:the demention to reduce.也就是把dim这个维度的,变成这个维度的最大值的index。
参考bolg:torch.argmax函数学习
通常,使用torch.argmax()
得到的是一个类别索引。因为他直接读取出了最大值,通常最大值表示最大概率。
具体应用参考:关于torch.argmax()的在深度学习中应用的理解
类别索引
表示模型对每个像素点的预测结果所属的类别。在语义分割任务中,每个像素点被分配一个类别,这个类别索引通常对应于模型所学习的类别标签。
例如:分类任务中的预测类别获取
torch.argmax() 在深度学习中经常用于获取张量沿指定维度上最大值的索引。这在分类任务、生成类别预测或评估模型输出时经常使用。下面是一些例子:
- 分类任务中的预测类别获取
假设有一个模型输出的概率分布张量,形状为 (batch_size, num_classes),其中 num_classes 是类别的数量。我们可以使用 torch.argmax() 获取每个样本预测的类别:
import torch# 模拟模型输出的概率分布
output_probs = torch.tensor([[0.1, 0.6, 0.3],[0.1, 0.2, 0.7]])# 获取每个样本预测的类别索引
predicted_classes = torch.argmax(output_probs, dim=1)print(predicted_classes)
这里 dim=1 表示沿着第二个维度(类别维度)获取最大值的索引。输出将是一个包含每个样本预测类别索引的张量。
输出为:tensor([1, 2])
并且,torch.argmax()
中得到的数组的取值范围是和dim维度上的值有关。例如,此处dim=1的维度即为列的维度,列维度上共3列,故最终的tensor取值是0,1,2。或者 torch.Size([1, 21, 500, 928]),的dim=1维度上的大小是21,故最终得到的tensor取值是0-20的范围。
理解:这里得到的概率分布为[0.1, 0.6, 0.3], [0.5, 0.2, 0.3]
,对于第一个数组概率最大的是0.6,其索引为1。对于第二个数组概率最大的是0.5,索引为0。所以按照dim=1,得到的输出为:tensor([1, 0])
。
接下来,你可以使用这些预测的类别索引进行一些后续操作,比如:
class_labels = ["Class A", "Class B", "Class C"]predicted_labels = [class_labels[idx] for idx in predicted_classes]
print(predicted_labels)
输出为:['Class B', 'Class C']