神经网络与深度学习(三)——卷积神经网络基础

卷积神经网络基础

1.为什么要学习神经网络

1.1全连接网络问题

  • 链接权过多,算的慢,难收敛,同时可能进入局部极小值,也容易产生过拟合问题

    e.g.输入为1000×1000图像 ,隐含层有 1M 个节点,则输入->隐含层间有1×1012数量级的参数

  • 解决算的慢的问题:减少权值连接,每一个节点只连接到上一层的少数神经元,即局部连接网络

  • 解决难以收敛的问题:权值过多容易产生过拟合问题,如何消除?

    联想到人类解决问题的思路->信息分层处理,每一层在上一层提取特征的基础上进行再处理,抽象出更高级别的特征。

1.2深度学习平台简介

1.3PyTorch简介

是什么?

  • PyTorch是一个 Python 的深度学习库 。它最初由Facebook人工智能研究小组开发而优步的Pyro软件则用于概率编程。
  • 最初PyTorch由Hugh Perkins开发作为基于Torch框架的LusJIT的Python 包装器。PyTorch在Python中重新设计和实现Torch同时为后端代码共享相同的核心C库。
  • 除了Facebook之外Twitter、GMU和Salesforce等机构都采用了PyTorch。
  • 到目前据统计已有80%的研究采用PyTorch包括Google。

基本概念

  • 张量(Tensor)
    是一个物理量,对高维(维数 ≥ 2)的物理量进行"量纲分析"的一种工具。
    简单的可以理解为:一维数组称为矢量,二维数组为二阶张量,三维数组称为三阶张量...
  • 计算图
    用 " 结点 "(nodes)和 " 线 "(edges)的有向图来描述数学计算的图像。" 节点 " 一般用来表示施加的数学操作,但也可以表示数据输入的起点/输出的终点,或者是读取/写入持久变量的终点。" 线 " 表示 " 节点 " 之间的输入/输出关系。这些数据 " 线 " 可以输运 " size可动态调整 " 的多维数据数组,即 " 张量 "(tensor)
  • 注意
    使用 tensor 表示数据
    使用Dataset、DataLoader读取样本数据和标签
    使用变量(Variable)存储神经网络权值等参数
    使用计算图(Computational Graph)来表示计算任务
    在代码运行过程中同时执行计算图

1.4简单示例

构建简单的计算图,每个节点将零个或多个tensor作为输入,产生一个tensor作为输出。PyTorch中,所见即为所得,tensor的使用和numpy中的多维数组类似:

python 复制代码
import torch

x_const = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([3.0, 4.0, 5.0])
output = x_const + y
print(x_const, '\n', y, '\n', output)

输出:

相应计算图:

2.卷积神经网络基础

2.1进化史

2.2特征提取

  • 卷积
    卷积在深度学习中扮演着非常重要的角色,卷积操作是一种有效提取局部特征的方法,它在图像处理、自然语言处理等领域都有广泛的应用。在深度学习中,卷积操作通常用于构建卷积神经网络(Convolutional Neural Networks,CNNs)。CNNs通过在输入数据上滑动一个或多个卷积核(也称为过滤器或滤波器),在每个位置上执行卷积操作来提取特征。卷积核是一种小的、可学习的权重矩阵,它可以有效地捕捉输入数据中的局部模式。

    注:图像卷积时,根据定义,需要首先把卷积核上下左右转置(该操作可以增加模型的灵活性,提高特征提取的效果,并帮助模型更好地适应不同方向上的特征)。此处卷积核(黄色)是对称的,所以忽视。
  • 填充(Padding)
    在矩阵的边界上填充一些值,以增加矩阵的大小,通常用0或者复制边界像素来进行填充。
  • 步长(Stride)
    指卷积核在输入数据上滑动的距离。具体来说,步长定义了在每个方向上卷积核移动的间隔大小。在深度学习中,步长通常是一个超参数,需要在建立卷积神经网络(CNN)时进行指定,可以是任意正整数。如图步长为2:
  • 多通道卷积
    彩色图像一般包括RGB三个通道(channel),输入数据的维度有三个(长,宽,通道数),而滤波器(filter)的通道数需要保证和输入的通道数一致,此时的卷积过程就是多通道的。
  • 下采样/池化 Pooling
    思想:使用局部统计特征,如均值或最大值,解决特征过多的问题,缩小了网络的规模。

2.3基本结构

构成部分:多个卷积层 + 下采样层(池化)+ 全连接层(根据需求添加)

3.学习算法

3.1前向传播


3.2误差反向传播

3.2.1经典BP算法

3.2.2卷积NN的BP算法

下采样层

如果当前是卷积层,下一为采样误差何从回传。假设为 2*2核平均池化


