【问题标题】:Pretrained lightning-bolts VAE not doing proper inference on training dataset预训练的闪电 VAE 没有对训练数据集进行适当的推理
【发布时间】:2022-01-08 19:35:05
【问题描述】:
我正在使用来自 lightning-bolts 的 CIFAR-10 预训练 VAE。它应该能够以这张从docs 拍摄的图片显示的质量重新生成图像(LHS 是真实图像,RHS 是生成的图像)
但是,当我编写一个简单的脚本来加载模型、权重并在 training 集上对其进行测试时,我得到的重建效果要差得多(顶行是真实图像,底行是生成的):
这是一个独立的 colab 笔记本的 link,它重现了我制作图片所遵循的步骤。
我在推理过程中做错了吗?是不是权重不像文档声称的那么“好”?
谢谢!
【问题讨论】:
标签:
deep-learning
pytorch
autoencoder
pytorch-lightning
【解决方案1】:
首先,您显示的文档中的图像是针对 AE 的,而不是 VAE。 VAE 的结果看起来更糟:
https://pl-bolts-weights.s3.us-east-2.amazonaws.com/vae/vae-cifar10/vae_output.png
其次,文档声明“输入和生成的图像都是标准化版本,因为训练是使用此类图像完成的。”因此,当您加载数据时,您应该指定 normalize=True。当您绘制数据时,您还需要对数据进行“非标准化”:
from pl_bolts.datamodules import CIFAR10DataModule
from pl_bolts.models.autoencoders import VAE
from pytorch_lightning import Trainer
import matplotlib.pyplot as plt
import numpy as np
import torch
from torchvision import transforms
torch.manual_seed(17)
np.random.seed(17)
vae = VAE(32, lr=0.00001)
vae = vae.from_pretrained("cifar10-resnet18")
dm = CIFAR10DataModule(".", normalize=True)
dm.prepare_data()
dm.setup("fit")
dataloader = dm.train_dataloader()
print(dm.default_transforms())
mean = torch.tensor(dm.default_transforms().transforms[1].mean)
std = torch.tensor(dm.default_transforms().transforms[1].std)
unnormalize = transforms.Normalize((-mean / std).tolist(), (1.0 / std).tolist())
X, _ = next(iter(dataloader))
vae.eval()
X_hat = vae(X)
fig, axes = plt.subplots(2, 10, figsize=(10, 2))
for i in range(10):
ax_real = axes[0][i]
ax_real.imshow(np.transpose(unnormalize(X[i]), (1, 2, 0)))
ax_real.get_xaxis().set_visible(False)
ax_real.get_yaxis().set_visible(False)
ax_gen = axes[1][i]
ax_gen.imshow(np.transpose(unnormalize(X_hat[i]).detach().numpy(), (1, 2, 0)))
ax_gen.get_xaxis().set_visible(False)
ax_gen.get_yaxis().set_visible(False)
这给出了这样的东西:
如果没有标准化,它看起来像: