这个exercise需要完成cnn中的forward pass,cost,error和gradient的计算。需要弄清楚每一层的以上四个步骤的原理,并且要充分利用matlab的矩阵运算。大概把过程总结了一下如下图所示:

STEP 1:Implement CNN Objective

STEP 1a: Forward Propagation

Forward Propagation主要是为了计算输入图片经过神经网络后的输出,这个网络有三层:convolution->pooling->softmax(dense connected),卷积层对于每个图像用所有的模板进行卷积;pooling层对卷积层输出的feature map采样;softmax层根据pooling层输出的feature预测图像的分类结果。其中convolution和pooling操作在之前就实现过了。具体的过程可以参见上图中Forward Pass中每层的具体操作。代码如下:

%%% YOUR CODE HERE %%%
%调用之前已经实现的函数
activations = cnnConvolve(filterDim, numFilters, images, Wc, bc);%sigmoid(wx+b)
activationsPooled = cnnPool(poolDim, activations); % Reshape activations into 2-d matrix, hiddenSize x numImages,
% for Softmax layer
%将activationsPooled从outDim*outDim*numFilters*numImages拼接成hiddenSize*numImages的大矩阵
activationsPooled = reshape(activationsPooled,[],numImages); %% Softmax Layer
% Forward propagate the pooled activations calculated above into a
% standard softmax layer. For your convenience we have reshaped
% activationPooled into a hiddenSize x numImages matrix. Store the
% results in probs. % numClasses x numImages for storing probability that each image belongs to
% each class.
probs = zeros(numClasses,numImages); %%% YOUR CODE HERE %%%
h = exp(bsxfun(@plus,Wd * activationsPooled,bd));
probs = bsxfun(@rdivide,h,sum(h,1));

STEP 1b: Calculate Cost

计算梯度下降要优化的目标函数,主要分为两部分,一部分是由于分类器输出结果和真实结果的差异引起的误差函数,另一部分是对权重w的正则约束。第一部分可以参考softmax regression中对损失函数的计算,第二部分就是对Wc和Wd的所有项求平方和。类似下面的公式,不过第一项中的J是softmax的cross entropy损失函数。最后要对第一项除以图像的总数,这是十分重要的,一开始我没有除,最后得到的算法是发散的,原因可能是第一项数值过大,直接把正则项的影响给忽略了。

代码:

%%% YOUR CODE HERE %%%
logp = log(probs);
index = sub2ind(size(logp),labels',1:size(probs,2));
ceCost = -sum(logp(index));
wCost = lambda/2 * (sum(Wd(:).^2)+sum(Wc(:).^2));
cost = ceCost/numImages + wCost;

STEP 1c: Backpropagation

BP算法首先要计算各层的对最终误差的贡献delta。

softmax层:这一层的误差最容易计算,只要用ground truth减去神经网络的输出probs就可以了:

output = zeros(size(probs));
output(index) = 1;
DeltaSoftmax = probs - output;

pool层:这一层首先根据公式δ= Wδl+1 * f'(zl)(pool层没有f'(zl)这一项)计算该层的error,此时得到一个hiddenSize*numImages的矩阵,首先利用reshape函数把error还原成一个convDim*convDim*numFilters*numImages的矩阵,在pooling操作时,pooling层一个节点的输入是conv层2*2个节点的输出(假设poolDim=2)如下图所示:

所以pooling层的这个节点要将自己的error在这2*2个节点中平均分(因为使用的是mean pooling),UFLDL上面提示了可以用kron这个函数来实现,这样如上图所示,就可以通过pooling层一个2*2的filter对应的error计算得到convolution层一个4*4的filter对应的error了。代码如下:

