生成器(generator)结构被广泛应用在生成对抗网络(GANs)与卷积自动编码器(CAE/U-Net)中。其对应若干个上采样或反卷积使 tensor 广度扩增的过程。在 Keras 中,上采样和反卷积分别对应 layers.UpSampling2D()
与 layers.Conv2DTranspose()
两个函数。以下详细介绍。
tf.keras.layers.UpSampling2D
keras.layers.UpSampling2D(size=(2, 2), data_format=None, interpolation='nearest')
简而言之,在输出时将输入数据分别沿着x,y方向重复size[0], size[1]次。
结果输出大小为输入张量的两倍,对应平均池化AveragePooling2D()
的逆过程。
在生成器结构中,通常配合卷积层 Conv2D
使用,例如:
output1 = layers.Conv2D(128, (3,3), activation='relu', padding='same')(input)
output = layers.UpSampling2D((2,2))(output1)
由此实现生成器卷积核权值可训练的方案。
tf.keras.layers.Conv2DTranspose
keras.layers.Conv2DTranspose(filters, kernel_size, strides=(1, 1), padding='valid', output_padding=None, data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
相比于Upsampling2D
的简单复制扩增广度,Conv2DTranspose
则实现了一个转置卷积(反卷积)层。
同时,对比与 conv2D
层,其在逻辑上可以视为逆过程,即「将具有卷积输出尺寸的东西转换为具有卷积输入尺寸的东西」,同时保持与普通卷积层相同的连通性特征。
参数中,strides
可以视为放大倍数,strides=(2, 2)
即沿着x,y方向放大两倍。
其他参数与 conv2D
层基本相同。
使用例:
x = Conv2DTranspose(8, (2, 2), strides=(2, 2), activation='relu', padding='same')(x)
由此实现 UPSampling
+ Conv2D
相同且具有更为复杂卷积的过程。
值得注意的是,Conv2DTranspose
的例子中Stride的大小为2,因此在生成器结果中容易出现棋盘效应(棋盘格子状伪影,checkboard artifacts),降低生成图片的质量。可以使用插值等方法消除。使用UpSampling2D
则可以较好的避免这个问题。