(参考链接https://www.zhihu.com/question/39022858)
如何理解卷积神经网络(CNN)中的卷积和池化?(参考链接https://www.zhihu.com/question/49376084)
可以看看这篇文章《An Intuitive Explanation of Convolutional Neural Networks》,感觉讲的还挺详细
翻译版:[翻译] 神经网络的直观解释
链接:https://www.zhihu.com/question/49376084/answer/172483833
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
刚写完相关的文章,转载一部分过来。
来自自己的专栏:当我们在谈论数据挖掘 - 知乎专栏
CNN 其实可以看作 DNN 的一种特殊形式。它跟传统 DNN 标志性的区别在于两点,Convolution Kernel 以及 Pooling。
Convolution Kernel
卷积
说起卷积,一般我们我们接触过的都是一维信号的卷积,也就是
在信号处理中, 是输入信号, 是单位响应。于是输出信号 就是输入信号 的延迟响应的叠加。这也就是一维卷积本质:加权叠加/积分。
那么对于二维信号,比如图像,卷积的公式就是
假设现在 Convolution Kernel 大小是 ,我们就可以化简上式为
<img src="https://pic3.zhimg.com/50/v2-0770096e7d37a636be715ed9ddeeb63c_hd.jpg" data-rawwidth="352" data-rawheight="102" class="content_image" width="352">看公式不太容易明白,我们画个图看看,假如 Convolution Kernel 如下图
<img src="https://pic3.zhimg.com/50/v2-d2b2c461b55e439e3d0ee0dc974e963f_hd.jpg" data-rawwidth="103" data-rawheight="104" class="content_image" width="103">那么,从 Input Image 到 Output Image 的变化如下
<img src="https://pic3.zhimg.com/50/v2-90aa7dc35c5385b928a14ee8a464fa1a_hd.jpg" data-rawwidth="267" data-rawheight="221" class="content_image" width="267">可以看出,其实二维卷积一样也是加权叠加/积分。需要注意的是,其中 Convolution Kernel 进行了水平和竖直方向的翻转。
Convolution Kernel 的意义
Convolution Kernel 其实在图像处理中并不是新事物,Sobel 算子等一系列滤波算子,一直都在被用于边缘检测等工作中,只是以前被称为 Filter。做图像处理的同学应该有印象。
Convolution Kernel 具有的一个属性就是局部性。即它只关注局部特征,局部的程度取决于 Convolution Kernel 的大小。比如用 Sobel 算子进行边缘检测,本质就是比较图像邻近像素的相似性。
也可以从另外一个角度理解 Convolution Kernel 的意义。学过信号处理的同学应该记得,时域卷积对应频域相乘。所以原图像与 Convolution Kernel 的卷积,其实对频域信息进行选择。比如,图像中的边缘和轮廓属于是高频信息,图像中某区域强度的综合考量属于低频信息。在传统图像处理里,这是指导设计 Convolution Kernel 的一个重要方面。
CNN 的 Convolution Kernel
CNN 中的 Convolution Kernel 跟传统的 Convolution Kernel 本质没有什么不同。仍然以图像为例,Convolution Kernel 依次与 Input 不同位置的图像块做卷积,得到 Output,如下图。
同时,CNN 有一些它独特的地方,比如各种定义:
- CNN 可以看作是 DNN 的一种简化形式,即这里 Convolution Kernel 中的每一个权值就可以看成是 DNN 中的 ,且与 DNN 一样,会多一个参数 Bias
- 一个 Convolution Kernel 在与 Input 不同区域做卷积时,它的参数是固定不变的。放在 DNN 的框架中理解,就是对同一层 Layer 中的神经元而言,它们的 和 是相同的,只是所连接的节点在改变。因此在 CNN 里,这叫做 Shared Weights and Biases
- 在 CNN 中,Convolution Kernel 可能是高维的。假如输入是 维的,那么一般 Convolution Kernel 就会选择为 维,也就是与输入的 Depth 一致
- 最重要的一点,在 CNN 中,Convolution Kernel 的权值不需要提前设计,而是跟 DNN 一样利用 GD 来优化,我们只需要初始化
- 如上面所说,其实 Convolution Kernel 卷积后得到的会是原图的某些特征(如边缘信息),所以在 CNN 中,Convolution Kernel 卷积得到的 Layer 称作 Feature Map
- 一般 CNN 中两层之间会含有多个 Convolution Kernel,目的是学习出 Input 的不同特征,对应得到多个 Feature Map。又由于 Convolution Kernel 中的参数是通过 GD 优化得到而非我们设定的,于是初始化就显得格外重要了
Pooling
Pooling 的本质,其实是采样。Pooling 对于输入的 Feature Map,选择某种方式对其进行压缩。如下图,表示的就是对 Feature Map 邻域内的值,选择最大值输出到下一层,这叫做 Max Pooling。于是一个 的 Feature Map 被压缩到了 。
<img src="https://pic3.zhimg.com/50/v2-bbcea7d03f0ebd97c7d07c5d133fab5d_hd.jpg" data-rawwidth="364" data-rawheight="205" class="content_image" width="364">除此之外,还有Mean-Pooling,Stochastic-Pooling 等。它们的具体实现如名称所示,具体选择哪一个则取决于具体的任务。
Pooling 的意义,主要有两点:
- 其中一个显而易见,就是减少参数。通过对 Feature Map 降维,有效减少后续层需要的参数
- 另一个则是 Translation Invariance。它表示对于 Input,当其中像素在邻域发生微小位移时,Pooling Layer 的输出是不变的。这就使网络的鲁棒性增强了,有一定抗扰动的作用
回答里的公式太难用了。。对 CNN 还有想要更多了解的可以参考原专栏文章:
卷积和池化的区别
(参考链接https://blog.csdn.net/liulina603/article/details/47727277)
下面给出一个具体的例子:假设你已经从一个 96x96 的图像中学习到了它的一个 8x8 的样本所具有的特征,假设这是由有 100 个隐含单元的自编码完成的。为了得到卷积特征,需要对 96x96 的图像的每个 8x8 的小块图像区域都进行卷积运算。也就是说,抽取 8x8 的小块区域,并且从起始坐标开始依次标记为(1,1),(1,2),...,一直到(89,89),然后对抽取的区域逐个运行训练过的稀疏自编码来得到特征的激活值。在这个例子里,显然可以得到 100 个集合,每个集合含有 89x89 个卷积特征。
如下图所示,展示了一个3×3的卷积核在5×5的图像上做卷积的过程。每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。
2:说下池化,其实池化很容易理解,先看图:
转自: http://blog.csdn.net/silence1214/article/details/11809947
比如上方左侧矩阵A是20*20的矩阵要进行大小为10*10的池化,那么左侧图中的红色就是10*10的大小,对应到右侧的矩阵,右侧每个元素的值,是左侧红色矩阵每个元素的值得和再处于红色矩阵的元素个数,也就是平均值形式的池化。
3:上面说了下卷积和池化,再说下计算中需要注意到的。在代码中使用的是彩色图,彩色图有3个通道,那么对于每一个通道来说要单独进行卷积和池化,有一个地方尤其是进行卷积的时候要注意到,隐藏层的每一个值是对应到一幅图的3个通道穿起来的,所以分3个通道进行卷积之后要加起来,正好才能对应到一个隐藏层的神经元上,也就是一个feature上去。
扫盲 - 下采样与上采样(参考链接http://blog.sina.com.cn/s/blog_54b5ea250101bbr9.html)
上采样是下采样的逆过程,也称增取样(Upsampling)或内插(Interpolating)。 离散-〉连续或加密!