CNN 原理和代码解读
原理参见论文Notes on Convolutional Neural Networks
代码来自githup的Deep Learning的toolbox,
(一)卷积和pooling
包含了卷积,求和,加入偏置,经过非线性激励函数等过程
上图说明了获得一个输出maps的过程。蓝色的maps是输入;绿色的maps,是卷积后的结果;黄色的maps是输出。
先对输入层分别做卷积,注意对不同的输出map,卷积核不同,即不同的j,kij不同(不同的输入map,卷积核也不相同,即不同的i,kij不同。
权值共享,仅在对一个maps求卷积的时候(滑动卷积核时,卷积核相对于该maps位置变,但是权值未变)。注意这里的卷积层还加入了偏置,并经过一个而非线性激励函数输出(非线性激励函数不可以少,卷积运算实际也是一种线性运算,没有非线性激励函数,该网络是无法模拟一个非线性复杂函数的)。看一下代码是如何实现这一过程的。
<span style="background-color: rgb(204, 204, 255);">for j = 1 : net.layers{l}.outputmaps % for each output map
% create temp output map
z = zeros(size(net.layers{l - 1}.a{l-1}) - [net.layers{l}.kernelsize - 1 net.layers{l}.kernelsize - 1 0]);
%z = zeros(size(net.layers{l - 1}.a{1}) - [net.layers{l}.kernelsize - 1 net.layers{l}.kernelsize - 1 0]); %本层输出的map大小[x y num]x*y是map大小,num是样本的个数
for i = 1 : inputmaps % for each inp