卷积神经网络CNN
目录
一、CNN概述
二、图像基础知识
三、卷积层
3.1 卷积的计算
3.2 Padding
3.3 Stride
3.4 多通道卷积计算
3.5 多卷积核卷积计算
3.6 特征图大小计算
3.7 Pytorch 卷积层API
四、池化层
4.1 池化计算
4.2 Stride
4.3 Padding
4.4 多通道池化计算
4.5 Pytorch 池化层API
一、CNN概述
卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域,往往输入图像都很大,若使用全连接网络,计算代价较高。图像也很难保留原有的特征,导致图像处理的准确率不高
卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络。卷积层的作用就是用来自动学习、提取图像的特征
CNN网络主要有三部分构成:卷积层、池化层和全连接层构成,其中卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层用来输出想要的结果
二、图像基础知识
图像是由像素点组成的,每个像素点的值范围为[0, 255],像素值越大意味着较亮。一张 200x200 的图像,则是由 40000 个像素点组成,若每个像素点都是 0,意味着这是一张全黑的图像
彩色图一般都是多通道的图像,所谓多通道可以理解为图像由多个不同的图像层叠加而成。平常的彩色图像一般都是由 RGB 三个通道组成的,还有一些图像具有 RGBA 四个通道,最后一个通道为透明通道,该值越小,则图像越透明
import numpy as np
import matplotlib.pyplot as pltdef test01():# 构建200 * 200, 像素值全为0的图像image = np.zeros([200, 200])plt.imshow(image, cmap='gray', vmin=0, vmax=255)plt.show()# 构建200 * 200, 像素值全为255的图像image = np.full([200, 200], 255)plt.imshow(image, cmap='gray', vmin=0, vmax=255)plt.show()def test02():image = plt.imread('data/彩色图片.png')print(image.shape)# (640, 640, 4) 图像为 RGBA 四通道# 修改数据的维度, 将通道维度放在第一位image = np.transpose(image, [2, 0, 1])# 打印所有通道for channel in image:print(channel)plt.imshow(channel)plt.show()# 修改透明度image[3] = 0.05image = np.transpose(image, [1, 2, 0])plt.imshow(image)plt.show()if __name__ == "__main__":test01()test02()
三、卷积层
3.1 卷积的计算
- input 表示输入的图像
- filter 表示卷积核, 也叫做滤波器
- input 经过 filter 的得到输出为最右侧的图像,即特征图
卷积运算本质上就是在滤波器和输入数据的局部区域间做点积
左上角的点计算方法:
按照上面的计算方法可以得到最终的特征图为:
3.2 Padding
通过上面的卷积计算过程,最终的特征图会比原始图像小很多,若想要保持经过卷积后的图像大小不变,可以在原图周围添加 padding 再进行卷积来实现
3.3 Stride
按照步长为1来移动卷积核,计算特征图如下所示:
若将 Stride 增大为2,也是可以提取特征图的,如下图所示:
3.4 多通道卷积计算
实际中的图像都是多个通道组成的
计算方法如下:
- 当输入有多个通道(Channel),如 RGB 三个通道,此时要求卷积核需要拥有相同的通道数
- 每个卷积核通道与对应的输入图像的各个通道进行卷积
- 将每个通道的卷积结果按位相加得到最终的特征图
3.5 多卷积核卷积计算
实际对图像进行特征提取时,需要使用多个卷积核进行特征提取。可以理解为从不同到的视角、不同的角度对图像特征进行提取
3.6 特征图大小计算
输出特征图的大小与以下参数息息相关:
- size:卷积核大小,一般会选择为奇数,如:1*1,3*3,5*5*
- Padding:零填充的方式
- Stride:步长
那计算方法如下图所示:
- 输入图像大小:W * W
- 卷积核大小: F * F
- Stride:S
- Padding:P
- 输出图像大小:N x N
样例
- 图像大小:5 * 5
- 卷积核大小:3 * 3
- Stride:1
- Padding:1
- (5 - 3 + 2) / 1 + 1 = 5,即得到的特征图大小为:5 * 5
3.7 Pytorch 卷积层API
import torch
import torch.nn as nn
import matplotlib.pyplot as pltdef show(image):plt.imshow(image)plt.axis('off')plt.show()# 单个多通道卷积核
def test01():# 读取图片, 形状(640, 640, 4) HWCimage = plt.imread('data/彩色图片.png')show(image)# 构建卷积层conv = nn.Conv2d(in_channels=4, out_channels=1, kernel_size=3, stride=1, padding=1)# 卷积层对输入数据的形状有要求,(batch_size, channel, height, weight)image = torch.tensor(image).permute(2, 0, 1)image = image.unsqueeze(0)print(image.shape)# 输入output_image = conv(image)print(output_image.shape)# 调整形状为正常图像形状output_image = output_image.squeeze(0).permute(1, 2, 0)show(output_image.detach().numpy())# 多个多通道卷积核
def test02():# 读取图片, 形状(640, 640, 4) HWCimage = plt.imread('data/彩色图片.png')show(image)# 构建卷积层# 由于out_channels为3, 相当于有3个4通道卷积核conv = nn.Conv2d(in_channels=4, out_channels=3, kernel_size=3, stride=1, padding=1)# 卷积层对输入数据的形状有要求,(batch_size, channel, height, weight)image = torch.tensor(image).permute(2, 0, 1)image = image.unsqueeze(0)# 输入output_image = conv(image)print(output_image.shape)# 调整形状为正常图像形状output_image = output_image.squeeze(0).permute(1, 2, 0)print(output_image.shape)# 打印三个特征图# 每组卷积核的参数不同, 在与输入图像进行卷积运算时会提取出不同的特征信息show(output_image[:, :, 0].unsqueeze(2).detach().numpy())show(output_image[:, :, 1].unsqueeze(2).detach().numpy())show(output_image[:, :, 2].unsqueeze(2).detach().numpy())if __name__ == "__main__":test01()test02()
四、池化层
池化层 (Pooling) 降低维度,缩减模型大小,提高计算速度。主要对卷积层学习到的特征图进行下采样(SubSampling)处理
池化层主要有两种:最大池化、平均池化
4.1 池化计算
最大池化:
- max(0,1,3,4)
- max(1,2,4,5)
- max(3,4,6,7)
- max(4,5,7,8)
平均池化:
- mean(0,1,3,4)
- mean(1,2,4,5)
- mean(3,4,6,7)
- mean(4,5,7,8)
4.2 Stride
最大池化:
- max(0,1,4,5)
- max(2,3,6,7)
- max(8,9,12,13)
- max(10,11,14,15)
平均池化:
- mean(0,1,4,5)
- mean(2,3,6,7)
- mean(8,9,12,13)
- mean(10,11,14,15)
4.3 Padding
最大池化:
- max(0,0,0,0)
- max(0,0,0,1)
- max(0,0,1,2)
- max(0,0,2,0)
- ... 以此类推
平均池化:
- mean(0,0,0,0)
- mean(0,0,0,1)
- mean(0,0,1,2)
- mean(0,0,2,0)
- ... 以此类推
4.4 多通道池化计算
在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各个通道的输入相加。这意味着池化层的输出和输入的通道数是相等
即:卷积会改变通道数,池化不会改变通道数
4.5 Pytorch 池化层API
import torch
import torch.nn as nn# 基本使用
def test01():inputs = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]).float()inputs = inputs.unsqueeze(0).unsqueeze(0)# (1,1,3,3)print(inputs.shape)# 最大池化, 输入形状(batch_size, channel, height, weight)polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)output = polling(inputs)print(output)# 平均池化polling = nn.AvgPool2d(kernel_size=2, stride=1, padding=0)output = polling(inputs)print(output)# stride
def test02():inputs = torch.tensor([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]).float()inputs = inputs.unsqueeze(0).unsqueeze(0)# 最大池化, 输入形状(batch_size, channel, height, weight)polling = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)output = polling(inputs)print(output)# 平均池化polling = nn.AvgPool2d(kernel_size=2, stride=2, padding=0)output = polling(inputs)print(output)# padding
def test03():inputs = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]).float()inputs = inputs.unsqueeze(0).unsqueeze(0)# 最大池化, 输入形状(batch_size, channel, height, weight)polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=1)output = polling(inputs)print(output)# 平均池化polling = nn.AvgPool2d(kernel_size=2, stride=1, padding=1)output = polling(inputs)print(output)# 多通道池化
def test04():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()inputs.unsqueeze(0)# 最大池化, 输入形状(batch_size, channel, height, weight)polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)output = polling(inputs)print(output)# 平均池化polling = nn.AvgPool2d(kernel_size=2, stride=1, padding=0)output = polling(inputs)print(output)if __name__ == "__main__":# test01()# test02()# test03()test04()
相关文章:

