如何优化卷积算法

我们可以写一个卷积算法。

for (int oh = 0; oh < OH; oh++) {for (int ow = 0; ow < OW; ow++) {for (int oc = 0; oc < OC; oc++) {C[oh][ow][oc] = 0;for (int kh = 0; kh < KH, kh++){for (int kw = 0; kw < KW, kw++){for (int ic = 0; ic < IC, ic++){C[oh][ow][oc] += A[oh+kh][ow+kw][ic] * B[kh][kw][ic];}}}}}
}

这种很显然是一个典型的卷积算法。

首先,最经典的算法是im2col算法。

计算完成后,会变成左图所示计算:

这个计算的逻辑,大家可以看这一篇文章来进行理解。

但是对于输出而言,这并不是一个好的排布,因为内存访问局部差。为啥?因为你先把内存整成这个样子。其实你访问行,效果当然会好很多。

对于kernel而言,当然是有利的,因为一次加载一行。起码这一行都是可以用到的。

对于feature_map来说,这样算,就不是很OK了叭。每一次都要去内存取数据。

所以,NCHW,对内存不是很友好。【其实我并没有感觉到有多不友好】

然后,使用NHWC的时候。

那我们继续向我们的计算方式。从NCHW结构,转为NHWC结构。

那么,注意看,这里是input * filter了。

可以参考下图的一个变换:

HWC,不管C是怎么样的,那么filter,理论上是K*K*C。对于某一个点,是不是要进行乘法。

那么把结构平铺一下,就是:H*W*C 到 K*K*C

如果结构是:

CHW,那最后输出的结果是:OC,H,W的排布。

那么变成二维,就是OC*HW,为了算一个点的OC,我们需要对一个点,和所有相关的filter过一遍。也就是说:大概是把kernel进行复制,从一个点,复制到[oc * HW]  

那么filter的排布就是: oc ic H W

同理, feature map的排布是:ic,H,W

这个时候要算,就要oc摘出来,变成oc *H W = oc * icHW dot icHW,

那么为了性能优化, 我们可以对feature map进行倍化,先把kernel需要的数量给凑够了。

比如feature map 变成oc H W IC  K K ,这样的话,kernel就是: ic k k  oc, 这样起码改了kernel的排布。

这样的话,计算结果,最后只要把K*K给加起来就好了。

这个过程很复杂,可能得一会儿想。

然后,oc h w这种排布,因为输出是这样排布的。oc,H,w,

但如果是h w co这样排布呢?

那就是HW-OC = HW-oc-kwkhic  dot HW-oc 

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

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

相关文章

QT写Windows按键输出(外挂)

一、前言 玩游戏的时候遇到些枯燥无味反反复复的按鼠标键盘的情况时&#xff0c;就想写个外挂自动释放。刚好在学qt所以试验了下QT能不能对外输出按键与鼠标。 二、思路 qt中的按键鼠标全是输入&#xff0c;没有直接对外输出键盘鼠标指令的类&#xff0c;但是我们换个思路&…

Java JDK 22全新发布 - 猫头虎博主带你一起深入了解JDK22!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

C++设计模式:门面模式(十二)

1、概念与定义 “接口隔离”模式&#xff1a;在组建构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接&#xff08;稳定&#xff09;接口&#xff0c;来隔离本来相互紧密关联的接口是一种常见的解决方案。 门面设计模式定…

SpringCloud、SpringBoot、JDK版本对应关系

SpringCloud与SpringBoot 版本 官网说明&#xff1a;https://spring.io/projects/spring-cloud#overview SpringBoot 与 JDK版本关系 发布说明&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes SpringBoot 3.x不再支持JDK1.…

低空经济再火,通过了解飞行汽车产业链与核心技术,我发现了汽车行业从业者新的机会!

低空经济最近又一次成为资本市场热议的话题&#xff0c;同时在两会报告中大篇幅的写入低空经济&#xff0c;并将其定义成为“新质生产力的代表”&#xff0c;低空经济是什么&#xff1f;与我们此前所聊过的飞行汽车之间又有什么样子的联系&#xff1f;我们作为汽车行业的从业者…

Unity笔记之Android打包、减小包体之类的问题

打包问题 问题1&#xff1a; 一般大部分问题就是JDK、SDK、NDK之类的问题。现在是其他的问题&#xff0c;之前遇到过&#xff0c;好久没玩android了都忘了。 这试了半天&#xff0c;结果是需要有密钥库。那就给他创建一个填一下就行了 &#xff08;在网上看了半天&#xff…

Android 加密之 打包为arr 项目依赖或者为jar

