我已经创建了一个DCGAN,并在CIFAR-10数据集上进行了训练。现在,我想在自定义数据集上进行训练。
我已经收集了大约1200张图片,收集更多几乎是不可能的。我该怎么办?
回答:
我们将在未来几周内发布一篇关于生成器随机反卷积的论文,这可以提高此类问题的稳定性和多样性。如果你有兴趣,我现在可以发送给你当前版本的论文。但总的来说,这个想法很简单:
- 构建一个经典的GAN
- 对于生成器的深层(比如说一半的层)使用随机反卷积(sdeconv)
- sdeconv只是一个普通的反卷积层,但过滤器会在训练过程中从一组过滤器中随机选择。例如,你的过滤器库形状可以是(16, 128, 3, 3),其中16是过滤器库的数量,128是每个库中的过滤器数量,3×3是尺寸。在每次训练步骤中,你的过滤器集选择是[random uniform 0-16, :, :, :]。未选择的过滤器保持未训练。在TensorFlow中,你还希望为批次中的不同图像选择不同的过滤器集,因为即使未请求,TensorFlow也会保持训练变量(我们认为这是一个错误,TensorFlow对所有变量使用最后已知的梯度,即使它们在当前动态子图中未被使用,因此你需要尽可能多地利用变量)。
就是这样。在每个库中有16个集合的3层sdeconv,实际上你将有16x16x16 = 4096种不同的内部路径组合来生成输出。这对小数据集有什么帮助?- 通常小数据集具有相对较大的“主题”变化,但数据集总体上是同一性质的(例如猫的照片:都是真实的照片,但有不同类型的猫)。在这样的数据集中,GAN会很快崩溃,但是使用sdeconv:
- 上层的普通反卷积层学习如何重建“真实照片”的风格
- 下层的sdeconv学习子分布:“黑猫”、“白猫”、“红猫”等等
- 模型可以被视为弱生成器的集合,每个子生成器都很弱,可能会崩溃,但会被暂时超过判别器的另一个子生成器“支持”。
MNIST是这种数据集的一个很好的例子:高“主题”变化,但数字的风格相同。
GAN+权重归一化+prelu(在1000步后崩溃,2000步后死亡,只能描述一个“主题”):
GAN+权重归一化+prelu+sdeconv,4388步(可以看到子主题的局部多样性退化,但并未全局崩溃,全局视觉多样性得以保留):