卷积神经网络CNN
目录 一、CNN概述 二、图像基础知识 三、卷积层 3.1 卷积的计算 3.2 Padding 3.3 Stride 3.4 多通道卷积计算 3.5 多卷积核卷积计算 3.6 特征图大小计算 3.7 Pytorch 卷积层API 四、池化层 4.1 池化计算 4.2 Stride 4.3 Padding 4.4 多通道池化计算 4.5 Pytorc…...
Android:播放Rtsp视频流的两种方式
一.SurfaceView Mediaplayer XML中添加SurfaceView: <SurfaceViewandroid:id"id/surface_view"android:layout_width"match_parent"android:layout_height"match_parent"/> Activity代码: package com.android.rtsp;impor…...

web信息泄露 ctfshow-web入门web1-web10
01做题思路 判断做题的思路是读取,写入,还是执行判断大概的类型,有登录逻辑就尝试sql注入,有下载逻辑就尝试文件读取,有源码就做源码审计 02信息泄露及利用 robots.txt 以ctfshow的web1为例,访问robots…...
Log4j在Spring项目中的应用与实践
在现代Java开发中,日志记录是不可或缺的一部分。它不仅帮助开发者调试和监控应用程序的运行状态,还能在出现问题时快速定位原因。今天,我们就来探讨如何在Spring项目中使用Log4j进行日志管理,并通过具体的实例来展示其强大的功能。…...
docker安装mysql:8.0
1.docker源 目前docker国内的源基本上用不了了,建议去淘宝找一找,我整了一个大概是10R一个月。 2.拉取镜像 docker pull mysql:8.0 3.启动容器 命令如下: docker run \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 \-v /home/data/mysq…...

