六、卷积神经网络(CNN)基础

news2024/11/22 18:58:20

卷积神经网络(CNN)基础

  • 前言
  • 一、CNN概述
  • 二、卷积层
    • 2.1 卷积
    • 2.2 步幅(Stride)
    • 2.3 填充(Padding)
    • 2.4 多通道卷积
    • 2.5 多卷积计算
    • 2.6 特征图大小计算
    • 2.7 代码演示
  • 三、池化层
    • 3.1 池化层计算
      • 3.1.1 最大池化层
      • 3.1.2 平均池化层
    • 3.2 填充(Padding)
    • 3.3 步幅(Stride)
    • 3.4 多通道池化计算
    • 3.5 代码演示
  • 总结


前言

  • 卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。
  • 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今几乎所有的图像识别、目标检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。

一、CNN概述

  • 卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络
  • 卷积层的作用就是用来自动学习、提取图像的特征
  • 主要由三部分组成:
    • 卷积层:负责提取图像中的局部特征
    • 池化层:用来大幅降低参数量级(降维)
    • 全连接层:用来输出想要的结果

二、卷积层

  • 卷积层其实就是将我们输入的张量通过与卷积核的运算得到新的张量的过程
    在这里插入图片描述
  • Input 表示输入的张量
  • Filter 表示卷积核, 也叫做卷积核(滤波矩阵)
  • Input 经过 Filter 得到输出为最右侧的图像,该图叫做特征图

2.1 卷积

  • 卷积运算本质上就是在卷积核和输入数据的局部区域间做点积
  • Output的第一行第一个数计算过程:
    • 1 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 = 4 1*1+1*0+1*1+0*0+1*1+1*0+0*1+0*0+1*1=4 11+10+11+00+11+10+01+00+11=4
      在这里插入图片描述
  • 卷积通过移动,对不同位置进行卷积运算,最终的特征图结果为:
    在这里插入图片描述

2.2 步幅(Stride)

  • 上述演示中卷积核的步幅(移动步长)为1,其计算特征图过程如下:
    在这里插入图片描述
  • 如果步长变成 2,则计算特征图过程就变成:
    在这里插入图片描述

2.3 填充(Padding)

  • 通过上面的卷积计算过程,最终的特征图比原始图像小很多,如果想要保持经过卷积后的图像大小不变, 可以在原图周围添加 Padding 来实现.
    在这里插入图片描述

2.4 多通道卷积

  • 实际上我们处理的图像都是多通道组成,那么我们怎么计算卷积呢?

在这里插入图片描述

  • 我们对每个通道的输入,分别与卷积核进行运算,得到的三个卷积后的tensor,然后将三个tensor进行加法运算,得到最终的tensor:
    在这里插入图片描述

2.5 多卷积计算

在这里插入图片描述

  • 当使用多个卷积核的时候,我们会对每个卷积核与输入的张量进行卷积,最后得到的是两个卷积后的tensor,我们可以根据需要,将其进行堆叠。

在这里插入图片描述

2.6 特征图大小计算

  • 公式:
    N = W − F + 2 P S + 1 N = \frac{W-F+2P}{S}+1 N=SWF+2P+1

    • 输入图像大小: W W W x W W W
    • 卷积核大小: F F F x F F F
    • Stride: S S S
    • Padding: P P P
    • 输出图像大小: N N N x N N N
  • 举例:

    • 图像大小: 5 x 5
    • 卷积核大小: 3 x 3
    • Stride: 1
    • Padding: 1
    • (5 - 3 + 2) / 1 + 1 = 5, 即得到的特征图大小为: 5 x 5
      在这里插入图片描述

2.7 代码演示

代码演示如下:

conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
"""
参数说明:
	in_channels:输入的通道数
	out_channels:输出通道,也可以理解为卷积核kernel的数量
	kernel_size:卷积核的高和宽设置,一般设置为3,5,7....
	stride:卷积核移动的步长
	padding:在四周加入的padding的数量,默认补 0

"""
import torch
import torch.nn as nn
import matplotlib.pyplot as plt

