dropblock的实现:pytorch中卷积网络的正则化方法。
dropblock的Python项目详细描述
DropBlock
实现DropBlock: A regularization method for convolutional networks 在火把里。
摘要
当深度神经网络被过度参数化时,它们通常工作得很好。 经过大量的噪声和正则化训练,比如 体重下降。虽然辍学被广泛地用作一种正则化 对于完全连接的层,它通常对卷积层不太有效。 卷积层退学的失败可能是由于 卷积层中的激活单元是空间相关的,所以 尽管辍学,信息仍然可以通过卷积网络流动。 因此,需要一种结构形式的辍学来正则化卷积网络。 在本文中,我们引入了dropblock,一种结构化的dropout形式,其中 将要素地图的相邻区域放在一起。 我们发现在skip连接中应用dropblock除了 卷积层提高了精度。而且,逐渐增加的数量 在训练过程中减少单位的数量,可以获得更好的精度和对超参数选择的鲁棒性。 大量实验表明,dropblock在正则化方面优于dropout。 卷积网络。关于imagenet分类,resnet-50架构 dropblock的准确率达到78.13%,比基线提高了1.6%以上。 在coco检测中,dropblock将视网膜网的平均检测精度从36.8%提高到38.4%。
安装
直接从pypi安装:
pip install dropblock
或者是github的最新版本:
pip install git+https://github.com/miguelvr/dropblock.git#egg=dropblock
note:实现和测试是在python 3.6中完成的,如果您对其他版本的python有问题,请打开一个问题。
用法
对于二维输入(dropblock2d):
importtorchfromdropblockimportDropBlock2D# (bsize, n_feats, height, width)x=torch.rand(100,10,16,16)drop_block=DropBlock2D(block_size=3,drop_prob=0.3)regularized_x=drop_block(x)
对于3D输入(DropBlock3D):
importtorchfromdropblockimportDropBlock3D# (bsize, n_feats, depth, height, width)x=torch.rand(100,10,16,16,16)drop_block=DropBlock3D(block_size=3,drop_prob=0.3)regularized_x=drop_block(x)
预定的DropBlock:
importtorchfromdropblockimportDropBlock2D,LinearScheduler# (bsize, n_feats, depth, height, width)loader=[torch.rand(20,10,16,16)for_inrange(10)]drop_block=LinearScheduler(DropBlock2D(block_size=3,drop_prob=0.),start_value=0.,stop_value=0.25,nr_steps=5)probs=[]forxinloader:drop_block.step()regularized_x=drop_block(x)probs.append(drop_block.dropblock.drop_prob)print(probs)
下降概率为:
>>> [0. , 0.0625, 0.125 , 0.1875, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25]
用户应该在批处理循环开始时包含step()
调用,
或者在模型的forward
调用开始时。
检查examples/resnet-cifar10.py到 请参见实现示例。
实施细节
我们优先使用drop_prob
而不是keep_prob
,
为了让这场争论与皮托的退学保持一致。
不管怎样,其他的一切工作方式都应该与本文所描述的类似。
基准
请参阅BENCHMARK.md
参考
[Ghiasi等人,2018]dropblock:卷积网络的正则化方法
待办事项
- [X]定时DropBlock
- [X]获取基准数字
- [X]扩展3D图像的概念