搭建一个 Spring Boot 项目,解决jdk与springboot版本不匹配
搭建一个 Spring Boot 项目 方式一:使用 Spring Initializr Spring Initializr 是一个基于 Web 的工具,用于快速生成 Spring Boot 项目的基础结构。 访问 Spring Initializr 网站:https://start.spring.io/配置项目信息: …...

心心相系:十颗心
心心相系:十颗心 【1】心脏;人心,热心 heart //注:h-通c-或k- warmhearted a.热心的,热心肠的;亲切的a warm-hearted person 为人古道热肠 词根cardi(o)-(heart),例词:cardiology(…...

ChatGPT行业热门应用提示词案例-AI绘画类
AI 绘画指令是一段用于指导 AI 绘画工具(如 DALLE、Midjourney 等)生成特定图像的文本描述。它通常包含场景、主体、风格、色彩、氛围等关键信息,帮助 AI 理解创作者的意图,从而生成符合要求的绘画作品。 ChatGPT 拥有海量的知识…...

前端面试手写--虚拟列表
目录 一.问题背景 二.代码讲解 三.代码改装 四.代码发布 今天我们来学习如何手写一个虚拟列表,本文将把虚拟列表进行拆分并讲解,然后发布到npm网站上. 一.问题背景 为什么需要虚拟列表呢?这是因为在面对大量数据的时候,我们的浏览器会将所有数据都渲染到表格上面,但是渲…...
达梦数据库针对慢SQL,收集统计信息清除执行计划缓存
前言:若遇到以下场景,大概率是SQL走错了执行计划: 1、一条SQL在页面上查询特别慢,但拿到数据库终端执行特别快 2、一条SQL在某种检索条件下查询特别慢,但拿到数据库终端执行特别快 此时,可以尝试按照下述步…...

