大话卷积神经网络(CNN)

本文详细介绍了卷积神经网络(CNN)的基本结构和工作原理,包括卷积层、ReLU激活函数、池化层以及全连接层的作用。CNN通过卷积运算和滤波器提取图像特征,im2col操作优化了运算效率。此外,文章还讨论了三维情况下的卷积以及池化的实现方式。
摘要由CSDN通过智能技术生成

CNN介绍

  卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
  卷积神经网络(Convolutional Neural Networks / CNNs / ConvNets)与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。
  所以哪里不同呢?卷积神经网络默认输入是图像,可以让我们把特定的性质编码入网络结构,使是我们的前馈函数更加有效率,并减少了大量参数。
  卷积神经网络利用输入是图片的特点,把神经元设计成三个维度 : width, height, depth(注意这个depth不是神经网络的深度,而是用来描述神经元的) 。比如输入的图片大小是 32 × 32 × 3 (rgb),那么输入神经元就也具有 32×32×3 的维度。一个卷积神经网络由很多层组成,它们的输入是三维的,输出也是三维的,有的层有参数,有的层不需要参数。下面是图解:
在这里插入图片描述卷积神经网络通常包含以下几种层:

  • 卷积层(Convolutional layer),卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
  • 线性整流层(Rectified Linear Units layer, ReLU layer),这一层神经的活性化函数(Activation function)使用线性整流(Rectified Linear Units,
    ReLU)。
  • 池化层(Pooling layer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
  • 全连接层( Fully-Connected layer), 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。

一个卷积神经网络各层应用实例:
在这里插入图片描述

卷积运算

在这里插入图片描述  如上图所示,CNN的运算是由三个部分组成的,第一部分原始数据对应的左图, 第二部分滤波器也可以称之为卷积核中间的那个图。第三部对应的是图像的右边代表原始数据和卷积核运算的结果。
  im2col操作是用来优化卷积运算,它的核心是将卷积核感受野的转化成一行(列)来存储,优化运算速度,减少内存访问时间。
在这里插入图片描述
在这里插入图片描述上面描述的是二维的情况,当三维的时候,示意图如下
在这里插入图片描述 im2col 操作示意图:
在这里插入图片描述 对于卷积核,将卷积核展开处理:
在这里插入图片描述 将输入图像得到的矩阵与卷积核展开后的列做矩阵乘法(可以大批量加速),得到结果后进行col2im操作复原结果:
在这里插入图片描述 im2col 代码展示:

def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
    """
    Parameters
    ----------
    input_data : 由(数据量, 通道, 高, 长)的4维数组构成的输入数据
    filter_h : 滤波器的高
    filter_w : 滤波器的长
    stride : 步幅
    pad : 填充

    Returns
    -------
    col : 2维数组
    """
    N, C, H, W = input_data.shape
    # 第二步计算输出卷积核的高度和宽度
    out_h = (H + 2*pad - filter_h)//stride + 1
    out_w = (W + 2*pad - filter_w)//stride + 1
    # 填充padiing 只填充H,W维度的
    img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
    col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))

    for y in range(filter_h):
        y_max = y + stride*out_h
        for x in range(filter_w):
            x_max = x + stride*out_w
            # y:y_max:stride是指从y到 y_max,每次移动stride
            # 一次性取[out_h *stride,out_w *stride]大小的数据,放入新矩阵中
            col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
            # print(col)
    # 原来shape是(N,C,filter_h,filter_w,out_h,out_w)
    # 在进行组合时,先把横向的所有分块排列好,然后排列不同通道的,最后排列不同高度的
    # 即顺序是filter_w --> C --> filter_h
    col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)
    return col

池化

  池化层的实现和卷积层相同,都使用 im2col 展开输入数据。不过,池化的情况下,在通道方向上是独立的,这一点和卷积层不同。
在这里插入图片描述
只需对展开的矩阵求各行的最大值,并转换为合适的形状即可,如下图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值