卷积神经网络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的…...
别再只刷协同过滤了!从零到一,用Python+Surprise库快速搭建你的第一个电影推荐系统
从零构建电影推荐系统:PythonSurprise实战指南 为什么我们需要自己动手搭建推荐系统? 每次打开视频平台,首页总能精准推送你感兴趣的影片;电商网站的商品推荐也常常让你忍不住点击"加入购物车"。这些看似神奇的推荐背后…...
AI文本人性化:从技术原理到本地部署的完整实践指南
1. 项目概述:当AI写作遇上“人性化”改造最近在GitHub上看到一个挺有意思的项目,叫“AI-Text-Humanizer”。光看名字,你大概就能猜到它是干什么的:把AI生成的文本,变得像人写的一样。这听起来可能有点“反AI”…...
Hide Mock Location完整指南:轻松绕过Android位置检测的终极方案
Hide Mock Location完整指南:轻松绕过Android位置检测的终极方案 【免费下载链接】HideMockLocation Xposed module to hide the mock location setting. 项目地址: https://gitcode.com/gh_mirrors/hi/HideMockLocation 在Android开发测试或日常使用中&…...
实战指南:基于快马平台开发一个全功能个人技能追踪应用
今天想和大家分享一个很实用的个人技能追踪应用的开发过程。这个项目可以帮助我们记录和管理自己的技能树,特别适合程序员、设计师等需要持续学习新技能的职业人群。下面我会详细介绍整个开发流程和关键实现点。 项目规划与功能设计 首先明确这个技能追踪应用需要…...
机器学习day01(机器学习概述 + KNN算法)
机器学习_算法分类有监督学习有监督 有特征 、有标签。有监督又被分为:分类问题 和 回归问题。分类问题目标值(标签值)是不连续的分类种类:二分类、多分类回归问题目标值(标签值)是连续的无监督学习训练数…...
MTMR-RL框架:多任务矢量图形生成的强化学习方案
1. 项目背景与核心挑战在数字内容创作领域,矢量图形(SVG)因其无限缩放不失真的特性,成为设计师和开发者的首选格式。然而传统SVG生成流程存在两大痛点:一是依赖专业设计工具(如Illustrator)和操…...
hyperf 架构人才与机制建设
“架构人才与机制建设”不是培养几个高手,而是把高手的判断力做成团队可复制的流程、标准和训练体系。在 Hyperf 场景,最佳做法是“人(梯队) 机制(评审) 资产(模板) 实战(…...
多模态生物基础模型技术架构
应用多模态生物基础模型于治疗与患者护理 | 人工智能 多模态生物基础模型 生物基础模型(BioFMs)是在大型生物数据集上预训练的人工智能模型。BioFMs 在特定的医疗和生命科学任务中展现出了先进能力。常用的 BioFMs 覆盖药物发现和临床开发领域࿰…...
3步轻松上手:DistroAV跨平台音视频传输全攻略
3步轻松上手:DistroAV跨平台音视频传输全攻略 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi DistroAV(原名OBS-NDI)是OBS Studio的ND…...
八周带你手搓AI应用-Day5-工程性能的分水岭:从“线性思维”转向“并发思维”
恭喜你!前四天你已经打通了 AI 应用的“逻辑链路”。今天(第 5 天),我们要进入工程性能的分水岭:从“线性思维”转向“并发思维”。 “理解高并发与非阻塞”是区分“写脚本的”和“做系统的”关键标志。第一站…...
