当前位置: 首页 > news >正文

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

flyfish

在卷积神经网络(CNN)中,可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野。具体来说:

  • 两个3x3的卷积核堆叠可以替代一个5x5的卷积核。这样,每个输出单元都能够感受到一个5x5区域的输入信息。

  • 三个3x3的卷积核堆叠可以替代一个7x7的卷积核。这意味着,通过三层3x3卷积,最终的输出单元可以感受到一个7x7区域的输入信息。

  • 四个3x3的卷积核堆叠可以替代一个9x9的卷积核。通过四层3x3卷积,输出单元能够覆盖一个9x9区域的输入信息。

在这里插入图片描述
在这里插入图片描述

import numpy as np# 输入特征图
input_feature_map = np.array([[1, 2, 3, 0, 1],[4, 5, 6, 1, 2],[7, 8, 9, 2, 3],[1, 2, 3, 0, 1],[4, 5, 6, 1, 2]
])# 卷积核
kernel = np.array([[1, 0, -1],[1, 0, -1],[1, 0, -1]
])# 输出特征图的大小
output_height = input_feature_map.shape[0] - kernel.shape[0] + 1
output_width = input_feature_map.shape[1] - kernel.shape[1] + 1
output_feature_map = np.zeros((output_height, output_width))# 计算总计算量
total_computations = 0# 进行卷积操作
for i in range(output_height):for j in range(output_width):# 提取当前窗口的子矩阵current_window = input_feature_map[i:i+kernel.shape[0], j:j+kernel.shape[1]]# 进行逐元素乘法并求和output_feature_map[i, j] = np.sum(current_window * kernel)# 计算当前窗口的计算量total_computations += np.prod(kernel.shape)  # 3x3 次乘法print("输出特征图:")
print(output_feature_map)
print("总计算量 (乘法次数):", total_computations)

在进行卷积操作时,对于输入特征图大小 5 × 5 5 \times 5 5×5 和卷积核大小 3 × 3 3 \times 3 3×3,输出特征图的大小是 ( 5 − 3 + 1 ) × ( 5 − 3 + 1 ) = 3 × 3 (5 - 3 + 1) \times (5 - 3 + 1) = 3 \times 3 (53+1)×(53+1)=3×3。在每个输出位置,我们需要进行 3 × 3 = 9 3 \times 3 = 9 3×3=9 次乘法计算,总的计算量是 3 × 3 × 9 = 81 3 \times 3 \times 9 = 81 3×3×9=81 次乘法。

1 2 3 0 1       1 2 3      2 3 0      3 0 1
4 5 6 1 2       4 5 6      5 6 1      6 1 2
7 8 9 2 3       7 8 9      8 9 2      9 2 34 5 6 1 2       4 5 6      5 6 1      6 1 2
7 8 9 2 3       7 8 9      8 9 2      9 2 3
1 2 3 0 1       1 2 3      2 3 0      3 0 17 8 9 2 3       7 8 9      8 9 2      9 2 3
1 2 3 0 1       1 2 3      2 3 0      3 0 1
4 5 6 1 2       4 5 6      5 6 1      6 1 2

计算卷积操作的计算量

在计算卷积操作的总计算量时,可以使用以下公式:
总计算量 (乘法次数) = ( H − K + 1 ) × ( W − K + 1 ) × K × K × C i n × C o u t \text{总计算量 (乘法次数)} = (H - K + 1) \times (W - K + 1) \times K \times K \times C_{in} \times C_{out} 总计算量 (乘法次数)=(HK+1)×(WK+1)×K×K×Cin×Cout
其中:

  • H H H W W W 是输入特征图的高度和宽度。

  • K K K 是卷积核的大小(假设为方形,即 K × K K \times K K×K)。

  • C i n C_{in} Cin 是输入通道数。

  • C o u t C_{out} Cout 是输出通道数。

应用公式计算示例

对于一个 5x5 的输入特征图和 3x3 的卷积核,假设输入通道数和输出通道数都为 1:

  1. 输入特征图大小: H = 5 H = 5 H=5, W = 5 W = 5 W=5

  2. 卷积核大小: K = 3 K = 3 K=3

  3. 输入通道数: C i n = 1 C_{in} = 1 Cin=1

  4. 输出通道数: C o u t = 1 C_{out} = 1 Cout=1

