摘要:
最近写了一篇文章,reviewers给了几个意见,其中之一就是:不同配置下的网络初始化条件是否相同,是怎样初始化的?
之前竟然没有关注过这个问题,应该是torch默认情况下会初始化卷积核参数,这里详细讲解一下torch卷积操作的初始化过程。
1. pytorch中的卷积运算分类
在pycharm的IDE中,按住ctrl+鼠标点击torch.nn.Conv2d可以进入torch的内部卷积运算的源码(conv.py)
搭建网络经常使用到的模块如下图所示:
class _ConvNd(Module):
class Conv1d(_ConvNd):
class Conv2d(_ConvNd):
class Conv3d(_ConvNd):
class _ConvTransposeNd(_ConvNd):
class ConvTranspose1d(_ConvTransposeNd):
class ConvTranspose2d(_ConvTransposeNd):
class ConvTranspose3d(_ConvTransposeNd):
可以看到:常用的卷积的父类均是
class _ConvNd(Module):
并且点开 class Conv2d(_ConvNd): 并没有发现参数初始化的具体方法,如下图所示。
所以猜想卷积初始化参数的方法应该在父类 _ConvNd(Module):
2. pytorch中的卷积操作的父类
下面是父类 _ConvNd 的源码,其中初始化参数的 方法是
def reset_parameters(self) -> None:
class _ConvNd(Module):
__constants__ = ['stride', 'padding', 'dilation', 'groups',
'padding_mode', 'output_padding', 'in_channels',
'out_channels', 'kernel_size']
__annotations__ = {'bias': Optional[torch.Tensor]}
def _conv_forward(self, input: Tensor, weight: Tensor, bias: Optional[Tensor]) -> Tensor:
...
_in_channels: int
out_channels: int
kernel_size: Tuple[int, ...]
stride: Tuple[int, ...]
padding: Tuple[int, ...]
dilation: Tuple[int, ...]
transposed: bool
output_padding: Tuple[int, ...]
groups: int
padding_mode: str
weight: Tensor
bias: Optional[Tensor]
def __init_