Android 加密之 打包为arr 项目依赖或者为jar 1. 修改build.gradle plugins {//id com.android.application// 1. 修改为libraryid com.android.library }android {namespace com.dzq.iccid2compileSdk 33defaultConfig {//applicationId "com.dzq.iccid2"// 2. 注…

【数据结构】05树

树 树1.2 结点的分类1.3 结点间的关系1.4 树的其他概念1.5 树的性质 2. 二叉树2.1 满二叉树2.2 完全二叉树2.3 二叉排序树&#xff08;二叉查找树&#xff09; 3. 二叉树的存储结构3.1 二叉树顺序存储结构3.2 二叉树的链式存储结构 4. 二叉树的遍历4.1 层次遍历4.1 前序遍历4.2…

如何申请阿里云服务器学生优惠,入口在这呢!

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

【C++】每日一题 14 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 #include <iostream> #include <vector> #include <string>using namespace std;string longestCommonPrefix(vector<string>& strs) {if (…

Elasticsearch初步了解学习记录

目录 前言 一、ElasticSearch是什么&#xff1f; 二、使用步骤&#xff08;python版&#xff09; 1.引入包 2.连接数据库 3.创建索引 4.写入数据 5.查询数据 三、相关工具介绍 1.ES浏览器插件 总结 前言 随着数据量的不断增加&#xff0c;传统的查询检索在速度上遇…

IO——文件IO

1.1 概念 又称为系统IO&#xff0c;是系统调用&#xff0c;是操作系统提供的函数接口。 posix中定义的一组用于输入输出的函数。 1.2 特点 (1)没有缓冲机制&#xff0c;效率较低 (2)围绕文件标识符操作&#xff0c;非负整数&#xff0c;依次分配 (3) 文件IO默认打开了三个文…

正则表达式:量词(三)

正则表达式中的量词有以下几种:1. *: 匹配前面的字符0次或多次。2. : 匹配前面的字符1次或多次。3.?: 匹配前面的字符0次或1次。4. {n}: 匹配前面的字符恰好n次。5. {n,}: 匹配前面的字符至少n次。6. {n,m}:匹配前面的字符至少n次&#xff0c;但不超过m次。 以下是使用Python的…

计算机网络 子网掩码与划分子网

一、实验要求与内容 1、需拓扑图和两个主机的IP配置截图。 2、设置网络A内的主机IP地址为“192.168.班内学号.2”&#xff0c;子网掩码为“255.255.255.128”&#xff0c;网关为“192.168.班内学号.1”&#xff1b;设置网络B内的主机IP地址为“192.168.班内学号100.2”&#…

@AutoConfigurationPackage 和 @ComponentScan 有何区别?

首先&#xff0c;从名字上看&#xff0c;这两个注解意义特别接近&#xff0c;AutoConfigurationPackage 就是自动配置包&#xff0c;自动配置包的目的是能让系统扫描到包内的 Bean&#xff1b;ComponentScan 则是组件扫描&#xff0c;这个松哥在之前的教程中也多次提到过了&…

VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue

1. 打开: Outlook VBA&#xff08;Visual Basic for Applications&#xff09; 方法一: 在邮件直接搜索:Visual Basic editor 方法二: File -> Options -> Customize Ribbon-> 打钩 如下图: 2.设置运行VBA 脚本: File -> Options -> Trust center -> Trus…

R绘图保存eps,并且图例要求使用Times New Roman字体

目录 前言 方法&#xff1a; 一些失败的尝试&#xff1a; 前言 R绘图保存eps&#xff0c;并且图例要求使用Times New Roman字体&#xff1f;这个问题可以分解成以下两个小的问题&#xff1a; 如何实现使用R将绘制的图保存为eps格式&#xff1f;如何将R绘制的图中的图例使用…

Day37|贪心算法part06:738.单调递增的数字、968. 监控二叉树、贪心总结

738. 单调递增的数字 总体思想就是从后往前遍历&#xff0c;比较第i位和第i1位的大小&#xff0c;不符合顺序char[i]减1&#xff0c;i1位填9&#xff0c;找到需要填9的最先位置&#xff0c;然后填9。 class Solution {public int monotoneIncreasingDigits(int n) {String s …

kafka_2.11-2.4.1单机安装

kafka_2.11-2.4.1单机安装 下载 官网地址: http://kafka.apache.org/downloads.html # 2.11是scala的版本&#xff0c;2.4.1是kafka的版本 wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.11‐2.4.1.tgz 创建kafka相关目录 mkdir -p /usr/local/kafka/kafka_2.…