卷积神经网络CNN——卷积层、池化层、全连接层

embedded/2024/11/20 1:46:57/

文章目录

  • 1.CNN网络的构成
  • 2.卷积层
    • 2.1卷积的计算方法
    • 2.2 padding
    • 2.3 stride
    • 2.4 多通道卷积
    • 2.5 多卷积核卷积
    • 2.6 特征图大小
  • 3.池化层(Pooling)
    • 3.1 最大池化
    • 3.2平均池化
  • 4.全连接层
  • 5.卷积神经网络的搭建
    • 5.1 数据加载
    • 5.2 数据处理
    • 5.3 模型搭建
    • 5.4 模型编译
    • 5.5 模型训练
    • 5.6 模型评估

学习目标

  1. 了解卷积神经网络的构成
  2. 知道卷积的原理以及计算公式
  3. 了解池化的作用以及计算过程

我们之前学习了全连接的神经网络,如下图:
在这里插入图片描述
利用全连接神经网络对图像进行处理存在以下两个问题:

  1. 需要处理的数据量太大了,比如说我么你的图片是100*100,通道数为3,那么参数量就是3,000,000,处理这么大的数据是非常耗资源的。
  2. 图像在维度调整的过程中很难保留原有的特征,导致图像处理的准确率不高,如下图:
    在这里插入图片描述
    假如有圆形是1,没有圆形是0,那么圆形的位置不同就会产⽣完全不同的数据表达。但是从图像的⻆度来看,图像的内容(本质)并没有发⽣变
    化,只是位置发⽣了变化。所以当我们移动图像中的物体,⽤全连接升降得到的结果会差异很⼤,这是不符合图像处理的要求的。

1.CNN网络的构成

CNN⽹络受⼈类视觉神经系统的启发,⼈类的视觉原理:从原始信号摄⼊开始(瞳孔摄⼊像素 Pixels),接着做初步处理(⼤脑⽪层某些细胞发现边缘和⽅向),然后抽象(⼤脑判定,眼前的物体的形状,是圆形的),然后进⼀步抽象(⼤脑进⼀步判定该物体是只⼈脸)。下⾯是⼈脑进⾏⼈脸识别的⼀个示例:
在这里插入图片描述
CNN网络主要有三部分构成:卷积层、池化层和全连接层构成。其中卷积层是负责提取图像中的局部特征;池化层是用来答复降低参数量级(降维);全连接层类似人工神经网络的部分,用来输出想要的结果。

作用
卷积层提取图像特征
池化层降维、防止过拟合
全连接层输出结果

整个CNN网络结果如下图所示:
在这里插入图片描述

2.卷积层

卷积层是卷积神经⽹络中的核⼼模块,卷积层的⽬的是提取输⼊特征图的特征,如下图所示,卷积核可以提取图像中的边缘信息。
在这里插入图片描述

2.1卷积的计算方法

在这里插入图片描述
卷积运算本质上就是在滤波器和输入数据的局部区域做点积。(我们不需要关注这些数据是怎么来的,计算机会自动提取图像的特征)
在这里插入图片描述
左上角的点计算的方法为:
在这里插入图片描述
同理可以计算其他各点,得到最终的卷积结果:
在这里插入图片描述
我们先粗略的讲一下下面名词的含义。

2.2 padding

在上述卷积过程中,特征图⽐原始图减⼩了很多,我们可以在原图像的周围进⾏padding,来保证在卷积过程中特征图⼤⼩不变。
在这里插入图片描述
如上图,我们在输入图像的一周设置了一个padding(=1),一般都是置为0,后面会详细讲解padding。

2.3 stride

stride表示的就是卷积核一次移动几格的问题。

例如,我们按照步长为1来移动卷积核,计算特征图如下所示:
在这里插入图片描述
如果我们把stride增大,设为2,如下图:
在这里插入图片描述

2.4 多通道卷积

实际中的图像都是多个通道组成的,我们怎么计算卷积呢?
在这里插入图片描述
计算方法如下:当输入有多个通道(channel)时,比如说RGB图片有三个通道,==卷积核需要有相同的通道(channel)数,==每个卷积核channeyu输入图像对应的channel进行卷积,将每个channel的卷积结果按位相加得到最终的Feature Map(特征图)
在这里插入图片描述

