美文网首页工作生活
kaggle竞赛报告:Generative Dog Images

kaggle竞赛报告:Generative Dog Images

作者: 深度学习模型优化 | 来源:发表于2019-07-10 00:38 被阅读0次

    这个竞赛的任务是根据给定的ImageNet中的120种狗狗图片,生成这个图片。

    1 参考模型

    1.1 模型1

    DCGAN

    1.2 模型2

    WGAN

    1.3 模型3

    WGAN-GP(WGAN2)

    1.4 模型4

    WGAN-C

    2 我的提交模型和LB结果

    2.1 生成模型(fork from the job by Chris Detto)

    在Chris的生成模型基础上做一些改进。

    • 模型改进
    • 生成模型的学习算法改进
    • 数据增广(采用类似于mixup的方法)

    2.1 DCGAN

    2.2 WGAN

    2.3 CGAN

    3 最终LB结果

    4 GAN训练的tricks

    在keras中如何稳健的训练GAN模型

    原文作者Jason Brownlee

    Generative Adversarial Networks, 或者多个GANs存在训练困难,对于这个比赛尤其困难,因为只有一个P100的GPU和9个小时的训练时间。

    言归正传,GAN的训练其实是一个零和问题,天生的难以训练。

    但是可以参考这里。,也许会有帮助。

    教程目录

    主要由两部分组成:

    1. 启发式文件GANs的训练方法
    2. DCGAN的最优实践
      2.1. 使用Stride卷积进行下采样
      2.2. 使用Stride反卷积进行上采样
      2.3. 使用LeakyReLU
      2.4. 使用Batch Normalization
      2.5. 使用Gaussian Weight Initialization
      2.6. 使用Adam Stochastic Gradient Descent
      2.7. 将图像归一化到[-1,1]
    3. Soumith Chintala的GAN技巧
      3.1. 使用Gaussian隐变量空间
      3.2. 批量分开真假图像
      3.3. 使用Label Smoothing
      3.4. 使用噪声Labels

    1 启发式文件GANs的训练方法

    2 DCGAN的最优实践

    2.1. 使用Stride卷积进行下采样

    # example of downsampling with strided convolutions
    from keras.models import Sequential
    from keras.layers import Conv2D
    # define model
    model  =  Sequential()
    model.add(Conv2D(64,  kernel_size=(3,3),  strides=(2,2),  padding='same',  input_shape=(64,64,3)))
    # summarize model
    model.summary()
    

    2.2. 使用Stride反卷积进行上采样

    # example of upsampling with strided convolutions
    from keras.models import Sequential
    from keras.layers import Conv2DTranspose
    # define model
    model  =  Sequential()
    model.add(Conv2DTranspose(64,  kernel_size=(4,4),  strides=(2,2),  padding='same',  input_shape=(64,64,3)))
    # summarize model
    model.summary()
    

    2.3. 使用LeakyReLU

    # example of using leakyrelu in a discriminator model
    from keras.models import Sequential
    from keras.layers import Conv2D
    from keras.layers import BatchNormalization
    from keras.layers import LeakyReLU
    # define model
    model  =  Sequential()
    model.add(Conv2D(64,  kernel_size=(3,3),  strides=(2,2),  padding='same',  input_shape=(64,64,3)))
    model.add(LeakyReLU(0.2))
    # summarize model
    model.summary()
    

    2.4. 使用Batch Normalization

    # example of using batch norm in a discriminator model
    from keras.models import Sequential
    from keras.layers import Conv2D
    from keras.layers import BatchNormalization
    from keras.layers import LeakyReLU
    # define model
    model  =  Sequential()
    model.add(Conv2D(64,  kernel_size=(3,3),  strides=(2,2),  padding='same',  input_shape=(64,64,3)))
    model.add(BatchNormalization())
    model.add(LeakyReLU(0.2))
    # summarize model
    model.summary()
    

    2.5. 使用Gaussian Weight Initialization

    # example of gaussian weight initialization in a generator model
    from keras.models import Sequential
    from keras.layers import Conv2DTranspose
    from keras.initializers import RandomNormal
    # define model
    model  =  Sequential()
    init  =  RandomNormal(mean=0.0,  stddev=0.02)
    model.add(Conv2DTranspose(64,  kernel_size=(4,4),  strides=(2,2),  padding='same',  kernel_initializer=init,  input_shape=(64,64,3)))
    

    2.6. 使用Adam Stochastic Gradient Descent

    # example of using adam when training a discriminator model
    from keras.models import Sequential
    from keras.layers import Conv2D
    from keras.optimizers import Adam
    # define model
    model  =  Sequential()
    model.add(Conv2D(64,  kernel_size=(3,3),  strides=(2,2),  padding='same',  input_shape=(64,64,3)))
    # compile model
    opt  =  Adam(lr=0.0002,  beta_1=0.5)
    model.compile(loss='binary_crossentropy',  optimizer=opt,  metrics=['accuracy'])
    

    2.7. 将图像归一化到[-1,1]

    # example of a function for scaling images
    # scale image data from [0,255] to [-1,1]
    def scale_images(images):
    # convert from unit8 to float32
    images  =  images.astype('float32')
    # scale from [0,255] to [-1,1]
    images  =  (images  -  127.5)  /  127.5
    return  images
    

    3. Soumith Chintala的GAN技巧

    3.1 使用Gaussian隐变量空间

    # example of sampling from a gaussian latent space
    from numpy.random import randn
    # generate points in latent space as input for the generator
    def generate_latent_points(latent_dim,  n_samples):
      # generate points in the latent space
      x_input  =  randn(latent_dim *  n_samples)
      # reshape into a batch of inputs for the network
      x_input  =  x_input.reshape((n_samples,  latent_dim))
      return  x_input
    # size of latent space
    n_dim  =  100
    # number of samples to generate
    n_samples  =  500
    # generate samples
    samples  =  generate_latent_points(n_dim,  n_samples)
    # summarize
    print(samples.shape,  samples.mean(),  samples.std())
    

    3.2. 批量分开真假图像

    # get randomly selected 'real' samples
    X_real,  y_real  =  ...
    # update discriminator model weights
    discriminator.train_on_batch(X_real,  y_real)
    # generate 'fake' examples
    X_fake,  y_fake  =  ...
    # update discriminator model weights
    discriminator.train_on_batch(X_fake,  y_fake)
    

    3.3. 使用Label Smoothing

    # example of positive label smoothing
    from numpy import ones
    from numpy.random import random
    # example of smoothing class=1 to [0.7, 1.2]
    def smooth_positive_labels(y):
      return  y  -  0.3  +  (random(y.shape)  *  0.5)
    # generate 'real' class labels (1)
    n_samples  =  1000
    y  =  ones((n_samples,  1))
    # smooth labels
    y  =  smooth_positive_labels(y)
    # summarize smooth labels
    print(y.shape,  y.min(),  y.max())
    
    # example of negative label smoothing
    from numpy import zeros
    from numpy.random import random
    # example of smoothing class=0 to [0.0, 0.3]
    def smooth_negative_labels(y):
      return  y  +  random(y.shape)  *  0.3
    # generate 'fake' class labels (0)
    n_samples  =  1000
    y  =  zeros((n_samples,  1))
    # smooth labels
    y  =  smooth_negative_labels(y)
    # summarize smooth labels
    print(y.shape,  y.min(),  y.max())
    

    3.4. 使用噪声Labels

    # example of noisy labels
    from numpy import ones
    from numpy import zeros
    from numpy.random import choice
    # randomly flip some labels
    def noisy_labels(y,  p_flip):
      # determine the number of labels to flip
      n_select  =  int(p_flip *  y.shape[0])
      # choose labels to flip
      flip_ix  =  choice([i  for  i  in  range(y.shape[0])],  size=n_select)
      # invert the labels in place
      y[flip_ix]  =  1  -  y[flip_ix]
      return  y
    # generate 'real' class labels (1)
    n_samples  =  1000
    y  =  ones((n_samples,  1))
    # flip labels with 5% probability
    y  =  noisy_labels(y,  0.05)
    # summarize labels
    print(y.sum())
    # generate 'fake' class labels (0)
    y  =  zeros((n_samples,  1))
    # flip labels with 5% probability
    y  =  noisy_labels(y,  0.05)
    # summarize labels
    print(y.sum())
    

    API

    论文参考

    相关文章

      网友评论

        本文标题:kaggle竞赛报告:Generative Dog Images

        本文链接:https://www.haomeiwen.com/subject/fgxhhctx.html