def my_test():
    # 读取图像, 形状: (640, 640, 3)
    img = plt.imread('data/img.jpg') # 这里放你们的图片路径,绝对路径和相对路径都可以
    plt.imshow(img)
    plt.axis('off')
    plt.show()
    # 构建卷积层
    # out_channels表示卷积核个数
    # 修改out_channels,stride,padding观察特征图的变化情况
    conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=2, padding=0)
    # 输入形状: (BatchSize, Channel, Height, Width)
    # img形状: torch.Size([3, 640, 640])
    img = torch.tensor(img).permute(2, 0, 1)
    # img形状: torch.Size([1, 3, 640, 640])
    img = img.unsqueeze(0)
    # 将图像送入卷积层中
    feature_map_img = conv(img.to(torch.float32))
    # 打印特征图的形状
    print(feature_map_img.shape) 

if __name__ == '__main__':
    my_test()

# 输入的图像原来是 (640, 640, 3),然后经过维度变化后变成了(3,640,640),
# 再转成tensor就变成(1,3,640,640)
# 经过卷积运算后变成了(1,3,319,319) 除不尽的时候舍弃小数位

三、池化层

  • 池化层 (Pooling) 是为了降低维度, 缩减模型大小,提高计算速度.

3.1 池化层计算

3.1.1 最大池化层

  • 当确定了池化窗口大小的时候,取窗口内最大的数作为池化后的一个结果
    在这里插入图片描述

3.1.2 平均池化层

  • 当确定了池化窗口大小的时候,取窗口内所有的数取平均值作为池化后的一个结果
    在这里插入图片描述

3.2 填充(Padding)

在这里插入图片描述

3.3 步幅(Stride)

在这里插入图片描述

3.4 多通道池化计算

在这里插入图片描述

3.5 代码演示

代码演示如下:

# 最大池化
nn.MaxPool2d(kernel_size=2, stride=2, padding=1)
# 平均池化
nn.AvgPool2d(kernel_size=2, stride=1, padding=0)
  1. 单通道池化
import torch
import torch.nn as nn

def test01():
    # 定义输入输数据 【1,3,3 】
    inputs = torch.tensor([[[0, 1, 2],
     						[3, 4, 5], 
     						[6, 7, 8]]]).float()
    # 修改stride,padding观察效果
    # 1. 最大池化
    polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)
    output = polling(inputs)
    print("最大池化:\n", output)
    # 2. 平均池化
    polling = nn.AvgPool2d(kernel_size=2, stride=1, padding=0)
    output = polling(inputs)
    print("平均池化:\n", output)

if __name__ == '__main__':
    test01()
"""
经过最大池化后的tensor:tensor([[[4., 5.],
         						[7., 8.]]])
         						
经过最大池化后的tensor:tensor([[[2., 3.],
         						[5., 6.]]])
"""
  1. 多通道池化
import torch
import torch.nn as nn

def test02():
    # 定义输入输数据 【3,3,3 】
    inputs = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],
                           [[10, 20, 30], [40, 50, 60], [70, 80, 90]],
                           [[11, 22, 33], [44, 55, 66], [77, 88, 99]]]).float()
    # 最大池化
    polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)
    output = polling(inputs)
    print("多通道池化:\n", output)

if __name__ == '__main__':
    test02()

"""
多通道池化:
 tensor([[[ 4.,  5.],
          [ 7.,  8.]],

         [[50., 60.],
          [80., 90.]],

         [[55., 66.],
          [88., 99.]]])
"""

总结

  • 我们对卷积神经网络中的卷积层和池化层做了演示,并且进行了相关代码的展示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程

在当今数字化、网络化的视频监控领域,大中型项目对于视频监控管理平台的需求日益增长,特别是在跨区域、多设备、高并发的复杂环境中。EasyCVR视频监控汇聚管理平台正是为了满足这些需求而设计的,它不仅提供了全面的管理功能,还支持…

