深度学习之四:卷积神经网络基础

zzulp zzulp     2022-12-13     440

关键词:

计算机视觉在深度学习的帮助下取得了令人惊叹的进展,其中发挥重要作用的是卷积神经网络。本节总结了卷积神经的原理与实现方法。

1 卷积神经网络

1.1 计算机视觉与深度学习

计算机视觉要解决的问题是如何让机器理解现实世界的现象。目前主要处理的问题如图像分类,目标检测,风格变换等。

对于小型图片,如MNIST的图片处理,图像大小为64*64,使用全连接神经网络还可以处理。如果图像较大,如1000*1000*3时,单个输入层就需要3M的节点,全连接情况下,单层的权重就可能多达数十亿的待训练参数。这将导致神经网络无法进行有效训练。因此业界提出卷积神经网络解决参数过多的问题。

先看一个卷积神经网络的结构,在卷积神经网络中包括三种类型的层:卷积层,池化层和全连接层。下面几节介绍卷积神经网络的基本概念。

1.2 过滤器

在卷积神经网络中,过滤器也称为卷积核,通常是3*3或5*5的小型矩阵(先忽略每个点可能有多个通道)。过滤器的作用是和输入图像的各个区域逐次进行卷积。

所谓卷积运算是计算两个矩阵的对应元素(Element-wise)乘积的和。卷积本质是两个向量的内积,体现了两个向量的距离。

下图展示了过滤器在输入图像上的卷积计算的过程:

因此过滤器可以捕获图像中与之类似模式的图像区域。例如下图展示了一个过滤器的数值矩阵与图形。

当使用这个过滤器在图像上移动并计算卷积时,不同的区域会有不同的卷积结果。

在类似于的模式下过滤器与图像区域的卷积会产生较大的值。

不相似的区域则产生较小的值。

此外在一层上捕获的模式可以组合为更复杂的模式并输入到下一层,从而使得下一层能识别更复杂的图像模式。

训练CNN在一定意义上是在训练每个卷积层的过滤器,让其组合对特定的模式有高的激活,以达到CNN网络的分类/检测等目的。

1.3 Padding

对于一个shape为 [n,n] [ n , n ] 的图像,若过滤器的 shape为 [f,f] [ f , f ] ,在卷积时每次移动1步,则生成的矩阵shape为 [nf+1,nf+1] [ n − f + 1 , n − f + 1 ] 。这样如果经过多层的卷积后,输出会越来越小。另一方面图像边界的点的特征不能被过滤器充分捕获。

通过对原始图像四个边界进行padding,解决上面提到的两个问题。术语Same填充,会保证输出矩阵与输入矩阵大小相同,因此其需要对输入图像边界填充 f12 f − 1 2 个象素。另一个术语Valid填充表示不填充。

通过下图体会Padding对输出的影响

下面的代码展示了使用0填充,向X边界填充pad个像素的方法

def zero_pad(X, pad):
    X_pad = np.pad(X, ((0, 0), (pad, pad), (pad, pad), (0, 0)), 'constant', constant_values=0)

    return X_pad

1.4 卷积步长

另一个影响输出大小的因素是卷积步长(Stride)。
对于一个shape为 [n,n] [ n , n ] 的图像,若过滤器的 shape为 [f,f] [ f , f ] ,卷积步长为s,边界填充p个象素,则生成的矩阵shape为 [n+2pfs+1,n+2pfs+1] [ n + 2 p − f s + 1 , n + 2 p − f s + 1 ]

1.5 卷积层记法说明

对于第 l l 层的卷积层,nc[l]为该层的卷积核数,其输入矩阵的维度为

[n[l1]H,n[l1]W,n[l1]c] [ n H [ l − 1 ] , n W [ l − 1 ] , n c [ l − 1 ] ]

输出矩阵的维度以channel-last展示为 [n[l]H,n[l]W,n[l]c] [ n H [ l ] , n W [ l ] , n c [ l ] ] ,各维度值如下:
n[l]H=n[l1]H+2p[l]f[l]s[l]+1 n H [ l ] = n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1
n[l]W=n[l1]W+2p[l]f[l]s[l]+1 n W [ l ] = n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1

下面的代码展示了图像卷积计算的方法

