3年前开发移动端卷积神经网络SDK,使用GPU实现卷积神经网络的各种算子,Android/iOS双端都实现了,性能非常不错,实时风格画和实时抠图接近50FPS,今天无意中翻到当初的笔记才发现好久没碰AI了,于是汇总下当做记录,也希望能对大家有所帮助。
卷积神经网络
下面这个是LeNet, 最早的卷积神经网络之一
卷积神经网络其实和传统神经网络是一脉相承的,只不过多了很多元素,比如激励层(非线性), 卷积层(提炼特征)等等. 卷积网络计算过程的动画如下
卷积
原理
卷积有两个部分,一个图像一个是卷积核,卷积核对图像做平移卷积计算输出新的图像的过程就是卷积,我们来看下一个卷积过程的动画。
其实图像的卷积和信号系统中的卷积有类似性。我们知道信号系统中,卷积的定义如下
卷积的过程就是把其中一个函数翻转后平移做乘法计算各个点的卷积值。那么在图像上卷积核就是g(x, y), 图像是f(x, y), 理论上就需要对卷积核g(x,y)进行上下左右翻转,但是我们在实际操作的时候为啥没有做翻转的动作呢?这是因为我们在training卷积神经网络时,初始卷积核是一个随机值/0值,卷积核的值是整个系统training的过程的产生的。既然初始值是随机的,是否翻转没有意义,最后整个系统损失函数值最小时得到的卷积核本质上就是翻转后的值的。从效果上说,卷积核可以看成是图像滤波器。
卷积过程动画
卷积神经网络的卷积具体计算就是卷积核和图像的值进行点积运算,得到相应的像素点的值。卷积相关的参数有padding, stride,卷积核大小