gpt4 book ai didi

python - 将图像转换为范围为 [0,255] 而不是 [0,1] 的张量?

转载 作者:行者123 更新时间:2023-12-05 04:55:15 25 4
gpt4 key购买 nike

我正在尝试使用 transforms.compose 将我的图像转换为范围为 [0,255] 的规范化图像,而不是将其规范化为 [0,1] 以训练我的模型。我如何让我的代码做到这一点。目前它规范化来自 [0,1] 的图像。我如何将它乘以 255 使其变为 0-255 还是不是那么简单?

def build_model(self):
""" DataLoader """
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.Resize((self.img_size + 30, self.img_size+30)),
transforms.RandomCrop(self.img_size),
transforms.ToTensor(),
transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])
test_transform = transforms.Compose([
transforms.Resize((self.img_size, self.img_size)),
transforms.ToTensor(),
transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])

最佳答案

理想情况下,您可以标准化 [0, 1] 之间的值然后通过计算 mean标准化std整个训练集并将其应用于所有数据集(训练、验证和测试集)。

下面本质上是一个x in [x_min, x_max] -> x' in [0, 1]映射:

x_min, x_max = x.min(), x.max()
x = (x - x_min) / (x_max-x_min)

然后标准化,例如使用 z 分数,这使得 mean(x')=0std(x')=1 :

mean, std = x.mean(), x.std()
x = (x - mean) / std

回到你的问题, torchvision.transforms.Normalize 被描述为:

output[channel] = (input[channel] - mean[channel]) / std[channel]

如果你划分你的 std 255 作为参数,然后您将结束乘以 255 输出。

这是一个形状为 (b=1, c=3, h=1, w=3) 的例子:

> x = torch.tensor([[[[0.2, 0.3, 0.6]], [[0.1, 0.4, 0.2]], [[0.1, 0.8, 0.6]]]])

> mean, std = x.mean(), x.std()
tensor(0.3667), tensor(0.2500)

> t = T.Normalize(mean=mean, std=std/255)

> t(x).mean(), t(x).std()
tensor(~0), tensor(255.)

但是,如果您只想在 torchvision.transforms.Compose 中将数据乘以 255你可以做的管道:

T.Compose([
# other transforms
T.ToTensor(),
T.Normalize(mean=(0,)*3, std=(255,)*3)
])

或者只用一个 lambda:

T.Compose([
# other transforms
T.ToTensor(),
lambda x: x*255
])

已导入 torchvision.transforms作为T .

关于python - 将图像转换为范围为 [0,255] 而不是 [0,1] 的张量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65469814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com