[Deep Learning]两层CNN的MATLAB实现

想自己动手写一个CNN很久了,论文和代码之间的差距有一个银河系那么大。

在实现两层的CNN之前,首先实现了UFLDL中与CNN有关的作业。然后参考它的代码搭建了一个一层的CNN。最后实现了一个两层的CNN,码代码花了一天,调试花了5天,我也是醉了。这里记录一下通过代码对CNN加深的理解。

首先,dataset是MNIST。这里层的概念是指convolution+pooling,有些地方会把convolution和pooling分别作为两层看待。

1.CNN的结构

这个两层CNN的结构如下:

图一

各个变量的含义如下(和代码中的变量名是一致的)

images:输入的图片,一张图片是28*28,minibatch的大小设置的是150,所以输入就是一个28*28*150的矩阵。

Wc1,bc1:第一层卷积的权重和偏置。一共8个filter,每个大小为5*5。

activations1:通过第一层卷积得到的feature map,大小为(28-5+1)*(28-5+1)*8*150,其中8是第一层卷积filter的个数,150是输入的image的个数。

activationsPooled1:将卷积后的feature map进行采样后的feature map,大小为(24/2)*(24/2)*8*150。

Wc2,bc2:第二层卷积的权重和偏置。一共10个filter,每个大小为5*5*8.注意第二层的权重是三维的,这就是两层卷积网络和一层卷积网络的差别,对于每张图像,第一层输出的对应这张图像的feature map是12*12*8,而第二层的一个filter和这个feature map卷积后得到一张8*8的feature map,所以第二层的filter都是三维的。具体操作后面再详细介绍。

activations2:通过第二层卷积得到的feature map,大小为(12-5+1)*(12-5+1)*10*150,其中10是第二层卷积filter的个数,150是输入的image的个数。

activationsPooled2:将卷积后的feature map进行采样后的feature map,大小为(8/2)*(8/2)*10*150。

activationsPooled2‘:第二层卷积完了之后,要把一张image对应的所有feature map reshape成一列,那么这一列的长度就是4*4*10=160,所以reshape后得到一个160*150的大feature map.(代码中仍然是用的activationsPooled2)。

Wd,bd:softmax层的权重和偏执。

probs:对所有图像所属分类的预测结果,每一列对应一张图像,一共10行,第i行代表这张图像属于第i类的概率。



从实现的角度来说,一个CNN主要可以分成三大块:Feedfoward Pass,Caculate cost和 Backpropagation.这里就详细介绍这三块。

2. Feedfoward Pass

这个过程主要是输入一张图像,通过目前的权重,使得图像依次通过每一层的convolution或者pooling操作,最后得到对图像分类的概率预测。这里比较tricky的部分是对三维的feature map的卷积过程。比如说对于第一层pooling输出的feature map,一张图像对应一个尺寸为12*12*8的feature map,这个时候要用第二层卷积层中一个5*5*8的filter(Wc2中的一个filter)和它进行卷积,最终得到一个8*8的feature map。整个过程可以用图二,图三来表示:

                图二

继续放大,来看看输入的feature map是怎样和第二层的一个filter进行卷积的:

              图三

也就是说,这个卷积是通过filter中每一个filter:Wc2(:,:,fil1,fil2)和activationsPooled1(:,:,fil1,imageNum)卷积,然后将所有的fil1=1:8得到的全部结果相加后得到最后的

 1 for i = 1:numImages
 2     for fil2 = 1:numFilters2
 3         convolvedImage = zeros(convDim, convDim);
 4         for fil1 = 1:numFilters1
 5             filter = squeeze(W(:,:,fil1,fil2));
 6             filter = rot90(squeeze(filter),2);
 7             im = squeeze(images(:,:,fil1,i));
 8             convolvedImage = convolvedImage + conv2(im,filter,‘valid‘);
 9        end
10         convolvedImage = bsxfun(@plus,convolvedImage,b(fil2));
11         convolvedImage = 1 ./ (1+exp(-convolvedImage));
12         convolvedFeatures(:, :, fil2, i) = convolvedImage;
13      end
14 end      

最后整个Feedforward的过程代码如下:

 1 %Feedfoward Pass
 2 activations1 = cnnConvolve4D(mb_images, Wc1, bc1);
 3 activationsPooled1 = cnnPool(poolDim1, activations1);
 4 activations2 = cnnConvolve4D(activationsPooled1, Wc2, bc2);
 5 activationsPooled2 = cnnPool(poolDim2, activations2);
 6
 7 % Reshape activations into 2-d matrix, hiddenSize x numImages,
 8 % for Softmax layer
 9 activationsPooled2 = reshape(activationsPooled2,[],numImages);
10
11 %% --------- Softmax Layer ---------
12 probs = exp(bsxfun(@plus, Wd * activationsPooled2, bd));
13 sumProbs = sum(probs, 1);
14 probs = bsxfun(@times, probs, 1 ./ sumProbs);
15             

3. Caculate cost and error

这里使用的loss function是cross entropy function,关于这个函数的细节可以看这里。这个函数比起squared error function的好处是它在表现越差的时候学习的越快。这和我们的直觉是相符的。而对于squared error function,它在loss比较大的时候反而进行的梯度更新值很小,即学习的很慢,具体解释也参见上述链接。计算cost的代码十分直接,这里直接使用了ufldl作业中的代码。

