目录
(一)卷积神经网络和多层感知机的应用差别:
(二)卷积神经网络的应用场景:
(三)卷积神经网络的性质
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:
-首先开始训练两个深度卷积神经网络(即策略网络),用于动作预测。
-在这两个网络架构中,其中一个深度更深,能够产生更准确的结果,而另一个则更浅,可以更快地进行评估。我们将它们分别称为强策略网络和快策略网络。
这意味着检测对象在输入二维图像X中的平移,应该仅导致隐藏表示H中的平移。也就是说,V和U实际上不依赖于(i,j)的值,即[V]i,j,a,b=[V]a,b。并且U是一个常数,比如u。因此,我们可以简化H定义为:
这就是卷积(convolution)。我们是在使用系数[V]a,b对位置(i,j)附近的像素(i+a,j+b)进行加权得到[V]a,b。 注意,[V]a,b的系数比[V]i,j,a,b少很多,因为前者不再依赖于图像中的位置。这也是卷积神经网络在图像识别等显著的进步,即增加了其鲁棒性。
平移不变性:一个图像中的元素,不论移动到哪里都能被识别。即在草地上的大白鹅能被识别为大白鹅,在水里的大白鹅也能被识别成大白鹅。
·卷积:平移不变模式
·局部图像可以根据平移不变形用相同的方式处理,而不依赖它的位置。
·局部性意味着计算相应的隐藏表示只需要一小部分局部图像像素。
·相较于全连接层,卷积层通常需要更少的参数,但依旧可以获得高效用的模型。(卷积神经网络网络不比多层感知机细致,但是更快。)
·定义—种提取局部特征的方法,可有效响应特定的局部模式
·用这种方法遍历整张图片
PS.平移不变性
1) V是四阶权重张量W转化而来的,从W到V的转换只是形式上的转换,因为在这两个四阶张量的元素之间存在一一对应的关系;【具体实现方法为:相互关系运算】
2) (i,j)表示在图像中的位置,类似于坐标(因为这里指的是二维图像,所以只有i和j两个参数);
3)[X]i,j和[H]i,j分别表示输入图像和隐藏表示中位置(i,j)处的像素。
为了收集用来训练参数[H]i,j的相关信息,我们不应偏离到距(i,j)很远的地方。这意味着在|a|>Δ或|b|>Δ的范围之外,我们可以设置[V]a,b=0。因此,我们可以将[H]i,j重写为
简而言之, 是一个卷积层(convolutional layer),而卷积神经网络是包含卷积层的一类特殊的神经网络。V被称为卷积核(convolution kernel)或者滤波器(filter),亦或简单地称之为该卷积层的权重,通常该权重是可学习的参数。
局部性:可以通过设置卷积核或者滤波器中的参数,着重强调图像中想要获取的部分,弱化其他部分的。
例如,图像中目标的边缘检测。
·池化:下采样被检测物体不变模式
· 在神经网络逐层累加过程中,可以直接对图像进行缩放
· 缩放到适当大小后,可以在特征提取过程中得到有效响应
PS.超参数
1、在卷积层:卷积核尺寸、卷积核数量、卷积的步长(stride)、填充(padding)、偏移(bias)都是超参数,需要人手工设置,不能通过训练得到。但是需要不断根据训练结果进行调参,来达到更好的结果。
link池化层的超参数:池化核尺寸、池化步长、池化方式。
link机器学习的超参数:学习率lr。
在卷积层中,输入张量X和核张量K通过互相关运算产生输出张量。
在二维互相关运算中,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。
1)一维交叉相关:文本、语音、时间序列……
2)三维交叉相关:视频、医学图像、气象地图……
PS.
1、上述平移不变性便是运用的这个原理。
2、二维交叉相关严格来说不算是卷积。
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为手动设置的卷积核
基于上面定义的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、局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。
在应用多层卷积时,我们常常丢失边缘像素。 由于我们通常使用小卷积核,因此对于任何单个卷积,我们可能只会丢失几个像素。 但随着我们应用许多连续卷积层,累积丢失的像素数就多了。 解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是0)。
总结:不想让输出变小,就用填充。
PS.填充
1、通常取p_n = k_n -1, p_w = k_w -1的输出和输入不会发生变化
2、在上侧填充p_n /2:向上取整,在下侧填充p_n /2:向下取整。
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——宽度填充数。
在计算互相关时,卷积窗口从输入张量的左上角开始,向下、向右滑动。 在前面的例子中,我们默认每次滑动一个元素。 但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。
步幅(stride):每次滑动元素的数量.
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:步幅
1、填充在输入周围添加额外的行列,来控制输出形状的减少量。
2、步幅是每次滑动核窗口时的行/列的步长,可以成倍的减少输出形状。
有任何问题,欢迎在下方评论留言。
更多深度学习/机器学习内容,详见个人主页:(14条消息) lifein的博客_CSDN博客-Python,Python可视化,机器学习领域博主https://blog.csdn.net/m0_60066036?type=blog