Jmeter中的断言(四)

13--XPath断言 功能特点 数据验证:验证 XML 响应数据是否包含或不包含特定的字段或值。支持 XPath 表达式:使用 XPath 表达式定位和验证 XML 数据中的字段。灵活配置:可以设置多个断言条件,满足复杂的测试需求。 配置步骤 添加…

实验室管理解决方案:Spring Boot技术

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

【STM32】USART串口数据包

数据包的作用是将一个个单独的数据打包起来,方便进行多字节的数据通信 数据包格式 HEX数据包 文本数据包 数据包接收 HEX数据包接收(固定包长) 文本数据包接收(可变包长) 串口收发HEX数据包 接线图 Serial模块 se…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4,除了C标准库以外,不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试,并自动安装。如果使用Eigen库,只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

tcpdump交叉编译

TCPDUMP在Libpcap上开发。 首先需要编译libcap。 网上那么多教程,下载地址都只给了一个英文的官网首页, 你尽可以试试,从里面找到下载地址都要费半天时间。 \color{red}网上那么多教程,下载地址都只给了一个英文的官网首页&#…

【智谱开放平台-注册_登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器,由七个电路模块组成,分别是:单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中,单片机模块是整个…

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…

内网安全隧道搭建-ngrok-frp-nps-sapp

1.ngrok 建立内网主机与公网跳板机的连接: 内网主机为客户机: 下载客户端执行 2.frp (1)以下为内网穿透端口转发 frp服务端配置: bindPort 为frp运行端口 服务端运行 ./frps -c frps.ini frp客户端配置&#xf…

.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper

目录 .NET桌面应用架构Demo与实战|WPFMVVMEFCoreIOCDICode FirstAutoPapper技术栈简述项目地址:功能展示项目结构项目引用1. 新建模型2. Data层,依赖EF Core,实现数据库增删改查3. Bussiness层,实现具体的业务逻辑4. Service层&am…

Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制

基于Altium Designer 23学习版,四层板智能小车PCB 更多AD学习笔记:Altium Designer学习笔记 1-5 工程创建_元件库创建 目录 6、光耦及二极管元件库模型创建 7、元件库模型的调用 二、原理图绘制及编译检查 8、元件的放置 9、器件的复制及对齐 10、…

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1:完成网络部署 2、任务 2:设计全网 IP 地址 3、任务 3:实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …

Figma插件指南:12款提升设计生产力的插件

在当今的设计领域,Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展,这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件,帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事,同事在导入项目运行时遇到IDEA报包不存在,但实际存在的问题,最终通过以下方式解决 现象 在IDEA里启动运行项目,报某个类有问题,引入的包不存在。 点击这个引入的包,可…

SemiDrive E3 硬件设计系列---唤醒电路设计

一、前言 E3 系列芯片是芯驰半导体高功能安全的车规级 MCU,对于 MCU 的硬件设计部分,本系列将会分模块进行讲解,旨在介绍 E3 系列芯片在硬件设计方面的注意事项与经验,本文主要讲解 E3 硬件设计中唤醒电路部分的设计。 二、RTC 模…

vue中路由缓存

vue中路由缓存 问题描述及截图解决思路关键代码及打印信息截图 问题描述及截图 在使用某一平台时发现当列表页码切换后点击某一卡片进入详情页后,再返回列表页时页面刷新了。这样用户每次看完详情回到列表页都得再重新输入自己的查询条件,或者切换分页到…

Qt桌面应用开发 第五天(常用控件 自定义控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…

android studio无法下载,Could not GET xxx, Received status code 400

-- 1. 使用下面的地址代替 原地址: distributionUrlhttps\://services.gradle.org/distributions/gradle-6.5-all.zip 镜像地址: distributionUrlhttps\://downloads.gradle-dn.com/distributions/gradle-6.5-all.zips 上面的已经不好用了 https\://mirrors.cloud.tencent.c…

【SpringBoot】【log】 自定义logback日志配置

前言:默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格…