Bayesian Generative Adversarial Networks in Tensorflow DOC

Introduction

在贝叶斯GAN中,我们提出了生成器和鉴别器权重的条件后验,并通过随机梯度哈密顿蒙特卡罗将这些后验边缘化。 贝叶斯方法对GAN的关键属性包括:(1)对半监督学习问题的准确预测; (3)响应对抗性反馈的推理的推理性表述; (4)避免模式崩溃; (5)数据的多个互补的生成和判别模型的表示,形成概率集合。

 

           我们说明了生成器参数的多模式后验。 这些参数的每个设置对应于数据的不同生成假设。 我们在这里显示为该权重向量的两个不同设置生成的样本,对应于不同的书写风格。 贝叶斯GAN保留了参数的整个分布。 相比之下,标准GAN用点估计(类似于单个最大似然解决方案)表示整个分布,缺少对数据的潜在引人注意的解释。

用法

安装

  1. 安装所需的依赖项
  2. 克隆此存储库

合成数据
你可以使用 bgan_synth 脚本运行论文中的合成实验。例如,以下命令用于训练贝叶斯 GAN(D=100,d=10),进行 5000 次迭代,并把结果保存在。并将结果存储在<results_path>中。 

./bgan_synth.py --x_dim 100 --z_dim 10 --numz 10 --out <results_path>

为同一数据运行运行ML GAN

./bgan_synth.py --x_dim 100 --z_dim 10 --numz 1 --out <results_path>

bgan_synth有--save_weights, - out_dir, - z_dim, - numz,--wasserstein, - train_iter和--x_dim参数。 

 x_dim控制观察数据的维数(文中的x)。 有关其他参数的说明,请参阅训练选项。

运行上述两个命令后,您将在<results_path>中看到每个第100次迭代的输出。 因此,例如,贝叶斯GAN在第900次迭代时的输出将如下所示:

相反,标准GAN的输出(对应于numz = 1,强制ML估计)将如下所示:

清楚地表明标准GAN中模式崩溃的趋势,对于该合成示例,贝叶斯GAN完全避免了这种趋势。

为了进一步探索合成实验,并生成Jensen-Shannon发散图,您可以查看笔记本synth.ipynb。

基准数据集的无监督和半监督学习

MNIST, CIFAR10, CelebA, SVHN 

bayesian_gan_hmc脚本允许在标准和自定义数据集上训练模型。 下面我们描述这个脚本的用法。

数据准备 

要在MNIST,CIFAR10,CelebA和SVHN数据集上重现实验,您需要准备数据并使用正确的--data_path。

  • 对于MNIST,您不需要准备数据并且可以提供任何--data_path;
  • 对于CIFAR10,请从https://www.cs.toronto.edu/~kriz/cifar.html下载并解压缩python版本的数据;然后使用包含cifar-10-batches-py的目录的路径作为--data_path;
  • 对于SVHN,请从http://ufldl.stanford.edu/housenumbers/下载train_32x32.mat和test_32x32.mat文件,并使用包含这些文件的目录作为--data_path;
  • 对于CelebA,您需要安装openCV。您可以在http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html找到数据的下载链接。您需要使用Anno和img_align_celeba子文件夹创建celebA文件夹。 Anno必须包含list_attr_celeba.txt,而img_align_celeba必须包含.jpg文件。您还需要通过使用--data_path <path>运行datasets / crop_faces.py脚本来裁剪图像,其中<path>是包含celebA的文件夹的路径。训练模型时,您需要为--data_path使用相同的<path>; 

无监督的训练 

您可以通过运行不带--semi参数的bayesian_gan_hmc脚本来运行无监督学习。 例如,使用

./run_bgan.py --data_path <data_path> --dataset svhn --numz 10 --num_mcmc 2 --out_dir 
<results_path> --train_iter 75000 --save_samples --n_save 100

来在SVHN数据集上训练模型。 此命令将运行75000次迭代的方法,并每100次迭代保存样本。 这里<results_path>必须指向存储结果的目录。 有关如何设置<data_path>的说明,请参阅数据准备部分。 有关其他培训选项的说明,请参阅培训选项部分。 

 

Semi-supervised training