1 logp = log(probs);
2 index = sub2ind(size(logp),mb_labels‘,1:size(probs,2));
3 ceCost = -sum(logp(index));
4 wCost = lambda/2 * (sum(Wd(:).^2)+sum(Wc1(:).^2)+sum(Wc2(:).^2));
5 cost = ceCost/numImages + wCost;

注意ceCost是loss function真正的cost,而wCost是weight decay引起的cost,我们期望学习到的网络的权重都偏小,对于这一点现在没有很完备的解释,我们期望权值比较小的一个原因是小的权值使得输入波动比较大的时候,网络的各部分的值变化不至于太大,否则网络会不稳定。

4. Backpropagation

Backpropagation算法其实可以分成两部分:计算error和gradient

4.1 caculate error of each layer

对于每一层,我们计算一个误差(残差),说明这一层计算出来的结果和它应该给出的“正确”结果之间的差值。

那么对于最后一层softmax的误差就很好理解了,就是ground truth的labels和我们所预测的结果之间的差值:

1 output = zeros(size(probs));
2 output(index) = 1;
3 DeltaSoftmax = (probs - output);
4 t = -DeltaSoftmax;

output是把ground truth的labels整成一个10*150的矩阵,output(i,j)=1表示图像j属于第i类,output(i,j)=0表示图像j不属于第i类。

接下来把这个残差一层层的依次推回到pooling2->convolution2->pooling1->convolution1这些层。

4.2 caculate gradient

To be continued...

时间: 2025-01-03 13:18:27

[Deep Learning]两层CNN的MATLAB实现的相关文章

[Deep Learning]任意层cnn的matlab版本实现

之前实现了一层的卷积神经网络,又实现了两层的卷积神经网络,接下来把cnn扩展到任意层就不难了. 这难道就是传说中的“道生一,一生二,二生三,三生万物”么?=.= 代码还是在github上. 比较有趣的一点是,我分别用两层的神经网络和一层的神经网络进行了实现,结果如下图: 两层的cnn结果: 一层的cnn结果: 可以看到,一层的cnn结果反而比两层的好,那么很有可能是两层的cnn出现了过拟合现象.对于mnist这种小数据集,一层的cnn加上一些参数调优绝对是够用了的.

Deep Learning for Computer Vision with MATLAB and cuDNN(译文)

翻译水平有限,欢迎阅读原文 一.深度学习 当前,深度学习已经成为一个热门话题.随着深度学习算法和GPU技术的发展,我们已经能够解决许多领域(计算机视觉.自然语言处理和机器人学)曾经认为不可能的事情. 深度学习是建立在传统的深度神经网络之上的.最近几年的热点是大数据集和强大的GPUs的使用.神经网络本质上是一种并行算法,因此多核GPUs的使用能够明显的减少用于训练深度神经网络的时间.以下,我将会讨论如何使用MATLAB以及深度卷积神经网络和GPUs开发一个对象识别系统 二.为什么将深度学习用于计算

Deep Learning学习 之 CNN代码解析(MATLAB)

MATLAB实现CNN一般会用到deepLearnToolbox-master.但是根据Git上面的说明,现在已经停止更新了,而且有很多功能也不太能够支持,具体的请大家自习看一看Git中的README. deepLearnToolbox-master是一个深度学习matlab包,里面含有很多机器学习算法,如卷积神经网络CNN,深度信念网络DBN,自动编码AutoEncoder(堆栈SAE,卷积CAE)的作者是 Rasmus Berg Palm ([email protected]) 代码下载:h

【深度学习Deep Learning】资料大全

转载:http://www.cnblogs.com/charlotte77/p/5485438.html 最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books Deep Learning66 by Yoshua Bengio, Ian Goodfellow and Aaron Courville Neural Networks and Deep Learning42 by Michael Nielsen Deep Learning27 by

Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之:CNN卷积神经网络推导和实现 [4]Deep Learning模型之:CNN的反向求导及练习 [5]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN [6]Deep Learn

【转】Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现

原作者:zouxy09 原文链接:http://blog.csdn.net/zouxy09/article/details/9993371 Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 [email protected] http://blog.csdn.net/zouxy09          自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样.所以想习惯地把一些感觉有用的论文中的知识点总结整理一下,一方面在整理过程中,自己

Deep Learning基础--CNN的反向求导及练习

前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文的主要目的是介绍CNN参数在使用bp算法时该怎么训练,毕竟CNN中有卷积层和下采样层,虽然和MLP的bp算法本质上相同,但形式上还是有些区别的,很显然在完成CNN反向传播前了解bp算法是必须的.本文的实验部分是参考斯坦福UFLDL新教程UFLDL:Exercise: Convolutional Ne

Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现(转)

Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 [email protected] http://blog.csdn.net/zouxy09          自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样.所以想习惯地把一些感觉有用的论文中的知识点总结整理一下,一方面在整理过程中,自己的理解也会更深,另一方面也方便未来自己的勘察.更好的还可以放到博客上面与大家交流.因为基础有限,所以对论文的一些理解可能不太正确,还望大家不

Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现

https://blog.csdn.net/zouxy09/article/details/9993371 自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样.所以想习惯地把一些感觉有用的论文中的知识点总结整理一下,一方面在整理过程中,自己的理解也会更深,另一方面也方便未来自己的勘察.更好的还可以放到博客上面与大家交流.因为基础有限,所以对论文的一些理解可能不太正确,还望大家不吝指正交流,谢谢. 本文的论文来自: Notes on Convolutio