前言:
本次实验是练习convolution和pooling的使用,更深一层的理解怎样对大的图片采用convolution得到每个特征的输出结果,然后采用pooling方法对这些结果进行计算,使之具有平移不变等特性。实验参考的是斯坦福网页教程:Exercise:Convolution and Pooling。也可以参考前面的博客:Deep learning:十七(Linear Decoders,Convolution和Pooling),且本次试验是在前面博文Deep learning:二十二(linear decoder练习)的学习到的特征提取网络上进行的。
实验基础:
首先来看看整个训练和测试过程的大概流程:从本文可以更清楚的看到,在训练阶段,是对小的patches进行whitening的。由于输入的数据是大的图片,所以每次进行convolution时都需要进行whitening和网络的权值计算,这样每一个学习到的隐含层节点的特征对每一张图片都可以得到一张稍小的特征图片,接着对这张特征图片进行均值pooling(在这之前,程序中有一些代码来测试convolution和pooling代码的正确性)。有了这些特征值以及标注值,就可以用softmax来训练多分类器了。
在测试阶段是对大图片采取convolution的,每次convolution的图像块也同样需要用训练时的whitening参数进行预处理,分别经过convolution和pooling提取特征,这和前面的训练过程一样。然后用训练好的softmax分类器就可进行预测了。
上文copy自: http://www.cnblogs.com/tornadomeet/archive/2013/04/09/3009830.html实验流程图:
阶段一:线性解码特征学习
阶段二:卷积特征提取
阶段三:池化特征提取
将57*57的卷积特征进行池化,池化后池化特征维数为3*3;floor(57/19)=3;对数据进行降维处理
阶段四:运用最后池化特征进行softmax训练
Convolutional and pooling networkexercise
主函数说明(代码部分还有一些详细注释):
Step0:参数说明
imageDim = 64; % 样本图像维数
imageChannels = 3; % 图像的基色树,rgb三基色
patchDim = 8; % 小patch的维数(用于特征学习,卷积模板)
numPatches = 50000; % 特征学习的样本数
visibleSize = patchDim *patchDim * imageChannels; %输入单元数
outputSize = visibleSize; % 输出单元数,用于特征学习
hiddenSize = 400; % 隐单元个数
epsilon = 0.1; % epsilon for ZCA whitening
poolDim = 19; %池化区域的维数
Step1:训练一个带线性解码的网络学习特征
Step2:进行convolution和pooling,并检验
Step2a:
convolvedFeatures = cnnConvolve();详细分析,见下文cnnConvolve分析
Step2b检验:
由于卷积的过程本质上就是一次神经网络的前馈计算过程,所以应用网络前馈计算函数feedForwardAutoencoder计算的结果应该和卷积的结果相同。所以可用两种做差来检验。
Step2c:pooling
pooledFeatures = cnnPool(poolDim, convolvedFeatures);详细分析见后面函数分析
Step2d:检验pooling
初始化一个1到64顺序排列的矩阵,然后用均值计算每个4*4模块的pooling