李沐--动手学深度学习 序列模型
1.使用正弦函数和可加性噪声生成序列数据 import torch from torch import nn from d2l import torch as d2l#使用正弦函数和可加性噪声生成序列数据 T 1000 #总共产生1000个点 time torch.arange(1,T1,dtypetorch.float32) x torch.sin(0.01*time) torch.normal(0,0.2,(…...

数据分析、商业智能、业务分析三者之间的关系
商业智能 (Business Intelligence, BI)、业务分析 (Business Analytics, BA) 和数据分析 (Data Analytics, DA) 三者都与数据密切相关,但在目标、方法和应用上存在差异。为了能够清晰地解释,下面将从定义入手,然后阐述它们之间的联系和区别。…...

【Spring+MyBatis】留言墙的实现
目录 1. 添加依赖 2. 配置数据库 2.1 创建数据库与数据表 2.2 创建与数据库对应的实体类 3. 后端代码 3.1 目录结构 3.2 MessageController类 3.3 MessageService类 3.4 MessageMapper接口 4. 前端代码 5. 单元测试 5.1 后端接口测试 5.2 使用前端页面测试 在Spri…...

让编程变成一种享受-明基RD320U显示器
引言 作为一名有着多年JAVA开发经验的从业者,在工作过程中,显示器的重要性不言而喻。它不仅是我们与代码交互的窗口,更是影响工作效率和体验的关键因素。在多年的编程生涯中,我遇到过各种各样的问题。比如,在进行代码…...
【嵌入式Linux应用开发基础】fork()函数
目录 一、fork 函数概述 1.1. 函数作用 1.2. 函数原型与头文件 1.3. 返回值 1.4. 核心特性 二、父子进程的区别与联系 2.1. 相同点 2.2. 不同点 三、典型应用场景 3.1. 多任务处理 3.2. 守护进程创建 3.3. 执行外部程序 3.4. 并行计算 四、fork 函数的关键注意事…...

2024 年 CSDN 博客之星年度评选:技术创作与影响力的碰撞(统计时间2025-02-17 11:06:06)
摘要:在技术的海洋里,每一位博主都像是一座独特的灯塔,用自己创作的光芒照亮他人前行的道路。2024 年 CSDN 博客之星年度评选活动,正是对这些灯塔的一次盛大检阅,让我们看到了众多优秀博主在技术创作领域的卓越表现以及…...
串的基本操作--数据结构
目录 一、串的基本概述 二、串的存储结构 2.1定义属性存储结构 串长有两种表示方法: 1、用一个额外的变量length来存放串的长度; 2、串值后面加一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。 2.2堆的顺序存储结构 三、串的基本操…...

Unity 命令行设置运行在指定的显卡上
设置运行在指定的显卡上 -force-device-index...

Dest1ny漏洞库: 美团代付微信小程序系统任意文件读取漏洞
大家好,今天是Dest1ny漏洞库的专题!! 会时不时发送新的漏洞资讯!! 大家多多关注,多多点赞!!! 0x01 产品简介 美团代付微信小程序系统是美团点评旗下的一款基于微信小程…...
设计模式:状态模式
状态机有3个要素:状态,事件,动作。 假如一个对象有3个状态:S1、S2、S3。影响状态的事件有3个:E1、E2、E3。每个状态下收到对应事件的时候,对象的动作为AXY。那么该对象的状态机就可以用如下表格来表示。S1收到事件E1的…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...