qynglang 2022-01-12 13:44 采纳率: 0%
浏览 52
已结题

训练好的beta-VAE模型(效果很好)对于单张图片无法利用模型(权重)进行图片复原,如何解决?

模型已经训练好了,输入一个batch的数据能够利用模型的权重复原图片,如图所示:

img

但是如果采用单个图片,用模型编码到z值再解码效果很差。如图所示:

img

单个图片复原(未成功)使用的代码为:

#加载模型
 with open('configs/bbvae_raven.yaml', 'r') as file:
    config = yaml.safe_load(file)
#data = VAEDataset(**config["data_params"], pin_memory=len(config['trainer_params']['gpus']) != 0)
model = vae_models[config['model_params']['name']](**config['model_params'])
state_dict=torch.load('logs/BetaVAE/version_46/checkpoints/epoch=149-step=60599.ckpt')
state_dict=state_dict['state_dict']
from collections import OrderedDict
new_state_dict=OrderedDict()
for k,v in state_dict.items():
    name=k[6:]
    new_state_dict[name]=v
model.load_state_dict(new_state_dict)

#利用模型将图片encode到z值
from torchvision import transforms
def forward_to_z(input: Tensor, **kwargs) -> Tensor:
    mu, log_var = model.encode(input)
    z = model.reparameterize(mu, log_var)
 
    #print(self.decode(z).size())
    return  z

img_tensor=transforms.functional.to_tensor(img)  #将图片输入tensor
z=forward_to_z(img_tensor.reshape(1,1,80,80))#利用模型权重获取z值

#利用z值复原图片
recons=model.decode(z)
pic=recons.detach().numpy()[0,0,:,:]

一个batch的图片复原(成功)使用的代码为:

#加载模型
with open('configs/bbvae_raven.yaml', 'r') as file:
    config = yaml.safe_load(file)
#data = VAEDataset(**config["data_params"], pin_memory=len(config['trainer_params']['gpus']) != 0)
model = vae_models[config['model_params']['name']](**config['model_params'])
state_dict=torch.load('logs/BetaVAE/version_46/checkpoints/epoch=149-step=60599.ckpt')
state_dict=state_dict['state_dict']
from collections import OrderedDict
new_state_dict=OrderedDict()
for k,v in state_dict.items():
    name=k[6:]
    new_state_dict[name]=v
model.load_state_dict(new_state_dict)

#使用Dataloader生成1个brach的图片
data = RAVENDataset(**config["data_params"], pin_memory=len(config['trainer_params']['gpus']) != 0)

data.setup()
experiment = VAEXperiment(model,
                          config['exp_params'])

test_input, test_label = next(iter(RAVENDataset.test_dataloader(data)))

# test_input, test_label = next(iter(self.trainer.datamodule.test_dataloader()))
test_input = test_input.to(experiment.curr_device)
test_label = test_label.to(experiment.curr_device)

#将图片encode到z值
def forward_to_z(input: Tensor, **kwargs) -> Tensor:
    mu, log_var = model.encode(input)
    z = model.reparameterize(mu, log_var)

    #print(self.decode(z).size())
    return  z

z=forward_to_z(test_input)
# # recons=model.decode(z)
np.save('Data/twobytwo_out/zz.npy',z.detach().numpy())

#从z值decode到图片
recons=model.decode(z)
np.save('Data/twobytwo_out/reconss.npy',recons.detach().numpy())

其中model.encode和model.decode为beta-VAE模型的encode和decode。

另外,在gpu上load模型,进行转化并还原图片效果很好,将z值储存并下载到自己的电脑上以后使用同样的模型和model.decode代码无法还原图片。

而且当调整dataloader一个brach只包含1个图片的时候还原效果也非常不好。

而且通过model.forward计算出的mu值在自己电脑上和在gpu上结果不一样。程序没有随机的因素在里面。如果权重一样不是应该相等吗?不知道为什么会有差异。

我希望能通过模型得到能decode得到清晰图片的稳定z值。能不能帮忙看下问题出在哪呢?谢谢了!

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2022-01-13 19:48
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月20日
  • 修改了问题 1月13日
  • 创建了问题 1月12日

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!