深度学习 | 卷积神经网络 考试考点 内附详解

目录

(一)卷积神经网络和多层感知机的应用差别:

(二)卷积神经网络的应用场景:

 (三)卷积神经网络的性质

1、平移不变性

1)概念: 

2) 作用:

2、局部性

1)定义:

2)作用:

(四)图像卷积

1、相互关系运算

1)概念

2)计算公式:

示例: 

3)作用:

4)代码——基于torch:

5)拓展:计算二维的卷积核

总结:

(五)填充

1)概念:

2)计算公式:

3)代码:

(六)步幅

1)概念:

2)计算公式:

3)代码:

 4)总结:


 

卷积神经网络(Convolutional Neural Networks, CNN)是计算机视觉技术最经典的模型结构。卷积神经网络的常用模块包括:卷积、池化、激活函数、批归一化、丢弃法等。

 

(一)卷积神经网络和多层感知机的应用差别:

 1、多层感知机:适合用在表格数据的处理中。对于表格数据,我们寻找的模式可能涉及特征之间的交互,但是我们不能预先假设任何与特征交互相关的先验结构。 此时,多层感知机可能是最好的选择。

2、卷积神经网络:对于高维感知数据,这种缺少结构的网络可能会更实用。

 

(二)卷积神经网络的应用场景:

1、手写字的识别

2、AlpahaGo的运行机制

3、寻找Waldo

AlpahaGo:

-首先开始训练两个深度卷积神经网络(即策略网络),用于动作预测。

-在这两个网络架构中,其中一个深度更深,能够产生更准确的结果,而另一个则更浅,可以更快地进行评估。我们将它们分别称为强策略网络和快策略网络。

 

 (三)卷积神经网络的性质

1、平移不变性

1)概念: 

        这意味着检测对象在输入二维图像X中的平移,应该仅导致隐藏表示H中的平移。也就是说,V和U实际上不依赖于(i,j)的值,即[V]i,j,a,b=[V]a,b。并且U是一个常数,比如u。因此,我们可以简化H定义为:

深度学习 | 卷积神经网络 考试考点 内附详解_第1张图片

这就是卷积(convolution)。我们是在使用系数[V]a,b对位置(i,j)附近的像素(i+a,j+b)进行加权得到[V]a,b。 注意,[V]a,b的系数比[V]i,j,a,b少很多,因为前者不再依赖于图像中的位置。这也是卷积神经网络在图像识别等显著的进步,即增加了其鲁棒性。

平移不变性:一个图像中的元素,不论移动到哪里都能被识别。即在草地上的大白鹅能被识别为大白鹅,在水里的大白鹅也能被识别成大白鹅。

·卷积:平移不变模式

·局部图像可以根据平移不变形用相同的方式处理,而不依赖它的位置。

·局部性意味着计算相应的隐藏表示只需要一小部分局部图像像素。

·相较于全连接层,卷积层通常需要更少的参数,但依旧可以获得高效用的模型。(卷积神经网络网络不比多层感知机细致,但是更快。)

2) 作用:

        ·定义—种提取局部特征的方法,可有效响应特定的局部模式
        ·用这种方法遍历整张图片 

PS.平移不变性

1) V是四阶权重张量W转化而来的,从W到V的转换只是形式上的转换,因为在这两个四阶张量的元素之间存在一一对应的关系;【具体实现方法为:相互关系运算】

2) (i,j)表示在图像中的位置,类似于坐标(因为这里指的是二维图像,所以只有i和j两个参数);

3)[X]i,j和[H]i,j分别表示输入图像和隐藏表示中位置(i,j)处的像素。

2、局部性

1)定义:

        为了收集用来训练参数[H]i,j的相关信息,我们不应偏离到距(i,j)很远的地方。这意味着在|a|>Δ或|b|>Δ的范围之外,我们可以设置[V]a,b=0。因此,我们可以将[H]i,j重写为

9a58a3b6378c4ade8793165e8a03eb21.png

        简而言之, 是一个卷积层(convolutional layer),而卷积神经网络是包含卷积层的一类特殊的神经网络。V被称为卷积核(convolution kernel)或者滤波器(filter),亦或简单地称之为该卷积层的权重,通常该权重是可学习的参数。

局部性:可以通过设置卷积核或者滤波器中的参数,着重强调图像中想要获取的部分,弱化其他部分的。

例如,图像中目标的边缘检测。

·池化:下采样被检测物体不变模式

2)作用:

        · 在神经网络逐层累加过程中,可以直接对图像进行缩放
        · 缩放到适当大小后,可以在特征提取过程中得到有效响应

