反卷积操作:
首先对需要进行维度扩张的feature_map 进行补零操作,然后使用3*3的卷积核,进行卷积操作,使得其维度进行扩张,图中可以看出,2*2的feature经过卷积变成了4*4. 3*3的卷积经过扩张以后形成了5*5
feature_map为偶数 feature_map为偶数
代码:主函数
with tf.variable_scope('deconv1'):
# [4, 4, 128, 256]卷积核的大小,4和4表示卷积核的长度,128表示卷积核的个数,256表示卷积核的通道数, [self.batch_size, 64, 64, 128]表示输出层的维度, 2表示1/2的步长
x = deconv_layer(x, [4, 4, 128, 256], [self.batch_size, 64, 64, 128], 2)
x = batch_normalize(x, is_training)
x = tf.nn.relu(x)
调用函数deconv_layer, 个人理解,这里stride的大小,表示的不是补零后卷积核的步长,而是对原始feature的补零的倍数,即扩张的大小
def deconv_layer(x, filter_shape, output_shape, stride):
# 构造卷积
filters = tf.get_variable(
name = 'weight',
shape=filter_shape,
dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.1),
trainable=True
)
return tf.nn.conv2d_transpose(x, filters, output_shape, [1, stride, stride, 1])