转置卷积又被成为反卷积。
卷积过程:Input:4*4,Kernel:3*3,Output:2*2
- 反卷积从宏观角度命名,首先将
2*2输入矩阵重新排列成4*1,再将3*3重新排列成4*16的卷积核转置为16*4,两者运算得到16*1的矩阵经过重新排列最终得到4*4矩阵。- 转置卷积从具体实现方法命名,即卷积操作中将
3*3的卷积核重新排列成4*16的卷积核;而反卷积操作将4*16的卷积核转置为16*4的反卷积核矩阵。
一、反卷积的数学推导
反卷积并非常规卷积的逆过程,即对常规卷积的输出进行反卷积,只能得到与常规卷积输入矩阵相同尺寸的矩阵,但里面的元素不一定相同。
反卷积是特殊的正向卷积,先按照一定的比例通过补0来扩大输入尺寸,接着旋转卷积核再进行正向卷积。
1、正向卷积实现过程
假设输入图像 尺寸为
,元素矩阵为:
;卷积核
尺寸为
,元素矩阵为:
。步长
,填充
,即
。依据卷积的计算公式
,输出图像
的尺寸为
。
2、用矩阵乘法描述卷积
把的元素矩阵展开成一个列向量
:
把的元素矩阵展开成一个列向量
:
对于输入的元素矩阵和输出的元素矩阵
,用矩阵运算描述这个过程:
通过推导,得到稀疏矩阵:
反卷积的操作就是要对这个矩阵运算过程进行逆运算,即通过和
得到
,根据各个矩阵的尺寸大小,推导出反卷积的计算过程:
但是代入数学计算之后发现,反卷积的操作只是恢复了矩阵的尺寸大小,并不能恢复
的每个元素值。
3、反卷积输入输出尺寸关系
关系一:若
,则
;
尺寸为
,卷积核
尺寸为
,步长
,填充
,即
,则输出
的尺寸为
。
关系二:若
,则
;
尺寸为
,卷积核
尺寸为
,步长
,填充
,即
,则输出
的尺寸为
。
二、TensorFlow实现反卷积
1、反卷积的具体计算步骤
关系一:输出尺寸
,步长
,TF函数:
transpose_conv = tf.nn.conv2d_transpose(value=input,filter=kernel,output_shape=[1,5,5,1],strides=2,padding='SAME')
当执行tf.nn.conv2d_transpose时,TF会先计算卷积类型、输入尺寸、步长和输出尺寸的关系是否成立,如果不成立会提示错误,如成立则执行如下操作:
Step1:根据步长对输入内部进行填充,
可理解为输入放大的倍数,即在
的每个元素之间填充0,0的个数
和
的关系为:
。
即在的每个元素之间填充
个0,则
。**即此时按照此方式
。
Step2:用卷积核对填充后的输入
进行步长
的正向卷积,根据正向卷积公式输出尺寸:
,得到的输出尺寸是
,与反卷积函数给出的输出尺寸相同,所以可以进行计算,
经过
的填充后得到
,计算后结果为
。与TF运行结果一致。
关系二:输出尺寸
,步长
,TF函数:
transpose_conv = tf.nn.conv2d_transpose(value=input,filter=kernel,output_shape=[1,6,6,1],strides=2,padding='SAME')
Step1:由于卷积类型是SAME,故先在外围填充一圈0:,填充后输入尺寸
与卷积核
卷积后的输出尺寸
,与输出尺寸
不一致。故需要继续填充0,TF优先在左侧核和上侧填充一排0,填充后输入变为
。
