paddlepaddle中关于Resnet复现的实际解决代码
1. 遍历模块初始化部分
pytorch代码:
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
elif isinstance(m, nn.BatchNorm2d):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
paddle代码:
for m in self.modules():
if isinstance(m, nn.Conv2d):
n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
m.weight.data.normal_(0, math.sqrt(2. / n))
elif isinstance(m, BatchNorm):
m.weight.data.fill_(1)
m.bias.data.zero_()
或者:
for m in self.modules():
if isinstance(m, nn.Conv2d):
n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
m.weight.data.normal_(0, math.sqrt(2. / n))
elif isinstance(m, BatchNorm):
m.weight.data.fill_(1)
m.bias.data.zero_()
2. 模块初始化
pytorch版本:
for n, m in self.layer4.named_modules():
if 'conv2' in n: # conv1 for resnet34
m.dilation, m.padding, m.stride = (2, 2), (2, 2), (1, 1)
elif 'downsample.0' in n:
m.stride = (1, 1)
paddlepaddle版本:
for n, m in self.layer4.named_sublayers():
if 'conv2' in n: # conv1 for resnet34
m.dilation = fluid.initializer.ConstantInitializer(value=[2,2])
m.padding = fluid.initializer.ConstantInitializer(value=[2,2])
m.stride = fluid.initializer.ConstantInitializer(value=[1,1])
elif 'downsample.0' in n:
m.stride = fluid.initializer.ConstantInitializer(value=[1,1])
该博客介绍了如何在PaddlePaddle框架中复现ResNet模型的初始化过程,包括对卷积层和批量归一化层的初始化。在PyTorch和PaddlePaddle中,代码有所不同。对于卷积层,使用不同的方法进行权重初始化,而在批量归一化层,设置权重和偏置的初始值。同时,详细对比了PyTorch和PaddlePaddle中设置ResNet层4的子模块参数的差异。
1815





