深度学习算法实践11---卷积神经网络(CNN)之卷积操作

卷积神经网络(CNN)主要特性有:稀疏连接和权值共享、卷积操作、池化。在前一篇博文中我们已经讨论了稀疏连接和权值共享,在本篇博文中,我们将介绍卷积操作和池化。正是由于对图像进行卷积操作,卷积神经网络才得以其名,可见卷积操作是其核心。在这篇博文中,我们将讨论卷积操作的实现其及物理含义。

首先,我们来了解一下卷积概念。对于一维信号,卷积定义为:

式1

而我们要处理的图像信号,是二维信号,卷积定义为:

式2

我们假设输入层以3*3为接收域,则其上层特征图也应该是3*3。

如下图所示,我们想要求出上一层第k个特征图(3*3),对其中每个节点i,j的值可以用如下公式求出:


 式3

在上图中,我们需要求出上一层第0个特征图(0,0)点处神经元的输出值,则可知上式的k=0, i=0, j=0,具体列出式子为:

 式4

由上图可知,这里的卷积就是将权值矩阵与图像进行卷积操作,将结果加上上一层对应位置神经元的Bias后再进行一个非线性变换,这里用的是双曲正切函数,即可求出上一层特征图对应位置的神经元输出。

下面来求下一层中第0个特征图中(0,1)位置的神经元输出,如下图所示:


代入式3的公式,可以得出如下的

 式5

有了上述的理论基础,让我们看一下,我们对一个原始图像做卷积操作会出现什么结果,在下面的程序中,我们定义图像输入层有3个特征图,上一层有2个特征图,特征图的尺寸为9*9,我们将做完卷积操作后的图像和之前的图像一并显示出来:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import theano  
  2. from theano import tensor as T  
  3. from theano.tensor.nnet import conv2d  
  4. import numpy  
  5. from matplotlib import pylab  
  6. from PIL import Image  
  7.   
  8. def conv_wky():  
  9.     rng = numpy.random.RandomState(23455)  
  10.     input = T.tensor4(name='input')  
  11.     w_shp = (2399)  
  12.     w_bound = numpy.sqrt(3 * 9 * 9)  
  13.     W = theano.shared( numpy.asarray(  
  14.                 rng.uniform(  
  15.                     low=-1.0 / w_bound,  
  16.                     high=1.0 / w_bound,  
  17.                     size=w_shp),  
  18.                 dtype=input.dtype), name ='W')  
  19.     b_shp = (2,)  
  20.     b = theano.shared(numpy.asarray(  
  21.                 rng.uniform(low=-.5, high=.5, size=b_shp),  
  22.                 dtype=input.dtype), name ='b')  
  23.     conv_out = conv2d(input, W)  
  24.     output = T.nnet.sigmoid(conv_out + b.dimshuffle('x'0'x''x'))  
  25.     return theano.function([input], output)  
  26.   
  27. def do_conv():  
  28.     f = conv_wky()  
  29.     img = Image.open(open('3wolfmoon.jpg''rb'))  
  30.     img = numpy.asarray(img, dtype='float64') / 256.  
  31.     img_ = img.transpose(201).reshape(13639516)  
  32.     filtered_img = f(img_)  
  33.     pylab.subplot(131); pylab.axis('off'); pylab.imshow(img)  
  34.     pylab.gray()  
  35.     pylab.subplot(132); pylab.axis('off'); pylab.imshow(filtered_img[00, :, :])  
  36.     pylab.subplot(133); pylab.axis('off'); pylab.imshow(filtered_img[01, :, :])  
  37.     pylab.show()  
  38.   
  39. if __name__ == '__main__':  
  40.     do_conv()  
结果如下所示:


如图所示,可以看出,对于图像进行一次卷积操作,相当于识别出了图像的边缘,我们知道,识别边缘是图像处理的基础操作,因此可以看出卷积操作是有其物理含义的。

我们知道怎么定义卷积操作之后,我们就可以开始实现卷积神经网络(CNN)了。在下一篇博文,我们将讨论怎样使用卷积神经网络(CNN)将MNIST手写数字识别的错误率降低到1%以内,这甚至超过了人类的识别率,足以看到卷积神经网络的巨大威力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值