将这些值代入公式中:
总计算量 (乘法次数) = ( 5 − 3 + 1 ) × ( 5 − 3 + 1 ) × 3 × 3 × 1 × 1 \text{总计算量 (乘法次数)} = (5 - 3 + 1) \times (5 - 3 + 1) \times 3 \times 3 \times 1 \times 1 总计算量 (乘法次数)=(53+1)×(53+1)×3×3×1×1

计算:
总计算量 (乘法次数) = 3 × 3 × 3 × 3 = 81 \text{总计算量 (乘法次数)} = 3 \times 3 \times 3 \times 3 = 81 总计算量 (乘法次数)=3×3×3×3=81

( H − K + 1 ) × ( W − K + 1 ) (H - K + 1) \times (W - K + 1) (HK+1)×(WK+1) 计算的是输出特征图的大小,这里是 3 × 3 3 \times 3 3×3
每个输出特征图的位置上,进行 K × K × C i n K \times K \times C_{in} K×K×Cin 次乘法计算,这里是 3 × 3 × 1 = 9 3 \times 3 \times 1 = 9 3×3×1=9 次乘法。
计算量是输出特征图的元素数量乘以每个元素的计算量,即 9 × 9 = 81 9 \times 9 = 81 9×9=81 次乘法。

例子

如果输入特征图是 28 × 28 28 \times 28 28×28,计算两个 3x3 卷积核堆叠和一个 5x5 卷积核的计算量,并比较它们。

情况 1:两个 3x3 卷积核堆叠

  1. 第一个 3x3 卷积核
  • 输入特征图大小: 28 × 28 28 \times 28 28×28

  • 输出特征图大小: ( 28 − 3 + 1 ) × ( 28 − 3 + 1 ) = 26 × 26 (28 - 3 + 1) \times (28 - 3 + 1) = 26 \times 26 (283+1)×(283+1)=26×26

  • 计算量: 26 × 26 × 3 × 3 × C i n × C m i d 26 \times 26 \times 3 \times 3 \times C_{in} \times C_{mid} 26×26×3×3×Cin×Cmid

  1. 第二个 3x3 卷积核
  • 输入特征图大小: 26 × 26 26 \times 26 26×26

  • 输出特征图大小: ( 26 − 3 + 1 ) × ( 26 − 3 + 1 ) = 24 × 24 (26 - 3 + 1) \times (26 - 3 + 1) = 24 \times 24 (263+1)×(263+1)=24×24

  • 计算量: 24 × 24 × 3 × 3 × C m i d × C o u t 24 \times 24 \times 3 \times 3 \times C_{mid} \times C_{out} 24×24×3×3×Cmid×Cout
    计算量 3 × 3 = 26 × 26 × 9 × C i n × C m i d + 24 × 24 × 9 × C m i d × C o u t \text{计算量}_{3\times3} = 26 \times 26 \times 9 \times C_{in} \times C_{mid} + 24 \times 24 \times 9 \times C_{mid} \times C_{out} 计算量3×3=26×26×9×Cin×Cmid+24×24×9×Cmid×Cout

情况 2:一个 5x5 卷积核

  • 输入特征图大小: 28 × 28 28 \times 28 28×28

  • 输出特征图大小: ( 28 − 5 + 1 ) × ( 28 − 5 + 1 ) = 24 × 24 (28 - 5 + 1) \times (28 - 5 + 1) = 24 \times 24 (285+1)×(285+1)=24×24

  • 计算量: 24 × 24 × 5 × 5 × C i n × C o u t 24 \times 24 \times 5 \times 5 \times C_{in} \times C_{out} 24×24×5×5×Cin×Cout

示例计算

假设输入和输出通道数都为 1:

  1. 第一个 3x3 卷积核
  • 输出特征图大小: 26 × 26 26 \times 26 26×26

  • 计算量: 26 × 26 × 9 × 1 × 1 = 6084 26 \times 26 \times 9 \times 1 \times 1 = 6084 26×26×9×1×1=6084

  1. 第二个 3x3 卷积核
  • 输出特征图大小: 24 × 24 24 \times 24 24×24

  • 计算量: 24 × 24 × 9 × 1 × 1 = 5184 24 \times 24 \times 9 \times 1 \times 1 = 5184 24×24×9×1×1=5184
    总计算量:
    计算量 3 x 3 = 6084 + 5184 = 11268 \text{计算量}_{3x3} = 6084 + 5184 = 11268 计算量3x3=6084+5184=11268

  1. 一个 5x5 卷积核
  • 输出特征图大小: 24 × 24 24 \times 24 24×24

  • 计算量: 24 × 24 × 25 × 1 × 1 = 14400 24 \times 24 \times 25 \times 1 \times 1 = 14400 24×24×25×1×1=14400

