PyTorch张量的反变换

PyTorch张量的反变换,pytorch,transformation,generative-adversarial-network,Pytorch,Transformation,Generative Adversarial Network,在此之后,我在PyTorch培训了一名WGAN。因为我是在谷歌云平台上做的,而TensorBoard是不可用的,所以我会在每个历元保存一个GAN生成的图像,以查看GAN的实际情况 现在,保存的pdf文件如下所示:。不幸的是,这不是真正可读的,我怀疑这与我所做的预处理有关: trafo = transforms.Compose( [transforms.Resize(size = (64, 64)), transfor

在此之后,我在PyTorch培训了一名WGAN。因为我是在谷歌云平台上做的,而TensorBoard是不可用的,所以我会在每个历元保存一个GAN生成的图像,以查看GAN的实际情况

现在,保存的pdf文件如下所示:。不幸的是,这不是真正可读的,我怀疑这与我所做的预处理有关:

trafo = transforms.Compose(
                    [transforms.Resize(size = (64, 64)),
                    transforms.ToTensor(), 
                    transforms.Normalize( mean = (0.5,), std = (0.5,))]) 
在保存图像时,是否有任何方法可以撤消此转换

目前,我在每个历元保存图像,如下所示:

visualization = torchvision.utils.make_grid(
                           tensor = gen(fixed_noise), 
                           nrow = 8, 
                           normalize = False)
plt.savefig("generated_WGAN_" + datetime.now().strftime("%Y%m%d-%H%M%S") + ".pdf")
此外,我可能应该提到,在Jupyter笔记本中,我得到以下警告:


“使用RGB数据([0..1])将输入数据剪裁到imshow的有效范围(用于浮点或[0..255]用于整数)。”

您的输出像素值似乎在范围
[-1,1]
内(请验证)。
因此,当您保存图像时,负片部分将被剪裁(如您收到的错误消息所示)

尝试:

visualization=torchvision.utils.make_网格(
张量=火炬钳(发电机(固定噪声),-1,1)*0.5+0.5,#从[-1,1]->[0,1]
nrow=8,
正常化=错误)
plt.savefig(“生成的”+datetime.now().strftime(“%Y%m%d-%H%m%S”)+“.pdf”)
该函数通常用于标准化数据(使
平均值(数据)=0
std(x)=1
),而
标准化
选项on用于标准化给定范围的
[0,1]
之间的数据。所以不需要实现一个函数来解决这个问题

如果
True
,将图像移动到范围
(0,1)
,移动范围指定的最小值和最大值。默认值:
False

在这里,您希望在
0
1
之间进行规范化。给定张量
x

torchvision.utils.make_grid(x, nrow=8, normalize=True, range=(x.min(), x.max()))
以下是PyTorch的文档


回到你最初的问题,我应该提到,
torchvision.transform.Normalize(mean=0.5,std=0.5)
不会对数据进行
mean=0.5
std=0.5
转换。。。它也不会将其标准化为
mean=0
std=1
。您必须从数据集中测量平均值和标准差

torchvision.transform.Normalize
只执行移位缩放操作。要撤消该操作,请使用相同的值取消缩放取消移动:

>>> x = torch.rand(64, 3, 100, 100)*torch.rand(64, 1, 1, 1)
>>> x.mean(), x.std()
(tensor(0.2536), tensor(0.2175))

>>> t = T.Normalize(mean, std)
>>> t_inv = lambda x: x*std + mean

>>> x_after = t(x)
>>> x_after.mean(), x_after.std()
(tensor(-0.4928), tensor(0.4350))

>>> x_before = t_inv(x_after)
>>> x_before.mean(), x_before.std()
(tensor(0.2536), tensor(0.2175))

嘿,Shai,我认为你的代码中有一个小错误,因为你在代码中写了一条注释,希望从[-1,1]到[0,1](是的,这确实是我最后的图像范围),但是你在最后写的是-0.5而不是+0.5。@HulioAlmedo谢谢你纠正我