详解TensorFlow的 tf.layers.Conv2DTranspose 函数:二维转置卷积层

  • Post category:Python

TensorFlow 是一个开源的深度学习框架,其中涉及到大量的神经网络操作,其中之一就是 tf.layers.Conv2DTranspose 函数。这个函数的主要作用是采用反卷积的方式,将卷积过程中的压缩操作逆转回去,拓宽输入的特征图,从而实现图像的还原与恢复的目的。

函数参数说明

tf.layers.Conv2DTranspose(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    activation=None,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    trainable=True,
    name=None,
    reuse=None
)
  • inputs: 输入特征张量,数据类型为 float32
  • filters: 输出通道数,必须为正整数。
  • kernel_size: 卷积核大小,一个整数或者一个元组,代表高宽方向的卷积核大小。例如 (3, 3)
  • strides: 卷积核滑动步长,一个整数或者一个元组,代表高宽方向的滑动步长。例如 (2, 2)
  • padding: 边界填充方式,valid 或者 same
  • activation: 激活函数,可选参数为 None 或者任意一个可调用函数对象。
  • kernel_initializer: 卷积核初始化器,可选参数。
  • bias_initializer: 偏置初始化器,默认为0
  • kernel_regularizer: 卷积核正则化器,可选参数。
  • bias_regularizer: 偏置正则化器,可选参数。
  • activity_regularizer: 损失函数正则化器,可选参数。
  • trainable: 卷积核是否可训练,一个布尔值,默认为 True
  • name: 操作的名称。
  • reuse: 是否重复使用权重参数,一个布尔值。

使用方法

tf.layers.Conv2DTranspose 函数的使用方法如下:

import tensorflow as tf

inputs = tf.placeholder(tf.float32, [None, 28, 28, 1])
output = tf.layers.Conv2DTranspose(inputs, filters=32, kernel_size=(3, 3), strides=(2, 2), padding='same')

上述代码展示了如果创建一个输入为28x28x1的特征张量,其中数据类型为 float32,使用 tf.layers.Conv2DTranspose 函数,将输入的特征拓宽,扩展通道数到32,使用一个包含3×3大小卷积核的反卷积方式进行拓宽,采取步长为 (2, 2),并使用 same 方式对边缘进行填充。

为了更好的理解这个函数在图像恢复领域中的应用,这里提供两个在实际应用中的案例:

示例1:

假如我们有一张224×224的彩色图片,希望将它恢复成原来尺寸的两倍,即448×448,这时候我们可以使用如下代码:

import tensorflow as tf

inputs = tf.placeholder(tf.float32, [None, 224, 224, 3])
output = tf.layers.Conv2DTranspose(inputs, filters=3, kernel_size=(3, 3), strides=(2, 2), padding='same')

上述代码中,我们指定输出通道数为3,卷积核大小为 (3, 3),步长为 (2, 2),使用 same 方式对边缘进行填充,使用 tf.layers.Conv2DTranspose 函数进行拓宽,最后得到的恢复后的图片大小为448×448。这使得我们可以对图像进行逐像素的操作,例如修改某些像素值来达到一定的目的。

示例2:

假如我们已经训练好了一个28×28的手写数字MNIST模型,我们现在希望放大数字并进行可视化,我们可以使用如下代码:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/")

inputs = tf.placeholder(tf.float32, [None, 28, 28, 1])
output = tf.layers.Conv2DTranspose(inputs, filters=1, kernel_size=(3, 3), strides=(2, 2), padding='same')

with tf.Session() as sess:
    saver = tf.train.Saver()
    saver.restore(sess, './model.ckpt') # 加载训练好的模型参数
    img, label = mnist.train.next_batch(1)
    img = img.reshape([-1, 28, 28, 1])
    img_re = sess.run(output, feed_dict={inputs: img})
    plt.imshow(np.squeeze(img_re))
    plt.show()

上述代码中,我们加载训练好的28×28的MNIST模型参数,将一张手写数字的图片resize到28×28的大小,将它输入到经过拓宽、反卷积的 output 中,生成一张数字放大后的可视化图像。可以看到,这张图片经过反卷积后,已经放大到了56×56的大小,并清晰可见。