def compute_3x3_stack_computation(H, W, C_in, C_out):# 第一个 3x3 卷积核output_height1 = H - 3 + 1output_width1 = W - 3 + 1computation_3x3_1 = output_height1 * output_width1 * 3 * 3 * C_in * C_out# 第二个 3x3 卷积核output_height2 = output_height1 - 3 + 1output_width2 = output_width1 - 3 + 1computation_3x3_2 = output_height2 * output_width2 * 3 * 3 * C_out * C_outtotal_computation_3x3 = computation_3x3_1 + computation_3x3_2return total_computation_3x3def compute_5x5_computation(H, W, C_in, C_out):# 一个 5x5 卷积核output_height = H - 5 + 1output_width = W - 5 + 1computation_5x5 = output_height * output_width * 5 * 5 * C_in * C_outreturn computation_5x5# 示例参数
H, W, C_in, C_out = 28, 28, 1, 1# 计算
computation_3x3 = compute_3x3_stack_computation(H, W, C_in, C_out)
computation_5x5 = compute_5x5_computation(H, W, C_in, C_out)# 减少的计算量百分比
reduction_percentage = (1 - computation_3x3 / computation_5x5) * 100print("两个 3x3 卷积核堆叠的计算量:", computation_3x3)
print("一个 5x5 卷积核的计算量:", computation_5x5)
print("减少的计算量百分比:", reduction_percentage)

两个 3x3 卷积核堆叠的计算量: 11268
一个 5x5 卷积核的计算量: 14400
减少的计算量百分比: 21.750000000000004
参考论文《Rethinking the Inception Architecture for Computer Vision》

相关文章:

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野 flyfish 在卷积神经网络(CNN)中,可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的…...

【学习笔记】Mybatis-Plus(四):MP中内置的插件

内置插件 目前MP已经存在的内部插件包括如下: 插件类名作用PaginationInnerInterceptor分页插件。可以代替以前的PageHelperOptimisticLockerInnerInterceptor乐观锁插件。用于幂等性操作,采用版本更新记录DynamicTableNameInnerInterceptor动态表名Te…...

GlusterFS分布式存储系统

GlusterFS分布式存储系统 一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储…...

微信公众平台测试账号本地微信功能测试说明

使用场景 在本地测试微信登录功能时,因为微信需要可以互联网访问的域名接口,所以本地使用花生壳做内网穿透,将前端服务的端口和后端服务端口进行绑定,获得花生壳提供的两个外网域名。 微信测试账号入口 绑定回调接口 回调接口的…...

Lua语言入门

目录 Lua语言1 搭建Lua开发环境1.1 安装Lua解释器WindowsLinux 1.2 IntelliJ安装Lua插件在线安装本地安装 2 Lua语法2.1 数据类型2.2 变量全局变量局部变量命名规范局部变量作用域 2.3 注释单行注释多行注释 2.4 赋值2.5 操作符数学操作符比较操作符逻辑操作符连接操作符取长度…...

卷积神经网络有哪些应用场景

卷积神经网络(Convolutional Neural Networks,简称CNN)的应用场景非常广泛,尤其是在处理具有网格结构的数据(如图像、视频)时表现出色。以下是一些主要的应用场景: 1. 图像识别与分类 图像分类…...

std::unordered_map和std::map在性能上有何不同

std::unordered_map和std::map在性能上的不同主要体现在以下几个方面: 1. 底层数据结构 std::unordered_map:基于哈希表实现,通过哈希函数计算元素的存储位置。哈希表能够直接通过哈希值快速定位到元素的位置,从而实现高效的查找…...

C++20中的基于范围的for循环(range-based for loop)

C11中引入了对基于范围的for循环(range-based for loop)的支持&#xff1a;该循环对一系列值(例如容器中的所有元素)进行操作。代码段如下&#xff1a; const std::vector<int> vec{ 1,2,3,4,5 }; for (const auto& i : vec)std::cout << i << ", …...

PCIe驱动开发(2)— 第一个简单驱动编写和测试

PCIe驱动开发&#xff08;2&#xff09;— 第一个简单驱动编写和测试 一、前言 教程参考&#xff1a;02_实战部分_PCIE设备测试 教程参考&#xff1a;03_PCIe设备驱动源码解析 二、驱动编写 新建hello_pcie.c文件 touch hello_pcie.c然后编写内容如下所示&#xff1a; #i…...