局部误差,如何从卷积层 传到下采样如何从卷积层

  • 卷积层 + 卷积层
  • 卷积层 + 全连接层

4.LeNet-5网络

4.1网络介绍

4.2网络结构详解

  1. C1层(卷积层)

    --由6个Feature Map构成

    --每个神经元对输入进行5*5卷积

    --每个神经元对应5×5+1个参数,共6个Feature Map,28×28个神经元,共有(5 × 5 + 1) × 6 × (28 × 28) = 122304个连接

  2. S2层(Pooling层)

  3. C3层(卷积层)

  4. S4层

    与S2层工作原理相同

  5. C5层

    --120个神经元

    --每个神经元同样对输入进行5×5卷积,与S4全连接

    --总连接数(5 × 5 × 16 + 1) × 120 = 48120

  6. F6层

    --84个神经元

    --与C5全连接

    --总连接数(120 + 1) × 84 = 10164

  7. 输出层

    --由欧式径向基函数单元构成

    --每类一个单元

    --输出RBF单元计算输入向量和参数向量之间的欧式距离

与现在网络的区别

  • 卷积时不进行填充(Padding)
  • 池化层选用平均池化,而非最大池化
  • 选用Sigmoid或tanh,而非ReLU作为非线性环节激活函数
  • 层数较浅,参数数量小(约为6万)

4.3LeNet5代码实现

python 复制代码
import torch
from torch import nn
from d2l import torch as d2l

class Reshape(torch.nn.Module):
	def forward(self, x):
		return x.view(-1, 1, 28, 28)
		
net = torch.nn.Sequential(
	Reshape(),
	nn.Conv2d(1, 6, kernel_size=5, padding=2 ), nn.Sigmoid(),
	nn.AvgPool2d(kernel_size=2 , stride=2),
	nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
	nn.AvgPool2d(kernel_size=2, stride=2),
	nn.Flatten(),
	nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
	nn.Linear(120, 84), nn.Sigmoid(),
	nn.Linear(84 , 10))

说明

  • nn.Sequential()

    该函数可以将不同的模块组合成一个新的模块,将各模块按顺序输入即可。

  • nn.AvgPool2d(kernel_size, stride)或MaxPool2d

    nn.AvgPool2d(kernel_size, stride)或MaxPool2d

    表示平均池化或最大池化层,输入参数分别为池化窗口大小和步长。两个参数可以同时为整数,否则为元组。

  • nn.Sigmoid()

    该函数为上一层的输出添加sigmoid激活函数,类似的还有nn.ReLU(),nn.Tanh()等。

  • nn. Conv2d(in _channels, out_channels, kernel_size)

    卷积层,其三个参数按顺序代表输入通道数、输出通道数、卷积核大小。若卷积核形状为正方形,则卷积核大小可以为int,否则卷积核大小必须为元组(tuple)。如:nn.Conv2d(1, 6, (5,4))即代表卷积核大小为5×4。

  • stride参数:

    可以规定卷积的步长,与卷积核大小类似,若各方向步长相同则可以为整数,否则应为元组。

  • padding参数:

    在图像的周围补充0的个数,常常用于控制卷积前后图像的尺寸大小。

相关推荐
Adenialzz30 分钟前
Rectified Flow 原理简介与示例代码解读
人工智能·深度学习·机器学习·计算机视觉·diffusion
winner88811 小时前
强化学习基础之贝尔曼期望方程
深度学习·贝尔曼方程·马尔科夫链
少说多想勤做2 小时前
【前沿 热点 顶会】AAAI 2025中与目标检测有关的论文
人工智能·深度学习·神经网络·目标检测·计算机视觉·目标跟踪·aaai
橙子小哥的代码世界4 小时前
【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用
图像处理·人工智能·深度学习·神经网络·计算机视觉·分类·卷积神经网络
leigm1234 小时前
深度学习使用Anaconda打开Jupyter Notebook编码
人工智能·深度学习·jupyter
人类群星闪耀时9 小时前
深度学习在灾难恢复中的作用:智能运维的新时代
运维·人工智能·深度学习
机器懒得学习10 小时前
从随机生成到深度学习:使用DCGAN和CycleGAN生成图像的实战教程
人工智能·深度学习
落魄君子10 小时前
BP回归-反向传播(Backpropagation)
人工智能·神经网络·回归
烟波人长安吖~10 小时前
【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL
vue.js·pytorch·spring boot·深度学习·yolo·目标跟踪
最好Tony11 小时前
深度学习blog-Transformer-注意力机制和编码器解码器
人工智能·深度学习·机器学习·计算机视觉·自然语言处理·chatgpt