要运行半监督实验,您可以使用run_bgan_semi.py脚本,该脚本提供了许多选项,包括以下内容:

  • --out_dir:文件夹的路径,输出将存储在该路径中
  • --n_save:每次n_save迭代都保存样本和权重;默认为100
  • --z_dim:生成器的z向量的维数;默认为100
  • --data_path:数据的路径;请参阅数据准备以进行详细讨论;此参数是必需的
  • --dataset:可以是mnist,cifar,svhn或celeb;默认mnist
  • --batch_size:培训的批量大小;默认64
  • --prior_std:先前分配权重的标准;默认1
  • --num_gen:与论文中的J相同; z的样本数量,将其整合到发电机中;默认1
  • --num_disc:与论文中的J_D相同; z的样本数量,将其整合出去用于鉴别器;默认1
  • --num_mcmc:与论文中的M相同;每z的MCMC NN重量样本数;默认1
  • --lr:Adam优化器使用的学习率;默认0.0002
  • --optimizer:要使用的优化方法:adam(tf.train.AdamOptimizer)或sgd(tf.train.MomentumOptimizer);默认亚当
  • --N:半监督学习的标记样本数
  • --train_iter:训练迭代次数;默认50000
  • --save_samples:在训练期间保存生成的样本
  • --save_weights:在训练期间保存重量
  • --random_seed:随​​机种子;请注意,如果使用GPU,设置此种子不会导致100%可重现的结果 

您还可以使用--wasserstein运行WGAN或使用--ml_ensemble <num_dcgans>训练<num_dcgans> DCGAN的集合。 特别是你可以用--ml训练DCGAN。

您可以通过使用--semi选项运行bayesian_gan_hmc来在半监督设置中训练模型。 使用-N参数设置要训练的标记示例的数量。 例如,使用

./run_bgan_semi.py --data_path <data_path> --dataset cifar --num_gen 10 --num_mcmc 2
--out_dir <results_path> --train_iter 100000 --N 4000 --lr 0.0005

在具有4000个标记示例的CIFAR10数据集上训练模型。 此命令将训练模型进行100000次迭代,并将输出存储在<results_path>文件夹中。 

 

要使用100个标记示例在MNIST上训练模型,您可以使用以下命令。

./bayesian_gan_hmc.py --data_path <data_path>/ --dataset mnist --num_gen 10 --num_mcmc 2
--out_dir <results_path> --train_iter 100000 -N 100 --semi --lr 0.0005

 

自定义数据

要在自定义数据集上训练模型,您需要定义具有特定接口的类。 假设我们想要在数字数据集上训练模型。 该数据集由8x8个数字图像组成。 假设数据存储在x_tr.npy,y_tr.npy,x_te.npy和y_te.npy文件中。 我们假设x_tr.npy和x_te.npy具有形式(?,8,8,1)的形状。 然后我们可以在bgan_util.py中定义与该数据集对应的类,如下所示。 

class Digits:

    def __init__(self):
        self.imgs = np.load('x_tr.npy') 
        self.test_imgs = np.load('x_te.npy')
        self.labels = np.load('y_tr.npy')
        self.test_labels = np.load('y_te.npy')
        self.labels = one_hot_encoded(self.labels, 10)
        self.test_labels = one_hot_encoded(self.test_labels, 10) 
        self.x_dim = [8, 8, 1]
        self.num_classes = 10

    @staticmethod
    def get_batch(batch_size, x, y): 
        """Returns a batch from the given arrays.
        """
        idx = np.random.choice(range(x.shape[0]), size=(batch_size,), replace=False)
        return x[idx], y[idx]

    def next_batch(self, batch_size, class_id=None):
        return self.get_batch(batch_size, self.imgs, self.labels)

    def test_batch(self, batch_size):
        return self.get_batch(batch_size, self.test_imgs, self.test_labels)

该类必须具有next_batch和test_batch,并且必须具有imgs,labels,test_imgs,test_labels,x_dim和num_classes字段。

现在我们可以在bayesian_gan_hmc.py中导入Digits类

from bgan_util import Digits

并将以下行添加到--dataset参数的处理中。

if args.dataset == "digits":
    dataset = Digits()

完成此准备工作后,我们可以训练模型,例如,

./run_bgan_semi.py --data_path <any_path> --dataset digits --num_gen 10 --num_mcmc 2 
--out_dir <results path> --train_iter 100000 --save_samples

猜你喜欢

转载自blog.csdn.net/u013841458/article/details/82555533