from tensorflow import keras
import datetime
import argparse
from tensorflow_addons.layers import InstanceNormalization
生成器
def encoder_layer(inputs,
filters=16,
kernel_size=3,
strides=2,
activation=‘leaky_relu’,
instance_normal=True):
“”"encoder layer
Conv2D-IN-LeakyReLU, IN is optional
“”"
conv = keras.layers.Conv2D(filters=filters,
kernel_size=kernel_size,
strides=strides,
padding=‘same’)
x = inputs
if instance_normal:
x = InstanceNormalization(axis=3)(x)
if activation == ‘relu’:
x = keras.layers.Activation(‘relu’)(x)
else:
x = keras.layers.LeakyReLU(alpha=0.2)(x)
x = conv(x)
return x
def decoder_layer(inputs,
paired_inputs,
filters=16,
kernel_size=3,
strides=2,
activation=‘leaky_relu’,
instance_normal=True):
“”"decoder layer
Conv2D-IN-LeakyReLU, IN is optional
Arguments: (partial)
inputs (tensor): the decoder layer input
paired_inputs (tensor): the encoder layer output
provided by U-Net skip connection & concatenated to inputs.
“”"
conv = keras.layers.Conv2DTranspose(filters=filters,
kernel_size=kernel_size,
strides=strides,
padding=‘same’)
x = inputs
if instance_normal:
x = InstanceNormalization(axis=3)(x)
if activation == ‘relu’:
x = keras.layers.Activation(‘relu’)(x)
else:
x = keras.layers.LeakyReLU(alpha=0.2)(x)
x = conv(x)
x = keras.layers.concatenate([x,paired_inputs])
return x
def build_generator(input_shape,
output_shape=None,
kernel_size=3,
name=None):
“”"The generator is a U-Network made of a 4-layer encoder and
a 4-layer decoder. Layer n-i is connected to layer i.
Arguments:
input_shape (tuple): input shape
output_shape (tuple): output shape
kernel_size (int): kenel size of encoder $ decoder layers
name (string): name assigned to generator model
Returns:
generator (model)
“”"
inputs = keras.layers.Input(shape=input_shape)
channals = int(output_shape[-1])
e1 = encoder_layer(inputs,32,kernel_size=kernel_size,strides=1)
e2 = encoder_layer(e1,64,kernel_size=kernel_size)
e3 = encoder_layer(e2,128,kernel_size=kernel_size)
e4 = encoder_layer(e3,256,kernel_size=kernel_size)
d1 = decoder_layer(e4,e3,128,kernel_size=kernel_size)
d2 = decoder_layer(d1,e2,64,kernel_size=kernel_size)
d3 = decoder_layer(d2,e1,32,kernel_size=kernel_size)
outputs = keras.layers.Conv2DTranspose(channals,
kernel_size=kernel_size,
strides=1,
activation=‘sigmoid’,
padding=‘same’)(d3)
generator = keras.Model(inputs,outputs,name=name)
return generator
鉴别器
CycleGAN的鉴别器类似于原始GAN鉴别器。输入图像被下采样数次。 最后一层是Dense(1)层,它预测输入为真实图片的概率。除了不使用IN之外