def conv_single_step(a_slice_prev, W, b):
    """
    Apply one filter defined by parameters W on a single slice (a_slice_prev) of the output activation
    of the previous layer.

    Arguments:
    a_slice_prev -- slice of input data of shape (f, f, n_C_prev)
    W -- Weight parameters contained in a window - matrix of shape (f, f, n_C_prev)
    b -- Bias parameters contained in a window - matrix of shape (1, 1, 1)

    Returns:
    Z -- a scalar value, result of convolving the sliding window (W, b) on a slice x of the input data
    """
    s = np.multiply(a_slice_prev, W) + b
    Z = np.sum(s)
    return Z


def conv_forward(A_prev, W, b, hparameters):
    """
    Implements the forward propagation for a convolution function

    Arguments:
    A_prev -- output activations of the previous layer, numpy array of shape (m, n_H_prev, n_W_prev, n_C_prev)
    W -- Weights, numpy array of shape (f, f, n_C_prev, n_C)
    b -- Biases, numpy array of shape (1, 1, 1, n_C)
    hparameters -- python dictionary containing "stride" and "pad"

    Returns:
    Z -- conv output, numpy array of shape (m, n_H, n_W, n_C)
    cache -- cache of values needed for the conv_backward() function
    """

    (m, n_H_prev, n_W_prev, n_C_prev) = A_prev.shape

    (f, f, n_C_prev, n_C) = W.shape

    stride = hparameters['stride']
    pad = hparameters['pad']

    n_H = int((n_H_prev - f + 2 * pad) / stride) + 1
    n_W = int((n_W_prev - f + 2 * pad) / stride) + 1

    # Initialize the output volume Z with zeros.
    Z = np.zeros((m, n_H, n_W, n_C))

    # Create A_prev_pad by padding A_prev
    A_prev_pad = zero_pad(A_prev, pad)

    for i in range(m):  # loop over the batch of training examples
        a_prev_pad = A_prev_pad[i]  # Select ith training example's padded activation
        for h in range(n_H):  
            for w in range(n_W): 
                for c in range(n_C):  # loop over channels (= #filters) of the output volume
                    # Find the corners of the current "slice"
                    vert_start = h * stride
                    vert_end = vert_start + f
                    horiz_start = w * stride
                    horiz_end = horiz_start + f
                    # Use the corners to define the (3D) slice of a_prev_pad (See Hint above the cell). 
                    a_slice_prev = a_prev_pad[vert_start:vert_end, horiz_start:horiz_end, :]
                    # Convolve the (3D) slice with the correct filter W and bias b, to get back one output neuron.
                    Z[i, h, w, c] = conv_single_step(a_slice_prev, W[..., c], b[..., c])

    assert (Z.shape == (m, n_H, n_W, n_C))

    cache = (A_prev, W, b, hparameters)

    return Z, cache

1.6 池化层

有两种类型的池化层,一种是最大值池化,一种是均值池化。
下图体现了最大池化的作用,其过滤器大小为2,步幅为2:

均值池化与最大池化不同的是计算相应区域的均值,而不是取最大值。
对池化层各维度值如下:
查看详情

深度学习之卷积神经网络理论详解(代码片段)

LeNet-5网络LetNet网络的的讲解主要参考1998年计算机科学家YannLeCun发布的一篇论文《Gradientbasedlearningappliedtodocument-recognition》大家可以找到这篇论文结合学习,针对该网络,首先大家需要了解一下图像中的常用操作卷积,... 查看详情

从软件工程的角度写机器学习6——深度学习之卷积神经网络(cnn)实现

卷积神经网络(CNN)实现背景卷积神经网络广泛用于图像检测,它的实现原理与传统神经网络基本上是一样的,因此将普遍意义的神经网络和卷积神经网络的实现合成一篇。神经网络实现思路“扔掉神经元”尽管所有教程在介绍... 查看详情

深度学习之卷积神经网络(cnn)

卷积神经网络(CNN)因为在图像识别任务中大放异彩,而广为人知,近几年卷积神经网络在文本处理中也有了比较好的应用。我用TextCnn来做文本分类的任务,相比TextRnn,训练速度要快非常多,准确性也比较高。TextRnn训练慢得像... 查看详情

深度学习之卷积神经网络cnn及tensorflow代码实现示例

一、CNN的引入在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的28×2828×28... 查看详情

