一共分为五个部分:
1、基础CNN,如ReLU、卷积、池化、标准化处理;
2、负反馈、偏导;
3、通过一个小的CNN模型介绍训练数据、标签、图像预处理、下降梯度等
4、可以识别字母的CNN。涉及数据预处理、初始化网络、训练和验证CNN、对特征的可视化、对model的应用\mini-batch数据的构建,以及data jitter;
5、是我最关心的pretrained model,用此model进行image的classification。
第一部分:CNN
1、提供的例子随机生成了10个5*5*3的filter,其中3是对应RGB图片的三通道,然后将filter和image进行卷积计算。
image: 384*512*3
filter: 5*5*3*10
output y: 380*508*10(这里有个问题为什么三通道的输出竟然只有一个通道?)
将y可视化,发现提取的特征对边界很敏感:
对y进行downsample,采样步长为16,y的size为24*32*10,因为大小与原来的不同,所以再进行填0处理。经过pad处理之后发现大小与原来的图像不同。
2、在用Relu作为激励函数,z = Relu(y),得到下图:(官网上问为啥要用relu,其实我也不知道。。。。抄别人的
不用simgoid和tanh作为激活函数,而用ReLU作为激活函数的原因是:加速收敛。
因为sigmoid和tanh都是饱和(saturating)的。何为饱和?个人理解是把这两者的函数曲线和导数曲线plot出来就知道了:他们的导数都是倒过来的碗状,也就是,越接近目标,对应的导数越小。而ReLu的导数对于大于0的部分恒为1。于是ReLU确实可以在BP的时候能够将梯度很好地传到较前面的网络。
http://blog.csdn.net/liulina603/article/details/44915905
3、池化 pooling
4、normalisation
Part 2 反向传播和偏导数
这个网址的前馈和负反馈讲的很透彻read:http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html。
当负反馈计算出所有神经节点的错误的时候,就需要对每个节点的权值w进行调整。如下两图所示:
用下面的代码计算负反馈,得到dzdx和dzdw,他们的size和x、w相同。
[dzdx, dzdw]=vl_nnconv(x, w,[], dzdy);
part3
tiny CNN例子
导入图片 480*480*3,进行标记,圆点的中心点为pos,非点的地方为neg,每一个圆除了中间点,其他的点都没有被标记。
pos类,标记为1,neg类标记为0。
定义object方程
运行程序,得到下图
Is the objective function minimised monotonically? 图1-3-1 代表object 方程,是单调递减的
As the histograms evolve, can you identify at least two "phases" in the optimisation? 图1-3-2 是pos和neg的直方图,两个分布的波峰分别在0和1 附近。
之前有问题Explain why the momentum rate must be smaller than 1,我试了一下大于1的数字,发现波峰都不知道飘到哪里去了,反正不在0和1附近。
如果把图像预处理阶段的smooth步骤去掉,可以得到更好的objective的曲线,但是histogram图不好,learned filter也和之前的不一样。。。
我认为教程想表达的意思是smooth之后的图像,更容易响应高斯滤波器???但是我觉得结果也挺好呀。每个pos的点都有响应呀,如下图的最后一幅图
但是省略去掉平均值这一预处理步骤,就不能达到检测的目的
- Reduce a hundred-fold the learning are and increase the maximum number of iterations by an equal amount. Does it get better?
- 将rate = 0.05, iter = 1000 结果比刚才好很多。