内容简介:先上结论:在我们测试mnist上,3层卷积+dropXXX,所有参数均为改变的情况下,可以提升mnist准确率1~2点;同样在近期的实际业务中,也取得了相当不错的结果,模型鲁棒性有明显提升十月份天气凉爽的时候,网上出现了一篇挺有意思的文章:
先上结论:
在我们测试mnist上,3层卷积+dropXXX,所有参数均为改变的情况下,可以提升mnist准确率1~2点;同样在近期的实际业务中,也取得了相当不错的结果,模型鲁棒性有明显提升
十月份天气凉爽的时候,网上出现了一篇挺有意思的文章: https://arxiv.org/pdf/1810.12890.pdf
Google Brain提出了一种新的正则化方法:DropBlock,一图说明原理:
我们平时使用更多的是经典的dropout,即在像素级别上加入一个 bernoulli
噪声信息,mask部分feature map的像素点(图b),但实际上我们的语义信息是完整、连续的,我们更希望其mask能够彻底block到某一块语义信息,从而提升其他部分的信息权重,实现模型正则约束泛化(图c),这样就诞生了 DropBlock。
这倒是让我想起来之前很推崇的一个数据增强方法: random erase
其思路是在原图上进行随机遮盖,从而实现模型能力泛化,而本质上input image就是第一层feature map,所以DropBlock可以认为是广义的Random Erase
实际上从之前的一些类似drop策略的文章上我们可以列举出一堆方法,作者也是在文章中一一提出并做了相应的策略比较:
- Dropout:完全随机扔
- SpatialDropout:按channel随机扔
- Stochastic Depth:按res block随机扔
- DropBlock:每个feature map上按spatial块随机扔
- Cutout:在input层按spatial块随机扔
- DropConnect:只在连接处扔,神经元不扔。
文章中,作者也是没有随意进行处理,而是选择有效的区域进行mask:
而在效果提升方面,作者对比了其性能效果:
为了解释相应的网络泛化能力,模型还对图像做了响应区域解释:
可以明显发现,加入DropBlock之后,有效响应明显增强(但同时可能引来未可知的噪声?)
在目标检测方面,模型性能也同样有较好的性能提升:
分割效果:
(当然了fine-tune还是优秀)
我们自己亲自做一下实验:
这里,我们采用mnist来测试,非常简单的网络对飙dropout:
首先使用 tensorflow.keras.layer
做一个实现:
import tensorflow as tf from tensorflow.python.keras import backend as K class DropBlock(tf.keras.layers.Layer): def __init__(self, keep_prob, block_size, **kwargs): super(DropBlock, self).__init__(**kwargs) self.keep_prob = float(keep_prob) if isinstance(keep_prob, int) else keep_prob self.block_size = int(block_size) def compute_output_shape(self, input_shape): return input_shape def build(self, input_shape): _, self.h, self.w, self.channel = input_shape.as_list() # pad the mask bottom = right = (self.block_size - 1) // 2 top = left = (self.block_size - 1) - bottom self.padding = [[0, 0], [top, bottom], [left, right], [0, 0]] self.set_keep_prob() super(DropBlock, self).build(input_shape) def call(self, inputs, training=None, scale=True, **kwargs): def drop(): mask = self._create_mask(tf.shape(inputs)) output = inputs * mask output = tf.cond(tf.constant(scale, dtype=tf.bool) if isinstance(scale, bool) else scale, true_fn=lambda: output * tf.to_float(tf.size(mask)) / tf.reduce_sum(mask), false_fn=lambda: output) return output if training is None: training = K.learning_phase() output = tf.cond(tf.logical_or(tf.logical_not(training), tf.equal(self.keep_prob, 1.0)), true_fn=lambda: inputs, false_fn=drop) return output def set_keep_prob(self, keep_prob=None): """This method only supports Eager Execution""" if keep_prob is not None: self.keep_prob = keep_prob w, h = tf.to_float(self.w), tf.to_float(self.h) self.gamma = (1. - self.keep_prob) * (w * h) / (self.block_size ** 2) / \ ((w - self.block_size + 1) * (h - self.block_size + 1)) def _create_mask(self, input_shape): sampling_mask_shape = tf.stack([input_shape[0], self.h - self.block_size + 1, self.w - self.block_size + 1, self.channel]) mask = DropBlock._bernoulli(sampling_mask_shape, self.gamma) mask = tf.pad(mask, self.padding) mask = tf.nn.max_pool(mask, [1, self.block_size, self.block_size, 1], [1, 1, 1, 1], 'SAME') mask = 1 - mask return mask @staticmethod def _bernoulli(shape, mean): return tf.nn.relu(tf.sign(mean - tf.random_uniform(shape, minval=0, maxval=1, dtype=tf.float32)))
首先做个脚本测试:
import tensorflow as tf from dropblock import DropBlock tf.enable_eager_execution() # only support `channels_last` data format a = tf.ones([2, 10, 10, 3]) drop_block = DropBlock(keep_prob=0.8, block_size=3) b = drop_block(a, training=True) print(a[0, :, :, 0]) print(b[0, :, :, 0])
结果也很明显,可以实现dropblock
结论:
在我们测试mnist上,3层卷积+dropXXX,所有参数均为改变的情况下,可以提升mnist准确率1~2点;同样在近些填的实际业务中,也取得了相当不错的结果,模型鲁棒性有明显提升。
以上所述就是小编给大家介绍的《新的正则化神器:DropBlock(Tensorflow实践)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 带答案面经分享-L1正则&L2正则
- 神经网络中的网络优化和正则化(四):正则化
- 正则表达式 – 如何使用正则表达式进行Erlang模式匹配?
- 正则表达式创建方式的区别及编写简单的正则方式(js学习总结)
- MySQL 优化神器
- ppt 神器 reveal
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java语言精粹
Jim Waldo / 王江平 / 电子工业出版社 / 2011-6 / 39.00元
这是一本几乎只讲java优点的书。 Jim Waldo先生是原sun微系统公司实验室的杰出工程师,他亲历并参与了java从技术萌生、发展到崛起的整个过程。在这《java语言精粹》里,jim总结了他所认为的java语言及其环境的诸多精良部分,包括:类型系统、异常处理、包机制、垃圾回收、java虚拟机、javadoc、集合、远程方法调用和并发机制。另外,他还从开发者的角度分析了在java技术周围......一起来看看 《Java语言精粹》 这本书的介绍吧!