深度学习之图片压缩算法

近年来,深度学习在计算机视觉领域已经占据主导地位,不论是在图像识别还是超分辨重现上,深度学习已成为图片研究的重要技术;现在深度学习技术已进入图片压缩领域。以图鸭科技最新研发的图片压缩——TinyNetworkGraphics(T... 查看详情

深度学习之卷积和池化

...用它来进行特征提取,如下:输入图像是32*32*3,3是它的深度(即R、G、B),卷积层是一个5*5*3的filter(感受野),这里注意:感受野的深度必须和输入图像的深 查看详情

深度学习之pytorch实战——迁移学习

...  在开始之前,我们先来了解一下什么是迁移学习。在深度神经网络算法的应用过程中,如果我们面对 查看详情

深度学习之卷积神经网络cifar10与resnet18实战(代码片段)

目录开发环境ResNet原理网络结构 导入所需模块并设置GPU显存占用 BasicBlockResNet网络模型ResNet18完整代码实现 运行结果利用TensorBoard可视化运行结果开发环境作者:嘟粥yyds时间:2023年2月8日集成开发工具:jupyternotebook... 查看详情

参考《深度学习之pytorch实战计算机视觉》pdf

计算机视觉、自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向。计算机视觉学习,推荐阅读《深度学习之PyTorch实战计算机视觉》。学到人工智能的基础概念及Python编程技能,掌握PyTorch的使用方法,学到深度... 查看详情

tensorflow学习之使用卷积神经网络(cnn)分类手写数字0-9(代码片段)

#卷积神经网络cnnimporttensorflowastffromtensorflow.examples.tutorials.mnistimportinput_data#数据包,如果没有自动下载number1to10datamnist=input_data.read_data_sets(‘MNIST_data‘,one_hot=True)#用测试集来评估神经网络的准确度defcomputer_a 查看详情

08-gnn图机器学习之图神经网络

图神经网络nodeembedding回顾了之前node2vec的例子以及深度学习卷积的一些基础浅层encoder的局限性:参数数量O(v):节点间没有共享参数,每个节点有自己的embedding不能表征未见过的节点没有综合考虑节点特征本节学习图神经网络,多... 查看详情

《深度学习与计算机视觉算法原理框架应用》pdf+《深度学习之pytorch实战计算机视觉》pdf

下载:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w《深度学习与计算机视觉算法原理、框架应用》PDF,带书签,347页。《大数据架构详解:从数据获取到深度学习》PDF,带书签,373页。配套源代码。下载:https://pan.baidu.com/s/1P0-o29x0ZrXp8Wo... 查看详情

机器学习之深度学习发展进程

1.3为什么是深度学习,为什么是现在个人公众号yk坤帝获取更多资料,学习建议深度学习用于计算机视觉的两个关键思想,即卷积神经网络和反向传播,在1989年就已经为人们所知。长短期记忆(LSTM,longshor... 查看详情

深度学习之前馈神经网络(前向传播和误差方向传播)

这篇文章主要整理三部分内容,一是常见的三种神经网络结构:前馈神经网络、反馈神经网络和图网络;二是整理前馈神经网络中正向传播、误差反向传播和梯度下降的原理;三是梯度消失和梯度爆炸问题的原因及解决思路。一... 查看详情

深度学习之基础篇

1、神经网络中损失函数和优化函数的作用训练出一个网络模型之后如何对模型进行评估?往往是衡量预测值与真实值之间的差异程度,这就是通过损失函数来完成的。另外损失函数也是神经网络中优化的目标函数,神经网络训... 查看详情

深度学习之超分辨率,视频增强基础:光流估计与可变性卷积

目录一、帧对齐简介     二、显式帧对齐:光流估计+运动补偿三、隐式帧对齐:可变性卷积四、几个疑问1.为什么要进行帧对齐2.光流估计为什么可以应用视频插帧?3.光流估计和可变性卷积的区别4.运动幅度很... 查看详情

深度学习之二:神经网络的实践与优化

本文内容为Andrewng深度学习课程的第二部分的笔记,本篇总结了如何神经网络的训练和学习过程的实践经验与优化方法。1深度学习的实践技巧应用机器学习是一个需要不断迭代的过程,众多经验参数如层数,隐层单元... 查看详情