DeltaPool = reshape(Wd' * DeltaSoftmax,outputDim,outputDim,numFilters,numImages);
DeltaUnpool = zeros(convDim,convDim,numFilters,numImages); for imNum = 1:numImages
for FilterNum = 1:numFilters
unpool = DeltaPool(:,:,FilterNum,imNum);
DeltaUnpool(:,:,FilterNum,imNum) = kron(unpool,ones(poolDim))./(poolDim ^ 2);
end
end

convolution层:还是根据公式δ= Wδl+1 * f'(zl)来计算:

DeltaConv = DeltaUnpool .* activations .* (1 - activations);

STEP 1d: Gradient Calculation

整个cnn一共有三层:convolution->pooling->softmax(dense connected),只有convolution和softmax层有权重,分别为Wc,bc,Wd,bd。那么就要计算目标函数J对他们的倒数以便在梯度下降中更新W和b。

Wd和bd的梯度计算:

根据下面两个公式:

          

其中al-1对应pooling层的激励(输出)activitonsPooled,δl就是这一层的误差DeltaSoftmax,代码如下:

Wd_grad = (1./numImages) .* DeltaSoftmax*activationsPooled'+lambda*Wd;
bd_grad = (1./numImages) .* sum(DeltaSoftmax,2);

Wc和bc的梯度计算:

还是根据上面两个计算梯度的公式,不过麻烦就麻烦在l-1层其实是输入的图像,所以al-1对应的是输入的图像,那么就得用for循环逐个便利图像并利用UFLDL上提供的公式计算对应梯度:

这里为了方便,先对所有DeltaConv进行旋转,然后再用for循环依次求出梯度:

%%% YOUR CODE HERE %%%
Wd_grad = (1./numImages) .* DeltaSoftmax*activationsPooled'+lambda*Wd;
bd_grad = (1./numImages) .* sum(DeltaSoftmax,2); bc_grad = zeros(size(bc));
Wc_grad = zeros(filterDim,filterDim,numFilters); for filterNum = 1:numFilters
error = DeltaConv(:,:,filterNum,:);
bc_grad(filterNum) = (1./numImages) .* sum(error(:));
end %旋转所有DealtaConv
for filterNum = 1:numFilters
for imNum = 1:numImages
error = DeltaConv(:,:,filterNum,imNum);
DeltaConv(:,:,filterNum,imNum) = rot90(error,2);
end
end for filterNum = 1:numFilters
for imNum = 1:numImages
Wc_grad(:,:,filterNum) = Wc_grad(:,:,filterNum) + conv2(images(:,:,imNum),DeltaConv(:,:,filterNum,imNum),'valid');
end
end
Wc_grad = (1./numImages) .* Wc_grad + lambda*Wc;

Step 2: Gradient Check

当时明明我的梯度下降没法收敛,这一步居然通过了=。=

Step 3: Learn Parameters

这步比较简单,根据UFLDL对随机梯度下降的解释,在minFuncSGD中加上冲量的影响就可以了:

%%% YOUR CODE HERE %%%
velocity = mom*velocity+alpha*grad;
theta = theta - velocity;

Step 4: Test

运行cnnTrain,最后准确率可以达到97%+

以上就可UFLDL上cnn的实现,最重要的是弄清楚每一层在每一个过程中需要进行的操作,我都总结在文章开头的表格里面了~matlab给我一个很大的感受就是矩阵的demension match,有时候知道公式是什么样的,但是实现起来要考虑矩阵的维度,两个维度match的矩阵才能相乘或者相加,不过好处就是再不知道怎么写代码的时候可以结果维度match来写代码。而且cnn debug起来真的好困难,完全不知道是哪里出了问题=。=

完整的代码在我的github上。

参考:

【1】http://ufldl.stanford.edu/tutorial/supervised/ExerciseConvolutionalNeuralNetwork/

【2】http://blog.csdn.net/lingerlanlan/article/details/41390443

【UFLDL】Exercise: Convolutional Neural Network的更多相关文章

  1. 论文阅读(Weilin Huang——【TIP2016】Text-Attentional Convolutional Neural Network for Scene Text Detection)

    Weilin Huang--[TIP2015]Text-Attentional Convolutional Neural Network for Scene Text Detection) 目录 作者 ...

  2. Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程)

    理论知识:Optimization: Stochastic Gradient Descent和Convolutional Neural Network CNN卷积神经网络推导和实现.Deep lear ...

  3. 【RS】Automatic recommendation technology for learning resources with convolutional neural network - 基于卷积神经网络的学习资源自动推荐技术

    [论文标题]Automatic recommendation technology for learning resources with convolutional neural network ( ...

  4. 【论文阅读】ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

    ShuffleNet: An Extremely Efficient Convolutional Neural Network for MobileDevices

  5. 【转载】 卷积神经网络(Convolutional Neural Network,CNN)

    作者:wuliytTaotao 出处:https://www.cnblogs.com/wuliytTaotao/ 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎 ...

  6. 斯坦福大学卷积神经网络教程UFLDL Tutorial - Convolutional Neural Network

    Convolutional Neural Network Overview A Convolutional Neural Network (CNN) is comprised of one or mo ...

  7. 卷积神经网络(Convolutional Neural Network, CNN)简析

    目录 1 神经网络 2 卷积神经网络 2.1 局部感知 2.2 参数共享 2.3 多卷积核 2.4 Down-pooling 2.5 多层卷积 3 ImageNet-2010网络结构 4 DeepID ...

  8. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  9. 卷积神经网络(Convolutional Neural Network,CNN)

    全连接神经网络(Fully connected neural network)处理图像最大的问题在于全连接层的参数太多.参数增多除了导致计算速度减慢,还很容易导致过拟合问题.所以需要一个更合理的神经网 ...

随机推荐

  1. 四个使用promise的语句之间的不同点在哪儿?

    http://jsbin.com/tuqukakawo/1/edit?js,console,output #1 doSomething().then(function () { return doSo ...

  2. ASP.NET MVC 5 中 使用富文本编辑器 Ueditor

    一.Ueditor插件下载自:http://ueditor.baidu.com/website/ 二.将解压文件目录ueditor复制到项目根目录后, 修改以下几个文件配置: 1.访问路径配置:ued ...

  3. 超简易静态Web服务器

    使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar

  4. SQL Server 定时自动备份数据库

    在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库,这篇文章介绍使用SQL Server 数据库代理中的作业定时自动备份数据库. 1.启动SQL Server代理服务,如下图: 绿色 ...

  5. 关于iOS去除数组中重复数据的几种方法

    关于iOS去除数组中重复数据的几种方法   在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...

  6. Mac系统上用Node做APNS

    1.安装Node,下载地址:http://nodejs.org 2.更新npm,终端命令:sudo npm update npm -g 3.安装apn,终端命令:npm install apn 4.导 ...

  7. mysql安装配置问题(linux下)

    1.安装后使用:mysql -u root -p 无法登录mysql 错误提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost ...

  8. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  9. ubuntu15.04 安装搜狗输入法

    首先:打开 系统设置->软件和更新,添加以下源, deb http://archive.ubuntukylin.com:10006/ubuntukylin trusty main 然后 sudo ...

  10. Datatable的查找和排序(Datatable.Select)

    Datatable  是一种常用的数据结构.数据类型有点类似于数据库中的表结构.在没有使用优秀的orm框架前,大部分的数据库的数据都是先变为Datatable 然后再通过代码转换变成 object. ...