运行starganV2是遇到三个报错以及解决方法

错误一

CheckpointIO(ospj(args.checkpoint_dir, '{:06d}_nets.ckpt'), data_parallel=True, **self.nets)
报错信息为:FileNotFoundError: [WinError 3] 系统找不到指定的路径。: '{:'

报错代码

self.ckptios = [
                CheckpointIO(ospj(args.checkpoint_dir, '{:06d}_nets.ckpt'), data_parallel=True, **self.nets),
                CheckpointIO(ospj(args.checkpoint_dir, '{:06d}_nets_ema.ckpt'), data_parallel=True, **self.nets_ema),
                CheckpointIO(ospj(args.checkpoint_dir, '{:06d}_optims.ckpt'), **self.optims)]

查看了源代码,ospj正常输入应该为args.checkpoint_dir/{:06d}_nets.ckpt,但是实际输出为{:06d}_nets.ckpt。导致os.makedirs(os.path.dirname(fname_template), exist_ok=True)运行出错,不能正常创建指定文件夹。

class CheckpointIO(object):
    def __init__(self, fname_template, data_parallel=False, **kwargs):
        os.makedirs(os.path.dirname(fname_template), exist_ok=True)
        self.fname_template = fname_template
        self.module_dict = kwargs
        self.data_parallel = data_parallel

改正一

self.ckptios = [
                CheckpointIO(ospj(args.checkpoint_dir, 'nets_{:06d}.ckpt'), data_parallel=True, **self.nets),
                CheckpointIO(ospj(args.checkpoint_dir, 'nets_ema_{:06d}.ckpt'), data_parallel=True, **self.nets_ema),
                CheckpointIO(ospj(args.checkpoint_dir, 'optims_{:06d}.ckpt'), **self.optims)]

错误解决

报错二

报错信息为x, y = next(self.iter),AttributeError: 'InputFetcher' object has no attribute 'iter'

这是没有在__init__中加载self.iter

改正二

在data_loader.py中的InputFetcher类修改为

class InputFetcher:
    def __init__(self, loader, loader_ref=None, latent_dim=16, mode=''):
        self.loader = loader
        self.loader_ref = loader_ref
        self.latent_dim = latent_dim
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        self.mode = mode
        self.iter = iter(self.loader)  # 初始化 self.iter

    def _fetch_inputs(self):
        try:
            x, y = next(self.iter)
        except (AttributeError, StopIteration):
            self.iter = iter(self.loader)
            x, y = next(self.iter)
        return x, y

    def _fetch_refs(self):
        try:
            x, x2, y = next(self.iter_ref)
        except (AttributeError, StopIteration):
            self.iter_ref = iter(self.loader_ref)
            x, x2, y = next(self.iter_ref)
        return x, x2, y

    def __next__(self):
        x, y = self._fetch_inputs()
        if self.mode == 'train':
            x_ref, x_ref2, y_ref = self._fetch_refs()
            z_trg = torch.randn(x.size(0), self.latent_dim)
            z_trg2 = torch.randn(x.size(0), self.latent_dim)
            inputs = Munch(x_src=x, y_src=y, y_ref=y_ref,
                           x_ref=x_ref, x_ref2=x_ref2,
                           z_trg=z_trg, z_trg2=z_trg2)
        elif self.mode == 'val':
            x_ref, y_ref = self._fetch_inputs()
            inputs = Munch(x_src=x, y_src=y,
                           x_ref=x_ref, y_ref=y_ref)
        elif self.mode == 'test':
            inputs = Munch(x=x, y=y)
        else:
            raise NotImplementedError

        return Munch({k: v.to(self.device)
                      for k, v in inputs.items()})

    # 使其兼容 for-in 语法
    def __iter__(self):
        return self

问题解决

报错三

AttributeError: Can’t pickle local object “get_train_loader< locals><\lambda>

参考如下博文
https://blog.csdn.net/genous110/article/details/115474244

改正三

在data_loader.py中的get_train_loader()函数附近添加如下代码

# 定义一个常规函数来替代 lambda
def random_crop_transform(x, crop_fn, probability):
    if random.random() < probability:
        return crop_fn(x)
    else:
        return x

# 直接使用函数进行变换
class RandomCropTransform:
    def __init__(self, crop_fn, probability):
        self.crop_fn = crop_fn
        self.probability = probability

    def __call__(self, x):
        return random_crop_transform(x, self.crop_fn, self.probability)

然后将get_train_loader()函数中的rand_crop变量修改为

rand_crop = RandomCropTransform(crop, prob)

问题解决

完结撒花

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
StarGAN v2是一种先进的图像生成模型,旨在将一组输入图像转换为多个可能的目标域图像。该模型具有许多有用的功能和创新。 首先,StarGAN v2建立在StarGAN的基础上,通过引入一个新的概念,即多个生成器和判别器,大大提高了模型的生成能力。每个生成器与一个特定目标域相关联,并且可以从输入图像生成与目标域相关的图像。多个判别器用于提供有关输入图像和生成图像之间的真实性的反馈,从而帮助生成更高质量的图像。 其次,StarGAN v2引入了一个新的概念称为样式代码。样式代码是一个向量,代表了输入图像和目标域之间的潜在特征。通过改变样式代码的值,可以在目标域中生成具有不同外观和特征的图像。这使得模型更加灵活和可控,用户可以根据需要对图像进行个性化的转换。 另外,StarGAN v2还引入了两个重要的改进,称为判别器样式适应和循环一致性损失。判别器样式适应用于提高判别器的性能,使其能够更好地区分生成图像和目标域中真实图像之间的区别。循环一致性损失则用于确保生成器能够在两个目标域之间进行无缝转换,而不会丢失细节或信息。 最后,StarGAN v2通过使用特征对齐损失进一步提高了生成图像的质量。特征对齐损失用于确保在生成图像和真实图像之间的特征分布保持一致,从而使得生成图像更加逼真和真实。 总之,StarGAN v2是一个令人印象深刻的图像生成模型,通过引入多个生成器和判别器、样式代码、判别器样式适应、循环一致性损失和特征对齐损失,实现了高质量和高度可控的图像转换。它在许多应用领域,如人脸生成和图像风格迁移中具有巨大的潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值