bilinear kernel
def bilinear_kernel(in_channels,out_channels,kernel_size):
'''
return a bilinear kernel tensor ( tensor: (in_channels,out_channels,kernel_size,kernel_size) )
返回双线性插值核,用来初始化反卷积层中卷积核的参数
'''
#先生成一层双线性插值核
factor = (kernel_size + 1) // 2
if kernel_size % 2 == 1:
center = factor - 1
else:
center = factor - 0.5
og = np.ogrid[:kernel_size,:kernel_size]
fliter = (1 - abs(og[0] - center) / factor) * (1 - abs(og[1] - center) / factor) #此公式似懂非懂,难!!!
#赋值到每个卷积核的每个通道
weight = np.zeros((in_channels,out_channels,kernel_size,kernel_size),dtype='float32')
weight[range(in_channels),range(out_channels),:,:] = fliter
return torch.from_numpy(weight)
#使用双线性插值核来初始化反卷积层的参数
deconv = nn.ConvTranspose2d(3,3,4,stride = 2,padding = 1)
deconv.weight.data = bilinear_kernel(3,3,4)