这段时间学习了很多有关图像识别和分类的知识,在此做一下总结。
Numpy操作
这里主要说说可能用的比较少的操作:
Numpy.flipud() 上下方向旋转数组
Numpy.fliplr() 左右方向旋转数组
Numpy.cumsum()累加求和,可以传入相应的唯度
Numpy.meshgrid(x,y) 生成二维网格型数据,行数为x中元素总数,列数为y中元素总数
参考:https://zhuanlan.zhihu.com/p/33579211
|
|
Numpy.conj 求共轭值
Numpy.linalg.norm 求范数
Malplotlib 绘图
可以参考画廊地址,结合里面的例子进行自己的修改:
画廊
Xavier初始化
目的:让每一层输出的方差尽量相等,保证信息的流动
可参考这一篇博文
CNN
- 引入非线性激活函数的好处:
如果使用线性,那么输出都是输入的线性组合,这种情况无法逼近任意函数,与没有隐藏层的效果相当 - 引入Relu的好处:
- sigmoid函数用的指数运算,求导涉及除法会增加计算量
- 在sigmoid函数接近饱和区时,梯度下降会非常缓慢,导数趋于0。
- relu使一部分神经元输出为0,这样可以缓解过拟合的问题
- sigmoid函数缺点:
梯度消失: 计算输出层loss,以导数形式向上一层传递,修正参数,sigmoid函数常会导致导数为0,从而无法更新参数,优化神经网络。
输出不是zero-centered: 收敛速度减慢(待续)
运算耗时 - Relu的缺点:
输出不是zero-centered
某些神经元可能永远不会被激活,相应参数不会被修改,使用Xavier初始化方法可以解决因learning rate太高引起的无法激活的现象。全连接层
主要起到分类器的作用,可由卷积操作实现,目前更多是使用全局平均池化的方式来替代全连接层。
使用卷积层实现全连接层的好处:可以让卷积网络在输入图片上滑动,得到每个区域的输出,突破尺寸限制。滤波器总结
- 滤波器所有元素之和等于1时,图像处理后亮度保持不变,大于1时图像更亮,小于1图像变暗
- 把数值尽力控制在0-255之间,负数取绝对值处理
- 滤波器的大小应该是一个奇数
使用滤波器我们可以实现很多的图像处理操作,例如锐化,边缘检测,浮雕,模糊等
例如锐化和边缘检测: 将卷积核周边值取负,中心取正,突出中心,可以完成Tensorflow简单调试
使用tfdbg进行调试1python -m tensorflow.python.debug.examples.debug_minist --debug
进入调试状态。常用指令:
run 运行代码
li 显示变量的shape和值
pt 输出变量值
run -f has_inf_or_nan 发现nan值变量
学习过程中,接触了很多经典的图像处理神经网路,例如AlexNet,GoogleNet,Overfeat等
有几篇写的不错的博客如下:
Overfeat
AlexNet论文
AlexNet算法体系