深度学习算法实践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

扫描二维码关注公众号,回复: 1673517 查看本文章

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

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


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

 式5

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

import theano
from theano import tensor as T
from theano.tensor.nnet import conv2d
import numpy
from matplotlib import pylab
from PIL import Image

def conv_wky():
    rng = numpy.random.RandomState(23455)
    input = T.tensor4(name='input')
    w_shp = (2, 3, 9, 9)
    w_bound = numpy.sqrt(3 * 9 * 9)
    W = theano.shared( numpy.asarray(
                rng.uniform(
                    low=-1.0 / w_bound,
                    high=1.0 / w_bound,
                    size=w_shp),
                dtype=input.dtype), name ='W')
    b_shp = (2,)
    b = theano.shared(numpy.asarray(
                rng.uniform(low=-.5, high=.5, size=b_shp),
                dtype=input.dtype), name ='b')
    conv_out = conv2d(input, W)
    output = T.nnet.sigmoid(conv_out + b.dimshuffle('x', 0, 'x', 'x'))
    return theano.function([input], output)

def do_conv():
    f = conv_wky()
    img = Image.open(open('3wolfmoon.jpg', 'rb'))
    img = numpy.asarray(img, dtype='float64') / 256.
    img_ = img.transpose(2, 0, 1).reshape(1, 3, 639, 516)
    filtered_img = f(img_)
    pylab.subplot(1, 3, 1); pylab.axis('off'); pylab.imshow(img)
    pylab.gray()
    pylab.subplot(1, 3, 2); pylab.axis('off'); pylab.imshow(filtered_img[0, 0, :, :])
    pylab.subplot(1, 3, 3); pylab.axis('off'); pylab.imshow(filtered_img[0, 1, :, :])
    pylab.show()

if __name__ == '__main__':
    do_conv()
结果如下所示:


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

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


猜你喜欢

转载自blog.csdn.net/yt7589/article/details/52354638