原文 https://blog.youkuaiyun.com/orangehdc/article/details/37763933
跳转原文PCANet是一个基于CNN的简化Deep Learning模型。
上图为经典卷积网络示意图
PCANet提出者认为,经典的CNN存在的问题是参数训练时间过长且需要特别的调参技巧。
因此他们希望能找到一种训练过程更为简单,且能适应不同任务、不同数据类型的网络模型。这个模型就是PCANet。
从上图可以看到,PCANet的训练分为三个步骤(stage),前两个stage很相似,都是去平均,然后PCA取主成分并卷积,最后一步是二值化(为了产生非线性输出)和直方图量化。下面按步骤介绍PCANet的训练过程:
1、First stage:
PCANet选取了一个k1*k2的窗口(通常选边长为3、5、7个像素正方形窗口)来滑动选取图片的局部特征。
每张m*n大小的图片经过滑动窗口提取局部特征之后,就变成了mn个k1*k2大小的patch。
再对这mn个patch去平均,便完成了对单张图片的特征提取操作。
对所有N张图片执行以上操作,提取完之后得到一个新的数据矩阵X,每一列代表一个patch,含有k1k2个元素,一共有Nmn列。
然后就是对这个X矩阵做PCA,取前L1个特征向量,作为filter。
把这L1个特征向量的每一列(每一列含有k1k2个元素)重排列为一个patch,相当于我们得到了L1个k1*k2的窗口。
然后就是对每一张图片,都用这L1个窗口做一次卷积。First stage到此结束。
2、Second stage:
这个步骤跟First stage是相似的,但工作量变成原来的L1倍。
这个步骤也是类似的。
3、Output layer:
首先是对Second stage的每个卷积的结果做二值化,每一组得到L2张二值图片,对这L2张二值图片进行编码,得到十进制的"image"。
然后对每L1张图片做histBlock到vector的变换,假设对原图128*48的图选取32*32的histBlock,overlap系数0.5,原图有14个histBlock,将histBlock变换为vector,得到1024*14的矩阵。
对这个1024*14的矩阵做直方图统计(对应源代码是matlab的histc函数,对此函数不了解的可以看这篇blog),因为选了256个区间,所以得到的Bhist矩阵大小为256*14。
最后将这个矩阵转化为28672(L1=8,28672=256*14*8)维的vector,这样就完成了一张图片的PCANet的特征提取。
参考文献:
PCANet: A Simple Deep Learning Baseline for Image Classification?