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)))
答案 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.mean
和torch.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,然后将mean
和std
计算为
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)))