查找一堆火炬张量的均值和标准差(从ndarray图像转换而来)

时间:2020-10-15 05:10:21

标签: python numpy pytorch mean numpy-ndarray

to_tensor = transforms.ToTensor()
img = to_tensor(train_dataset[0]['image'])
img

将我的图像值转换为期望的0到1之间。还将img的{​​{1}}转换为ndarray

以前,在不使用torch.Tensor的情况下(我现在需要它),以下代码段有效(不确定这是否是查找火车集合的均值和stds的最佳方法,但是现在不起作用。如何使它工作?

to_tensor

错误是:

image_arr = []

for i in range(len(train_dataset)):
    image_arr.append(to_tensor(train_dataset[i]['image']))

print(np.mean(image_arr, axis=(0, 1, 2)))
print(np.std(image_arr, axis=(0, 1, 2)))

2 个答案:

答案 0 :(得分:2)

这是一个可行的示例:

import torch
from torchvision import transforms
train_dataset = torch.rand(100, 32, 32, 3)
image_arr = []
to_tensor = transforms.ToTensor()

for i in range(len(train_dataset)):
    # to tensor will give you a tensor which is emulated here by reading the tensor at i
    image_arr.append(train_dataset[i])

print(torch.mean(torch.stack(image_arr, dim=0), dim=(0, 1, 2)))
print(torch.std(torch.stack(image_arr, dim=0), dim=(0, 1, 2)))

我做了什么?

我使用torch.stack将图像阵列连接到单个火炬张量中,并使用torch.meantorch.std计算统计量。为了评估统计信息,我不建议转换回numpy,因为它可能导致从GPU到CPU的不必要转换。

有关渠道的维度的详细信息: 上面的示例假设最后一个尺寸是通道,图像是32x32x3,批处理大小为100。使用PIL(枕头)或numpy加载图像时通常是这种情况。在这种情况下,图像将作为HWC(高宽通道)加载。这似乎也是看代码示例所问问题的维度。

如果图像张量是CHW格式,则应使用

print(torch.mean(torch.stack(image_arr, dim=0), dim=(0, 2, 3)))
print(torch.std(torch.stack(image_arr, dim=0), dim=(0, 2, 3)))

火炬张量通常是CHW格式,因为Conv图层期望CHW格式。当toTensor变换应用于图像(PIL图像)时,将自动完成此操作。有关完整的规则,请参见toTensor here的文档。

答案 1 :(得分:0)

您正在尝试使用numpy计算张量的平均值吗?

您需要将数据转换为NumPy,然后将meanstd计算为

image_arr = []
for i in range(len(train_dataset)):
       image_arr.append((to_tensor(train_dataset[i]['image'])).cpu().detach().numpy())

print(np.mean(image_arr, axis=(0, 1, 2)))
print(np.std(image_arr, axis=(0, 1, 2)))