PS.超参数

1、在卷积层:卷积核尺寸、卷积核数量、卷积的步长(stride)、填充(padding)、偏移(bias)都是超参数,需要人手工设置,不能通过训练得到。但是需要不断根据训练结果进行调参,来达到更好的结果。

link池化层的超参数:池化核尺寸、池化步长、池化方式。

link机器学习的超参数:学习率lr。

 

(四)图像卷积

1、相互关系运算

1)概念

        在卷积层中,输入张量X和核张量K通过互相关运算产生输出张量。

        在二维互相关运算中,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。

2)计算公式:

fa52e9e150eb4d06ba68f53e374c5f92.png

示例: 

深度学习 | 卷积神经网络 考试考点 内附详解_第2张图片

深度学习 | 卷积神经网络 考试考点 内附详解_第3张图片

3)作用:

1)一维交叉相关:文本、语音、时间序列……

2)三维交叉相关:视频、医学图像、气象地图……

PS.

1、上述平移不变性便是运用的这个原理。

2、二维交叉相关严格来说不算是卷积。

4)代码——基于torch:

import torch
from torch import nn
from d2l import torch as d2l

def corr2d(X, K):  #@save
    """计算二维互相关运算"""
    h, w = K.shape 
    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
    return Y
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)

注释:

1、X.shape[0]:高度;X.shape[1]:宽度

2、K为手动设置的卷积核

5)拓展:计算二维的卷积核

基于上面定义的corr2d函数实现二维卷积层。

在__init__构造函数中,将weight和bias声明为两个模型参数。前向传播函数调用corr2d函数并添加偏置。

class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super().__init__()
        self.weight = nn.Parameter(torch.rand(kernel_size))
        self.bias = nn.Parameter(torch.zeros(1))

    def forward(self, x):
        return corr2d(x, self.weight) + self.bias

注释:

1、kernel_size:卷积核的大小。

2、torch.zeros:把矩阵里面的数全部赋值为0。

总结:

1、在图像处理中,卷积层通常比全连接层需要更少的参数,但依旧获得高效用的模型。
2、局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。

 

(五)填充

1)概念:

        在应用多层卷积时,我们常常丢失边缘像素。 由于我们通常使用小卷积核,因此对于任何单个卷积,我们可能只会丢失几个像素。 但随着我们应用许多连续卷积层,累积丢失的像素数就多了。 解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是0)。

总结:不想让输出变小,就用填充。

2)计算公式:

深度学习 | 卷积神经网络 考试考点 内附详解_第4张图片 PS.填充
1、通常取p_n = k_n -1, p_w = k_w -1的输出和输入不会发生变化
2、在上侧填充p_n /2:向上取整,在下侧填充p_n /2:向下取整

3)代码:

import torch
from torch import nn

# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是1
    X = X.reshape((1, 1) + X.shape)
    Y = conv2d(X)
    # 省略前两个维度:批量大小和通道
    return Y.reshape(Y.shape[2:])

# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
X = torch.rand(size=(8, 8))
comp_conv2d(conv2d, X).shape
输出结果:torch.Size([8, 8])
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape

输出结果:torch.Size([8, 8])

 PS.

1、padding=(a, b):a——高度填充数,b——宽度填充数。

 

(六)步幅

1)概念:

在计算互相关时,卷积窗口从输入张量的左上角开始,向下、向右滑动。 在前面的例子中,我们默认每次滑动一个元素。 但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。

步幅(stride):每次滑动元素的数量.

2)计算公式:

深度学习 | 卷积神经网络 考试考点 内附详解_第5张图片

3)代码:

conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape

输出结果: torch.Size([4, 4])

conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, X).shape

输出结果:torch.Size([2, 2])

当高度和宽度上的步幅分别为s_ℎ和s_w时,我们称之为步幅(s_h,s_w)。 特别地,当s_ℎ=s_w=s时,我们称步幅为s。

 PS.

1、stride:步幅

 4)总结:

1、填充在输入周围添加额外的行列,来控制输出形状的减少量。

2、步幅是每次滑动核窗口时的行/列的步长,可以成倍的减少输出形状。


有任何问题,欢迎在下方评论留言。

更多深度学习/机器学习内容,详见个人主页:(14条消息) lifein的博客_CSDN博客-Python,Python可视化,机器学习领域博主https://blog.csdn.net/m0_60066036?type=blog

 

 

 

你可能感兴趣的:(机器学习,深度学习,cnn,神经网络,python,人工智能)