深度学习中有一个很重要的概念就是卷积神经网络 CNN,卷积神经网络中又有卷积层、池化层的概念。尤其是卷积层,理解难度比较大,虽然书中或者是视频中都有详细介绍过它的基础概念,但对于求知欲望很强烈的我,我总心里痒痒的,总想亲手实现,看看效果,怕的就是自己会眼高手低,做技术人最可怕的就是眼高手低。所以,我打算用 python 来亲自验证一遍。
什么是卷积?
卷积(convolution)是数学知识,概率论和信号与系统中都有涉及。卷积的公式如下:
连续信号:
y ( t ) = x ( t ) ∗ h ( t ) = ∫ − ∞ ∞ x ( p ) ∗ h ( p − t ) y(t)=x(t)\ast h(t)=\int_{-\infty}^\infty x(p)*h(p-t) y(t)=x(t)∗h(t)=∫−∞∞x(p)∗h(p−t)
离散信号
y ( n ) = ∑ i = − ∞ ∞ x ( i ) ∗ h ( n − i ) y(n) = \sum_{i=-\infty}^{\infty} x(i)*h(n-i) y(n)=i=−∞∑∞x(i)∗h(n−i)
卷积会由两个原函数产生一个新的函数,两个函数之间的这种操作就称着卷积,卷积的数学意义与物理意义这里不过多讲述,因为展开来讲的话可以另外写一篇博文了,不熟悉的同学大家点击这里,我们把目标放在图像的卷积操作之上。
需要说明的是,图像处理中的卷积对应的是离散卷积公式。
图像的卷积操作
我们假设有一张图片,我们称之为输入图片,我们对原图片进行某种卷积操作之后会得到另外一张图片,我们称这张图片为输出图片。
一般的,我们通过对图片进行卷积操作,可以对图片进行某种效果的增强或者是减弱。比如说图片的模糊、锐化、浮雕效果等等。
当然,也可以发现图片中某些特征,如查找物体的边缘信息。而深度学习做的最重要的工作之一就是发现数据的特征,这也是卷积神经网络诞生的原因。
那么对于一张图片而言,卷积操作是如何进行的呢?
什么是卷积核?
一张图片进行卷积后的显示效果,绝大部分取决于它的卷积核(kernel)。那么,什么是卷积核呢?
其实卷积核并没有什么神秘的,它是一个 2 维数组。它的行数和列数相同并且数值为奇数。
上面就是一个 3x3 的卷积核,它的核大小(kernel size) 为 3。它里面的元素值代表不同的权值。
一般而言,卷积核里面所有元素之和等于 1,当然你也可以不让它等于 1,大于 1时生成的图片亮度会增加,小于 0 时生成的图片亮度会降低。
那么,卷积核是如何作用在一张图之上的呢?
一句话描述就是:针对输入图片中单个像素,将它的值由周围邻近的像素值加权平均。而这种加权平均的操作产生的新的像素值按照次序可以产生一张新的输出图片。
需要注意的是,在深度学习当中,只需要逐元素相乘再相加就可以了,不需要对结果取均值,我在本文采取求平均数,只为了示例的演示效果
再来说说何为加权平均?
[1,2,3,4,5]
有 5 个数,加权平均就是
( 1 ∗ w 1 + 2 ∗ w 2 + 3 ∗ w 3 + 4 ∗ w 4 +