2.5 多卷积核卷积

如果有多个卷积核时,每个卷积核学习到不同的特征,对应包含多个channel的Feature Map,例如下面有两个filter(卷积核),所以output有两个通道(channel)。
在这里插入图片描述

2.6 特征图大小

最终输出的特征图的大小与一下参数息息相关。

  • size:卷积核/过滤器的大小,一般使用奇数,比如说 1 * 1,3 * 3,5 * 5
  • padding:零填充的方式
  • stride:步长

计算方式如下:

比如我们输入图像的大小是:H1W1D1,卷积核(filter)的数量是K,卷积核的大小是F,步长strides是S,零填充(padding)大小是P。我们输出的特征大小是:H2W2D2

那么:
在这里插入图片描述
示例:输⼊特征图为5x5,卷积核为3x3,外加padding 为1,则其输出尺⼨为
在这里插入图片描述
如下图所示:
在这里插入图片描述
在tf.keras中卷积核的实现:

tf.keras.layers.Conv2D(filters, kernel_size, strides=(1,1),padding='vaild', activation=None
)

参数解释如下:

参数描述
filters卷积核(过滤器)的数量,对应输出特征图的通道数
kernel_size卷积核(过滤器)的大小
strides步长
padding填充大小,有两个重要参数;①vaild:对输入周围不进行padding②same:padding后使输入特征图和输出特征图形状相同
activation激活函数

3.池化层(Pooling)

池化层的目的是为了降低后序网络的输入维度,缩减模型大小,提高计算速度,并且提高Feature Map的鲁棒性,防止过拟合。

他主要对卷积层学习到的特征图进行下采样处理,主要有两种。

Q:什么是上采样和下采样?
A:①在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样。
②在卷积神经网络(Convolutional Neural Networks, CNNs)中,下采样通常是通过池化层(Pooling Layers)来实现的,例如最大池化(Max Pooling)或平均池化(Average Pooling)。这些池化操作通过对图像中相邻像素区域进行聚合来减小特征图的空间尺寸,从而减少网络中的参数数量,提高计算效率,并且有助于防止过拟合。

3.1 最大池化

Max Pooling:取窗⼝内的最⼤值作为输出,这种⽅式使⽤较⼴泛。
在这里插入图片描述
在tf.keras中实现方法为:

tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=None, padding='vaild'
)

参数解释如下:

参数描述
pool_size=池化窗口的大小
strides窗口移动的步长,默认为1
padding是否进行填充,默认不进行填充

3.2平均池化

Avg Pooling:取窗⼝内的所有值的均值作为输出
在这里插入图片描述
在tf.keras中实现方法为:

tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='vaild'
)

4.全连接层

全连接层位于CNN⽹络的末端,经过卷积层的特征提取与池化层的降维后,将特征图转换成⼀维向量送⼊到全连接层中进⾏分类或回归的操作。
在这里插入图片描述
在tf.keras中全连接层使⽤tf.keras.dense实现。

5.卷积神经网络的搭建

我们构建卷积神经⽹络在mnist数据集上进⾏处理,如下图所示:LeNet-5是⼀个较简单的卷积神经⽹络, 输⼊的⼆维图像,先经过两次卷积层,池化层,再经过全连接层,最后使⽤softmax分类作为输出层。
在这里插入图片描述
我们先导入相关工具包:

import tensorflow as tf
# 导入数据集
from tensorflow.keras.datasets import mnist

5.1 数据加载

与全连接神经⽹络的案例⼀致,⾸先加载数据集:

# 数据加载
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

5.2 数据处理

卷积神经⽹络的输⼊要求是:N H W C ,分别是图⽚数量,图⽚⾼度,图⽚宽度和图⽚的通道,本里中因为是灰度图,通道为1。

# 数据处理
# 维度调整
# 训练集
train_images = tf.reshape(train_images, (train_images.shape[0], train_images.shape[1], train_images.shape[2], 1))
# (60000, 28, 28) -> (60000, 28, 28, 1)
# 测试集
test_images = tf.reshape(test_images, (test_images.shape[0], test_images.shape[1], test_images.shape[2], 1))
# (10000, 28, 28) -> (10000, 28, 28, 1)

5.3 模型搭建

