【人工智能学习之卷积神经网络篇(一)】

本文深入探讨了全连接神经网络的缺点,如参数过多和空间信息丢失,并引出了卷积神经网络(CNN)作为解决方案。CNN通过局部连接、权重共享减少参数量,利用卷积运算保持空间信息。文章详细介绍了卷积层的结构、运算方式、参数计算,以及卷积的优缺点,如参数减少和权重共享带来的局部感知能力。此外,还讨论了填充、步长、多通道卷积、池化层的作用,以及卷积网络的结构如LeNet5。通过对全连接网络和CNN的主要对比,强调了CNN在处理图像数据时的空间依赖性优势。
摘要由CSDN通过智能技术生成

1 全连接神经网络的缺点

1.1 缺点

  • 输入数据的空间信息被丢失
    空间上相邻的像素点往往具有相似的RGB值,RGB的各个通道之间的数据通常密切相关,但是转化成1维向量时,这些信息被丢失。如图所示,空间位置相邻的两个点,转化成1维向量后并没有体现出他们之间的空间关联性。
  • 模型参数过多,容易发生过拟合
    由于每个像素点都要跟所有输出的神经元相连接。当图片尺寸变大时,输入神经元的个数会按图片尺寸的平方增大,导致模型参数过多,容易发生过拟合。例如:对于一幅1000×1000 的输入图像而言,如果下一个隐含层的神经元数目为106个,那么将会有1000×1000×106=1012 个权重参数,可以想象,如此大规模的参数量使得网络很难训练。

为了解决上述问题,引入卷积(Convolution)来对输入的图像进行特征提取。
卷积的计算范围是在像素点的空间邻域内进行的,因此可以利用输入图像的空间信息;此外,由于卷积具有局部连接、权重共享等特性,卷积核参数的数目也远小于全连接层。

1.2 参数对比

通过对比可以直观感受到两种网络的参数比较

net1 = nn.Linear(3 * 200 * 200, 10)
net2 = nn.Conv2d(3, 1, 3, 1)
print([p.numel() for p in net1.parameters()]) #[1200000, 10]
print([p.numel() for p in net2.parameters()]) #[27, 1]
it = iter(net1.parameters())
print(it.__next__().numel())
print(it.__next__().numel())
import torch
data = torch.randn(1, 1, 4, 4)
print(data)
print(data.shape)
conv = torch.nn.Conv2d(in_channels=1,
out_channels=1, kernel_size=3)
# 卷积参数
print("卷积参数")
print(conv.weight.numel())
print(conv.bias.numel())
conv_out = conv(data)
print(conv_out)
fc_in = torch.flatten(data)
fc = torch.nn.Linear(16, 4)
# 感知机参数
print("感知机参数")
print(fc.weight.numel())
print(fc.bias.numel())
fc_out = fc(fc_in)
print(fc_out)

2 卷积神经网络(CNN)

在全连接神经网络中,相邻层的所有神经元之间都有连接,这称为全连接(fully-connected)。另外,我们用Affine层实现了全连接层。如果使用这个Affine层,一个5层的全连接的神经网络就可以通过下图网络结构来表示。
在这里插入图片描述

2.1 整体结构

CNN(Convolutional Neural Networks)是一种神经网络,是图像处理最佳算法之一,在图像分割、分类、检测和检索任务中广泛使用。
卷积神经网络整体结构如图:
卷积神经网络整体结构
CNN 中新增了Convolution 层 和 Pooling 层。CNN 的层的连接顺序是“Convolution - ReLU -(Pooling)”(Pooling层有时会被省略)。这可以理解为之前的“Affine - ReLU”连接被替换成了“Convolution - ReLU -(Pooling)”连接。
CNN中,靠近输出的层中使用了之前的“Affine - ReLU”组合。此外,最后的输出层中使用了之前的“Affine-Softmax"组合。这些都是一般的CNN中比较常见的结构。

2.2 卷积层

2.2.1 卷积运算

