【问题标题】:calculating the mean and std on an array of torch tensors计算火炬张量数组的均值和标准差
【发布时间】:2021-01-29 14:47:05
【问题描述】:

我正在尝试计算一系列火炬张量的均值和标准值。我的数据集有 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_tensor 不转换 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)

【问题讨论】:

    标签: python numpy deep-learning pytorch torch


    【解决方案1】:
    1. 来自 ToTensor() 的 pytorch 文档:

    将 [0, 255] 范围内的 PIL 图像或 numpy.ndarray (H x W x C) 转换为 如果 PIL Image 属于一种模式(L、LA、P、I、F、RGB、YCbCr、RGBA、CMYK、1),或者如果 numpy.ndarray 有 dtype = np.uint8

    在其他情况下,张量返回时不进行缩放。

    由于您的 Landmark 值不是 PIL 图像,并且不在 [0, 255] 范围内,因此不会应用缩放。

    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]。

    【讨论】:

    • 如果 to_tensor 已经将它们放在 [0, 1] 之间,我为什么要除以最大坐标?
    • 因为 toTensorPIL 图像 放在 [0,1] 之间。您的目标/地标将不受影响。所以如果你想将你的地标归一化为[0,1],你可以除以最大坐标。
    • ------------------------------------------ --------------------------------- AssertionError Traceback(最近一次调用最后一次) 7 for i in range(len(train_dataset)): 8 landmarks = to_tensor(train_dataset[i]['landmarks']) ----> 9 assert(not torch.isnan(landmarks).any() ), f'nan meet in sample {i}' # 如果地标包含 nan 将触发 10 landmarks_arr.append(landmarks) 11 AssertionError: nan meet in sample 56
    • 计算整个数组的最大值肯定会更有效,而不是遍历各个条目。
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多