这里写自定义目录标题
- 发现问题
- 为何是输入层特征为偶数?是否通用?
- 查看他人讲解
最近在学习深度聚类,学习到文章网络DCEC(卷积自编码器进行深度聚类),采用卷积自编码器进行print model.summary时,出现特征图无法完全还原问题如下:
如图,输入为一个(127,127,3)的特征图,最终经过上采样得到的却是(121,121,3)的特征图。
发现问题
通过对代码进行手动计算,卷积层输出大小与转置卷积层输出大小如下(懒得打字了):
最终发现问题出现在:
代码第一行的意义是:如果输入的特征层第一维是偶数的话,out_padding填充1,否则不需要填充,即out_padding=0。(本文特征大小是正方形,后续有空的话会出矩形特征图的写法)
为何是输入层特征为偶数?是否通用?
于是我又改变了卷积核,步长等,发现问题又出现了。。还是不能完全还原。。
写了一个输入输出的测试代码:
import numpy as np
input_size=15
padding=2
kernel_size=5
strides=2
print(input_size)
# 卷积输出大小
output_size=int(np.floor(( input_size + padding * 2 - kernel_size ) / strides )+ 1)
print(output_size)
# 转置卷积输出大小
out_padding = 1 if output_size % 2 ==0 else 0
output_size2=(output_size-1)*strides+kernel_size -2*padding+out_padding
print(output_size2)
得到结果:
依然没法还原,看来out_paddig还是不对。
查看他人讲解
主要意思是这一句,这个参数在做步长为1的反卷积时是不用在意的。然而当步长大于1了,就需要手动设置以免网络出错。
添加链接描述
也就是说,out_padding的计算公式是没有什么用的,主要办法还是手动计算,那么如何手动计算呢?我的理解是:
out_padding=input_size(卷积层输入大小)-output_size(反卷积层不加out_padding时的大小)
即:
import numpy as np
input_size=15
padding=2
kernel_size=5
strides=2
print(input_size)
# 卷积输出大小
output_size=int(np.floor(( input_size + padding * 2 - kernel_size ) / strides )+ 1)
print(output_size)
# 转置卷积输出大小
output_size1=(output_size-1)*strides+kernel_size -2*padding
out_padding = abs(input_size-output_size1)
print('out_padding:',out_padding)
output_size2=(output_size-1)*strides+kernel_size -2*padding+out_padding
print(output_size2)
这样,无论输入大小为多少。反卷积都可以还原为原始输入特征大小