深度学习【45】pix2pix

论文:Image-to-Image Translation with Conditional Adversarial Networks
第一篇用GAN做图片到图片的转换,效果还可以。论文给出的一些例子:
深度学习【45】pix2pix_第1张图片

损失函数

pix2pix用的是条件GAN,损失函数为:
这里写图片描述

与原始GAN不同的是,G网络的输入是一张待转换的图片很随机向量z(pix2pix没加入向量z),D网络的输入是待转换图片x和目标图片y(同时观察x和y,以判断生成的图片是不是真实的)。
另外,pix2pix还为G网络加入了L1损失函数:
这里写图片描述
最终的损失函数为:
这里写图片描述

网络结构

G网络

论文分别使用了encoder-decoder网络和U-Net,不过U-Net的效果会比较好。U-Net是在encoder-decoder的基础上加入了跳跃连接。
深度学习【45】pix2pix_第2张图片

D网络

论文的D网络比较有意思。使用的是PatchGAN的思想。不想其他的D网络是对整张图片进行判断,PatchGAN对图片中N×N的块进行判断。实现起来也比价简单,下面是一个例子:

def create_discriminator(discrim_inputs, discrim_targets):
        n_layers = 3
        layers = []

        # 2x [batch, height, width, in_channels] => [batch, height, width, in_channels * 2]
        input = tf.concat([discrim_inputs, discrim_targets], axis=3)

        # layer_1: [batch, 256, 256, in_channels * 2] => [batch, 128, 128, ndf]
        with tf.variable_scope("layer_1"):
            convolved = discrim_conv(input, a.ndf, stride=2)
            rectified = lrelu(convolved, 0.2)
            layers.append(rectified)

        # layer_2: [batch, 128, 128, ndf] => [batch, 64, 64, ndf * 2]
        # layer_3: [batch, 64, 64, ndf * 2] => [batch, 32, 32, ndf * 4]
        # layer_4: [batch, 32, 32, ndf * 4] => [batch, 31, 31, ndf * 8]
        for i in range(n_layers):
            with tf.variable_scope("layer_%d" % (len(layers) + 1)):
                out_channels = a.ndf * min(2**(i+1), 8)
                stride = 1 if i == n_layers - 1 else 2  # last layer here has stride 1
                convolved = discrim_conv(layers[-1], out_channels, stride=stride)
                normalized = batchnorm(convolved)
                rectified = lrelu(normalized, 0.2)
                layers.append(rectified)

        # layer_5: [batch, 31, 31, ndf * 8] => [batch, 30, 30, 1]
        with tf.variable_scope("layer_%d" % (len(layers) + 1)):
            convolved = discrim_conv(rectified, out_channels=1, stride=1)
            output = tf.sigmoid(convolved)
            layers.append(output)

        return layers[-1]

最终的输出是30*30的张量,而不是1个节点。通过控制D网络输出张量的大小,就可以控制patch的大小。不同patch大小的影响:
深度学习【45】pix2pix_第3张图片
L1:比较模糊,只生成低频信息,没有高频信息
1*1:颜色丰富,空间信息少
16*16:局部形状出来了,但是失真
70*70及以上:效果比较好。

实验结果

太多了,参考论文。

你可能感兴趣的:(深度学习)