【新智元导读】本文作者是阿里工程师,文章分别形象解说“卷积”和“神经网络”的概念,手绘卷积神经网络图,层层递进详细解读。最后以手写数字识别为例,使用keras库,例如kaggle数据集实现CNN,并附上代码和数据集。 一、卷积 我们在2维上说话。有两个的函数 f(x, y) 和 g(x, y)。f 和 g 的卷积就是一个新的的函数。通过下式得到:
这式子的含义是:遍览从负无穷到正无穷的全部 s 和 t 值,把 g 在 位置上的值乘上 f 在 (s, t) 位置上的值之后“加和”(积分意义上)到一起,就是为 c 在 (x, y) 位置上的值。说白了卷积就是一种“加权求和”。以 (x, y) 为中心,把 g 距离中心 位置上的值乘上 f 在 (s, t) 的值,最后加到一起。把卷积公式写成离散形式就更清楚了:
如果表示一幅 100×100 大小的灰度图像,取值 [0, 255] 区间内的整数,是图像在 (x, y) 的灰度值。范围外的 (x, y) 上的值全取0。令在 s 和 t 取 {-1,0,1}的时候有值,其他位置全是0。可以看作是一个 3×3 的网格。如下图:
图1 每个小格子里的值就是图像在 (x, y)的灰度值。每个小格子里的值就是在(s, t)的值。 图2 如上图所示,将的中心(0, 0)对准的(5, 6)。把和对应的9个位置上各自的函数值相乘,再将9个乘积加在一起,就得到了卷积值 C (5, 6)。对的每一个位置求 C值,就得到了一幅新的图像。其中有两个问题: 如果的所有值之和不等于1.0,则 C值有可能不落在 [0,255] 区间内,那就不是一个合法的图像灰度值。所以如果需要让结果是一幅图像,就得将归一化——令它的所有位置之和等于1.0; 对于边缘上的点,有可能它的周围位置超出了图像边缘。此时可以把图像边缘之外的值当做0。或者只计算其周围都不超边缘的点的 C。这样计算出来的图像 C就比原图像小一些。在上例中是小了一圈,如果覆盖范围更大,那么小的圈数更多。 上述操作其实就是对数字图像进行离散卷积操作,又叫滤波。称作卷积核或滤波器。不同的滤波器起不同的作用。想象一下,如果的大小是 3×3,每个格子里的值都是1/9。那么滤波就相当于对原图像每一个点计算它周围 3×3 范围内9个图像点的灰度平均值。这应该是一种模糊。看看效果:
图3 左图是 lena 灰度原图。中图用 3×3值都为1/9的滤波器去滤,得到一个轻微模糊的图像。模糊程度不高是因为滤波器覆盖范围小。右图选取了 9×9 值为1/81的滤波器,模糊效果就较明显了。滤波器还有许多其他用处。例如下面这个滤波器:
尝试用它来滤 lena 图。注意该滤波器没有归一化(和不是1.0),故滤出来的值可能不在[0,255]之内。通过减去最小值、除以最大/最小值之差、再乘以255并取整,把结果值归一到[0,255]之内,使之成为一幅灰度图像。
图4 该滤波器把图像的边缘检测出来了。它就是 Sobel算子。图像模糊、边缘检测等等都是人们设计出来的、有专门用途的滤波器。如果搞一个 9×9 的随机滤波器,会是什么效果呢?
图5 如上图,效果也类似于模糊。因为把一个像素点的值用它周围 9×9 范围的值随机加权求和,相当于“捣浆糊”。但可以看出模糊得并不润滑。 (责任编辑:本港台直播) |