【问题标题】:GAN PyTorch: Same Images Generating throughout batchesGAN PyTorch:在批次中生成相同的图像
【发布时间】:2021-11-28 01:01:01
【问题描述】:

所以看下图就可以看出问题

Image generated per epoch screenshot 每批次的图像相同但不完全相同,只有 5% 的 pizel 略有不同

在每个epoch结束时发送到保存图像生成器的随机噪声的潜在大小是torch.randn(Batch_size,Latent_size,1,1)

但似乎生成模型正在强迫自己,而不管每个图像的随机噪声输入是否不同, 相反,随机噪声在整个 diff 时期是恒定的,但图像生成不断变化。

代码:

#Data Preparation
import torchvision.transforms as tt
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader

#mean = (0.6528, 0.4833, 0.4052)
#deviation = (0.2362, 0.2079, 0.1988)

ROOT = "./data/Gender/train"
BATCH_SIZE = 120
LATENT_SIZE = 100

train_ds = ImageFolder(ROOT, tt.Compose([tt.RandomHorizontalFlip(),tt.Resize(64),tt.ToTensor(),tt.Normalize((0.6528, 0.4833, 0.4052),(0.2362, 0.2079, 0.1988))]))
train_dl = DataLoader(train_ds, BATCH_SIZE, shuffle=1, num_workers=2, pin_memory=1)

#Generator

G = nn.Sequential(
    nn.ConvTranspose2d(LATENT_SIZE,800,kernel_size=4,stride=2,padding=1,bias=False),#1000 2 2 
    nn.BatchNorm2d(800),
    nn.ReLU(),

    nn.ConvTranspose2d(800,400,kernel_size=4,stride=2,padding=1,bias=False),#600 4 4
    nn.BatchNorm2d(400),
    nn.ReLU(),
    
    nn.ConvTranspose2d(400,200,kernel_size=4,stride=2,padding=1,bias=False),#300 8 8
    nn.BatchNorm2d(200),
    nn.ReLU(),
    
    nn.ConvTranspose2d(200,100,kernel_size=4,stride=2,padding=1,bias=False),#150 16
    nn.BatchNorm2d(100),
    nn.ReLU(),
    
    nn.ConvTranspose2d(100,50,kernel_size=4,stride=2,padding=1,bias=False),#50 32
    nn.BatchNorm2d(50),
    nn.ReLU(),
    
    nn.ConvTranspose2d(50,3,kernel_size=4,stride=2,padding=1,bias=False),#3 64
    nn.Tanh()
)

G = G.to(device)
#Generator Traing Function

def g_fit():
    g_opt.zero_grad()
    
    rand_g = torch.randn(BATCH_SIZE, LATENT_SIZE,1,1,dtype=torch.float32).to(device)
    fake_images = G(rand_g)
    g_loss = loss_fn(D(fake_images), real_labels)
    

    g_loss.backward()
    
    g_opt.step()
    
    return g_loss
#Saving Images

from torchvision.utils import save_image
from PIL import Image

gen = torch.randn(24,LATENT_SIZE,1,1).to(device)

def save_fake_images(epoch):

    with torch.no_grad():
        fake_images = G(gen)

        name = "./drive/MyDrive/gans_data/fake_n_images_"+str(epoch)+".png"
        
        #Denorming Images
        for i in range(len(fake_images)):
            fake_images[i][0]=(fake_images[i][0]*0.2362) +0.6528
            fake_images[i][1]=(fake_images[i][1]*0.2079) +0.4833
            fake_images[i][2]=(fake_images[i][2]*0.1988) +0.4052

        save_image(fake_images, name, nrow=6)

#this function is being used at the end of every training loop to save a small batch of images

【问题讨论】:

    标签: python machine-learning deep-learning pytorch generative-adversarial-network


    【解决方案1】:

    这是 GAN 训练中的一个常见问题,称为 mode collapse。请查看有关如何解决此问题的一些信息:

    https://developers.google.com/machine-learning/gan/problems#mode-collapse https://machinelearningmastery.com/practical-guide-to-gan-failure-modes/

    根据个人经验,我发现 GAN 的训练变化无常,有时某些东西会工作一次,然后在下一次训练运行时就无法工作,或者某些参数的微小变化会对生成器的性能产生很大影响.不断尝试新事物,看看效果如何。

    【讨论】:

    • 我确实阅读了谷歌并理解它发生的原因。只是判别器卡在局部最小值中,而生成器通过仅生成该最小值的最佳图像来利用这一事实。所以我将批量大小从 120 增加到 500,因为局部最小值是全局最小值,并且鉴别器有多种输入,它确实有点帮助,但结果仍然是补丁,一半的输入是一种类型和其他类型其他类型的一半。 GAN 确实是善变的
    • 您在使用 WGAN 吗?其他一些技巧包括减少网络的大小、不使用批量规范、分别为光盘运行假/真实图像的训练、降低学习率等。可以在此处找到一个很好的列表:towardsdatascience.com/…
    猜你喜欢
    • 2021-06-21
    • 2021-03-15
    • 2020-09-25
    • 1970-01-01
    • 2018-03-29
    • 2020-06-28
    • 2015-03-09
    • 2018-06-22
    • 2018-04-26
    相关资源
    最近更新 更多