k8s-第七节-ConfigMap Secret

ConfigMap & Secret ConfigMap 数据库连接地址&#xff0c;这种可能根据部署环境变化的或者其他容器配置选项的包括容器更新或者扩容时可以统一配置 Kubernetes 为我们提供了 ConfigMap&#xff0c;可以方便的配置一些变量。 https://kubernetes.io/zh/docs/concepts/c…...

MySQL架构和工作流程

引言&#xff1a;MySQL执行一条sql语句期间发生了什么&#xff1f; 想要搞清楚这个问题&#xff0c;我们必须了解MySQL的体系结构和工作流程 一、MySQL体系结构 MySQL由以下几个部分组成 一、server层 1.MySQL Connnectors连接器&#xff0c;MySQL的连接池组件&#xff0c;…...

java项目总结8

1.方法引用 1.方法引用概述 注意注意&#xff1a; 1.引用出必须是函数式接口 2.被引用的方法必须已经存在 3.被引用方法的型参和返回值需要跟抽象方法保持一致 4.被引方法的功能要满足当前需求 Arrays.sort(arr,Main::subtraction); Main是该类的名称&#xff0c;&#xff1a…...

【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准

锂电池单元的质量在多个生产制造领域都至关重要&#xff0c;特别是在新能源汽车、高端消费电子等行业。这些领域的产品高度依赖锂电池提供持续、稳定的能量供应。优质的锂电池单元不仅能提升产品的性能和用户体验&#xff0c;还能确保使用安全。因此&#xff0c;保证锂电池单元…...

Spring Cloud Alibaba - Sentinel 分布式系统流量哨兵

目录 概述特征基本概念 安装Sentinel微服务引入Sentinel案例流控规则&#xff08;流量控制&#xff09;流控模式-直接流控模式-关联流控模式-链路流控效果-快速失败流控效果-预热WarmUp流控效果-排队等候 流控规则&#xff08;并发线程数控制&#xff09;熔断规则&#xff08;熔…...

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容&#xff0c;本章回中将介绍如何实现文件存储.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…...

数据结构/作业/2024/7/7

搭建个场景: 将学生的信息&#xff0c;以顺序表的方式存储&#xff08;堆区)&#xff0c;并且实现封装函数︰1】顺序表的创建&#xff0c; 2】判满、 3】判空、 4】往顺序表里增加学生、5】遍历、 6】任意位置插入学生、7】任意位置删除学生、8】修改、 9】查找(按学生的学号查…...

隔离级别-隔离级别中的锁协议、隔离级别类型、隔离级别的设置、隔离级别应用

一、引言 1、DBMS除了采用严格的两阶段封锁协议来保证并发事务的可串行化&#xff0c;实现事务的隔离性&#xff0c;也可允许用户选择一个可以保证应用程序正确执行并且能够使并发度最大的隔离性等级 2、通常用隔离级别来描述隔离性等级&#xff0c;以下将主要介绍ANSI 92标准…...

【数据结构与算法】希尔排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​...

【机器学习】(基础篇一) —— 什么是机器学习

什么是机器学习 本系列博客为你从机器学习的介绍开始&#xff0c;使用大量的代码实战和验证&#xff0c;最终帮助你完全掌握什么是机器学习 人工智能、机器学习和深度学习的关系 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1a;是一门研…...

VitePress安装部署

VitePress安装部署 VitePress安装步骤 安装 Node环境 官网下载&#xff1a;https://nodejs.org/zh-cn 傻瓜式安装到完成 npm环境 安装完Node环境之后&#xff0c;可以直接运行下面的命令安装npm npm install -g pnpm关于pnpm源&#xff1a; 有时候需要国内源&#xff0c…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...

深度解析云存储:概念、架构与应用实践

在数据爆炸式增长的时代&#xff0c;传统本地存储因容量限制、管理复杂等问题&#xff0c;已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性&#xff0c;成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理&#xff0c;云存储正重塑数据存储与…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...

【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练

本项目提出了ContentV框架&#xff0c;通过三项关键创新高效加速基于DiT的视频生成模型训练&#xff1a; 极简架构设计&#xff0c;最大化复用预训练图像生成模型进行视频合成系统化的多阶段训练策略&#xff0c;利用流匹配技术提升效率经济高效的人类反馈强化学习框架&#x…...