一、卷积操作:
假设cnn中某一层:
输入特征图:H*H,
卷积核:k*k,
步长stride:s,
padding:p
那么经过这层卷积之后特征图大小:(H-k+2*p)/ s + 1
二、Transposed convolution(逆卷积)
逆卷积先根据输入H,k,s,p 得到相应的H',k',s',p',然后执行和卷积一样的变化。例如:
逆卷积输入: 变化后:
特征图:H*H 特征图:H’ * H' (H' = H + (s-1)*(H-1),对应差值操作,在相邻行、列之间插入(s-1)零)
卷积核:k*k 卷积核:k' * k' (k' = k,卷积核大小不变)
步长stride:s 步长stride:s' (s' = 1,不管之前s是多少,s'永远都是1)
padding:p padding:p' (p' = k - p - 1)
三、具体例子
特征图:5 * 5 * 1
定义一层卷积 conv1:nn.Conv2d(1,16,kernel_size=(3,3),stride=(2,2),padding=(1,1))
特征图经过conv1之后变成:3 * 3 * 16
那么逆卷积就是将 3*3*16 变回 5*5*1 的特征图
定义逆卷积 t_conv1:nn.ConvTranspose2d(16,1,kernel_size=(3,3),stride=(2,2),padding=(1,1))
注意:逆卷积层的定义与紧邻的卷积的kernel_size,stride,padding相同,通道正好相反
ConvTranspose2d内部实现(对照上面的逆卷积):
逆卷积输入: 变换后: 逆卷积操作:(5-3+2*1)/ 1 + 1 = 5 也就是3*3转换成5*5
特征图:3*3 特征图:5*5 (5 = 3+(2-1)*(3-1))
卷积核:3*3 卷积核:3*3
步长stride:2 步长stride:1
padding:1 padding:1 (1 = 3-1-1)
带outpadding的计算:公式
详解outpadding