卷积运算示意图如下,这是一个3*3的卷积核正在进行卷积运算,对绿色部分卷积得到了-58的结果。思考一下这是如何运算的?
在这里插入图片描述
下面我们根据下面这幅图详细解释。
在这里插入图片描述
第一行3个数:1 * 2 + 2 * 0 + 3 * 1 = 5
第二行3个数:0 * 0 + 1 * 1 + 2 * 2 = 5
第二行3个数:3 * 1 + 0 * 0 + 1 * 2 = 5
最后三者相加:5 + 5 + 5 = 15
这样就得到了卷积后的第一个数是15。

2.2.2 卷积层之偏置

卷积核除了拥有权重weight以外,还有一个参数偏置bias,即y = wx+b中的常数b。
它的计算方式如下图,在得到的特征值上逐个相加,得到最终的特征图。
在这里插入图片描述

2.2.3 特征图大小计算

那么特征图的大小是怎么得到的呢,我们如何知道运算过后的特征图有多大呢?上图4 * 4的大小卷积过后为什么是2 * 2?如果是6 * 6的图像大小,经过3 * 3卷积过后会是什么样?
在这里插入图片描述
通过上图的公式,我们不难得到如果是6 * 6的图像大小,经过3 * 3卷积过后会是4 * 4的结果。

2.3 卷积的优点

2.3.1 减少网络的参数量

全连接参数:
个数计算: 16 * 4 = 64
参数特点: 参数过多容易产生过拟合; 计算量比较大

卷积参数个数:
个数计算: 9
参数特点:
权重共享(y1 = x1w1 + x2w2 + x3w3+…+x7w7+x8w8+x9w9),参数相对较少,防止过拟合。

2.3.2 权重共享

用一个卷积核去扫描一张图,卷积核的参数就叫权重,图的每个位置是被同样的卷积核扫的,所以卷积计算的权重是一样的,叫权值共享。
在这里插入图片描述
权重共享的作用主要有以下几点:

  • 参数减少
    相比于全连接层,卷积层采用权重共享可以大大减少需要学习的参数数量。在全连接层中,每个输入神经元都与每个输出神经元相连接,需要学习的参数数量非常庞大,而在卷积层中,由于权重共享,同一组特征图中的所有神经元都共享相同的权重参数,从而大大减少了需要学习的参数数量,降低了过拟合的风险。
  • 局部感知能力
    权重共享使得卷积层具有局部感知能力,能够对输入数据的局部区域进行特征提取。卷积操作通过使用相同的权重参数对输入的不同位置进行卷积运算,从而在不同的位置上提取相同的特征(边缘、纹理等)。这对于图像等数据的处理非常有用,因为图像中的局部区域通常包含有用的信息,例如图像中的边缘、纹理等。通过权重共享,卷积层可以捕捉到输入数据的局部特征,从而增强了模型的局部感知能力。

简单来说,权重共享在卷积神经网络中起到了减少参数数量、增
强局部感知能力的作用。

2.4 卷积运算之填充

对大小为(4, 4)的输入数据应用(3, 3)的卷积核(滤波器)时,输出大小变为(2, 2),相当于输出大小比输入大小缩小了 2个元素。在反复进行多次卷积运算的深度网络中会成为问题。为什么呢?因为如果每次进行卷积运算都会缩小,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。
在这里插入图片描述
在这里插入图片描述

import torch
import torch.nn.functional as F
from torch.nn import Parameter
weight = torch.tensor([[2, 0, 1],
[0, 1, 2],
[1, 0, 2]],
dtype=torch.float32)
# N C H W
weight = weight.reshape(1, 1, 3, 3)
# 类型转换
weight = Parameter(weight)
conv = torch.nn.Conv2d(1, 1, kernel_size=3,
padding=1, bias=False)
# 使用卷积运算之前先赋值
conv.weight = weight
data = torch.tensor([[1, 2, 3, 0],
[0, 1, 2, 3],
[3, 0, 1, 2],
[2, 3, 0, 1]],
dtype=torch.float32)
# # N C H W
data = data.reshape
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值