Oh,好久不更新,接下来说一说我最近的在做的其中的一个事情吧~
问题描述: 给我2000张带噪音的手写数字图片,如下图所示。要求我训练一个模型,使其能在测试集10000张带噪音的手写数字图片,取得较好的效果。
一、图片预处理
通过分析可以知道这是高斯噪音,高斯噪音的形成为:一个正太分布的随机数与原图相加,即可使图片拥有高斯噪音。
添加高斯噪音的Python代码为:
|
|
消除高斯噪音,我有两种思路。
-
直接对图片二值化(大于0.4的像素点为1,小于0.4的像素点为0)
-
使用高斯滤波之后,做一个简单的去背景噪声,使用高斯滤波器核心代码
cv2.GaussianBlur(noise,(3,3),0)
二、数据增强
数据增强有一个非常好使的库,名字为imgaug
,接下来我说一下基本用法吧。
|
|
只需三行,方可入手。超级简单有么有~。如果需要查看更多增强方式,请看这个博客,讲的非常详细。
三、搭建模型
对于自己瞎玩可以随便搭建模型,但是这是一个比赛,可需要认真一点了。Kaggle上曾有人证明最优28×28的网络的形状,详细过程可以参考这篇博客,这里我直接说结论了,下图是Tensorflow代码,易读性很器的。
|
|
该模型三个特点:
- 连续使用2个3×3卷积层,增加了网络的判别能力。
- 使用卷积核为5,步长为2的卷积层代替池化层,增加的网络的性能。
- 使用批归一化层和Dropout层,防止模型过拟合的同时,增加了网络性能。
四、模型集成
老师说:团结就是力量,模型当然也是,一个CNN的力量有限的,这篇文章使用Bagging的训练的15个CNN进行集成,达到了前所未有的信高度
对于该问题来说,同样如此,所以我训练了10个CNN进行集成。部分代码如下所示:
|
|
Tip
全部代码公布在Kaggle上了,点击出发。