Pytorch如何实现常⽤正则化
Stochastic Depth
论⽂:
本⽂的正则化针对于ResNet中的残差结构,类似于dropout的原理,训练时对模块进⾏随机的删除,从⽽提升模型的泛化能⼒。
对于上述的ResNet⽹络,模块越在后⾯被drop掉的概率越⼤。正则化解决过拟合
作者直觉上认为前期提取的低阶特征会被⽤于后⾯的层。
第⼀个模块保留的概率为1,之后保留概率随着深度线性递减。
对⼀个模块的drop函数可以采⽤如下的⽅式实现:
def drop_connect(inputs, p, training):
""" Drop connect. """
if not training: return inputs # 测试阶段
batch_size = inputs.shape[0]
keep_prob = 1 - p
random_tensor = keep_prob
random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype, device=inputs.device)
# 以样本为单位⽣成模块是否被drop的01向量
binary_tensor = torch.floor(random_tensor)
# 因为越往后越容易被drop,所以没有被drop的值就要通过除keep_prob来放⼤
output = inputs / keep_prob * binary_tensor
return output
在Pytorch建⽴的Module类中,具有forward函数
可以在forward函数中进⾏drop:
def forward(self, x):
x=...
if stride == 1 and in_planes == out_planes:
if drop_connect_rate:
x = drop_connect(x, p=drop_connect_rate, aining)
x = x + inputs # skip connection
return x
主函数:
for idx, block in enumerate(self._blocks):
drop_connect_rate = self._global_params.drop_connect_rate
if drop_connect_rate:
drop_connect_rate *= float(idx) / len(self._blocks)
x = block(x, drop_connect_rate=drop_connect_rate)
补充:pytorch中的L2正则化实现⽅法
搭建神经⽹络时需要使⽤L2正则化等操作来防⽌过拟合,⽽pytorch不像TensorFlow能在任意卷积函数中添加L2正则化的超参,那怎么在pytorch中实现L2正则化呢?
⽅法如下:超级简单!
optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=5.0)
torch.optim.Adam()参数中的 weight_decay=5.0 即为L2正则化(只是pytorch换了名字),其数值即为L2正则化的惩罚系数,⼀般设置为1、5、10(根据需要设置,默认为0,不使⽤L2正则化)。
注:
pytorch中的优化函数L2正则化默认对所有⽹络参数进⾏惩罚,且只能实现L2正则化,如需只惩罚指定⽹络层参数或采⽤L1正则化,只能⾃⼰定义。。。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论