Toccata in Nowhere.

Keras实现神经网络上采样的两种方法

2020.07.02

生成器(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则可以较好的避免这个问题。