计算torch张量数组的平均值和标准差

2024-03-29 02:15:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算火炬张量数组的均值和标准差。我的数据集有720个训练图像,每个图像都有4个地标,X和Y代表图像上的2D点

to_tensor = transforms.ToTensor()

landmarks_arr = []

for i in range(len(train_dataset)):
    landmarks_arr.append(to_tensor(train_dataset[i]['landmarks']))
                     
mean = torch.mean(torch.stack(landmarks_arr, dim=0))#, dim=(0, 2, 3))
std = torch.std(torch.stack(landmarks_arr, dim=0)) #, dim=(0, 2, 3))



print(mean.shape)
print("mean is {} and std is {}".format(mean, std))

结果:

torch.Size([])
mean is nan and std is nan

上面有几个问题:

  1. 为什么to_张量不转换0和1之间的值
  2. 如何正确计算均值
  3. 我应该除以255,在哪里

我有:

len(landmarks_arr)
    
720

landmarks_arr[0].shape

torch.Size([1, 4, 2])

landmarks_arr[0]

tensor([[[502.2869, 240.4949],
         [688.0000, 293.0000],
         [346.0000, 317.0000],
         [560.8283, 322.6830]]], dtype=torch.float64)

Tags: to图像lenisstacktraintorchmean
1条回答
网友
1楼 · 发布于 2024-03-29 02:15:57
  1. 从ToTensor()的pytorch文档:

Converts a PIL Image or numpy.ndarray (H x W x C) in the range [0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0] if the PIL Image belongs to one of the modes (L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1) or if the numpy.ndarray has dtype = np.uint8

In the other cases, tensors are returned without scaling.

因为您的地标值不是PIL图像,并且不在[0255]之内,所以不应用缩放

  1. 你的计算似乎是正确的。看起来,您的数据中可能有一些NaN值

你可以试试类似的东西

for i in range(len(train_dataset)):
    landmarks = to_tensor(train_dataset[i]['landmarks'])
    landmarks[landmarks != landmarks] = 0  # this will set all nan to zero
    landmarks_arr.append(landmarks)

在你的循环中。或在循环中断言nan以查找罪魁祸首:

for i in range(len(train_dataset)):
    landmarks = to_tensor(train_dataset[i]['landmarks'])
    assert(not torch.isnan(landmarks).any()), f'nan encountered in sample {i}'  # will trigger if a landmark contains nan
    landmarks_arr.append(landmarks)
  1. 不,见第1节)。如果愿意,您可以除以地标的最大坐标,将它们约束为[0,1]

enter image description here

相关问题 更多 >