Lenet-5模型输⼊的⼆维图像,先经过两次卷积层,池化层,再经过全连接层,最后使⽤softmax分类作为输出层,模型构建如下:

# 模型构建
net = tf.keras.models.Sequential([# 卷积层:6个5*5的卷积核,激活是sigmoidtf.keras.layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid'),# 最⼤池化tf.keras.layers.MaxPool2D(pool_size=2, strides=2),# 卷积层:16个5*5的卷积核,激活是sigmoidtf.keras.layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'),# 最⼤池化tf.keras.layers.MaxPool2D(pool_size=2, strides=2),# 维度调整为1维数据tf.keras.layers.Flatten(),# 全卷积层,激活sigmoidtf.keras.layers.Dense(120, activation='sigmoid'),# 全卷积层,激活sigmoidtf.keras.layers.Dense(84, activation='sigmoid'),# 全卷积层,激活softmaxtf.keras.layers.Dense(10, activation='softmax')
])

5.4 模型编译

设置优化器和损失函数:

# 模型编译,优化器,损失函数,评价指标
net.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.9),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])

5.5 模型训练

模型训练:

# 模型训练
net.fit(train_images, train_labels, epochs=5, batch_size=128, verbose=1)

5.6 模型评估

# 模型评估
net.evaluate(test_images, test_labels, verbose=1)

http://www.ppmy.cn/embedded/138930.html

相关文章

ue5 蓝图学习(一)结构体的使用

在内容浏览器中右键 蓝图-选择结构体 下面这东西就是结构体,和C的结构体差不多 双击一下 可以添加变量,设置变量的类型和默认值。 可以在关卡蓝图中调用它。 点击打开关卡蓝图,添加变量 在变量的右侧,变量类型里搜索strcut&#…

CentOS网络配置

上一篇文章:VMware Workstation安装Centos系统 在CentOS系统中进行网络配置是确保系统能够顺畅接入网络的重要步骤。本文将详细介绍如何配置静态IP地址、网关、DNS等关键网络参数,以帮助需要的人快速掌握CentOS网络配置的基本方法和技巧。通过遵循本文的…

【Linux】环境变量详解

Linux环境变量 1.环境变量分类2.环境变量相关指令3.常用的环境变量4.环境变量的组织方式5.获取环境变量6.命令行参数 1.环境变量分类 按生命周期划分: 永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永…

LeetCode 18. 四数之和 Java题解

这道题是扩展的三数之和。在三数之和中,我们固定a,利用双指针寻找b和c(两头分别开始找),将复杂度从3次方降到了2次方。在四数之和中,我们固定a和b,双指针寻找c和d。将复杂度从4次方降到了3次方。 1.考虑剪枝情况。如果…

【项目组件】第三方库——MySQL CAPI

目录 前言 MySQL CAPI的功能 MySQL CAPI的接口 句柄初始化 连接MySQL服务器 设置当前字符集 选择操作数据库 执行SQL语句 保存查询结果到本地(获取结果集) 获取结果集中的行数 获取结果集中的列数 遍历结果集 释放结果集 关闭MySQL连接 获取错误原因 M…

什么是 C++ 中的友元函数和友元类?友元的作用是什么?有什么注意事项?

友元函数 定义 友元函数是在类中声明的非成员函数,它可以访问类的私有(private)和保护(protected)成员。友元函数虽然不是类的成员函数,但它被授予了访问类内部成员的特殊权限。 声明方式 在类的定义中…

uni-app页面跳转

2024年8月6日 https://uniapp.dcloud.net.cn/api/router.html#navigateto 非tabBar页面跳转 可用多种方式进行跳转,区别在于对其他页面的处理方式。 uni.navigateTo(OBJECT) 保留当前页面,跳转到应用内的某个非tabBar页面,使uni.navigateBa…

科研绘图系列:R语言基因组突变和拷贝数变异瀑布图(oncoPrint)

文章目录 介绍说明解读:加载R包数据下载导入数据数据预处理图1:组间差异基因比较图2: 瀑布图图3: 瀑布图2图4: TMB组间差异散点图图5: 分组小提琴图图6: 小提琴图系统信息介绍 maftools的瀑布图(Oncoplot),也称为水落图,是一种在癌症基因组学研究中常用的可视化工具,用于…