【darknet】源码阅读理解(六)——maxpool的前向传播/反向传播

2024-06-13 09:18

本文主要是介绍【darknet】源码阅读理解(六)——maxpool的前向传播/反向传播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

maxpool是用于数据特征降维,减少CNN网络的计算量,是CNN的基础组件之一。

1. 前向传播

前向传播就是在channel通道上,对一定size*size的正方形区域求出最大值,作为下一层layer的输入。
同时,为了反向误差的传播需要保存最大值所对应的索引index

Code

void forward_maxpool_layer(const maxpool_layer l, network net)
{int b,i,j,k,m,n;int w_offset = -l.pad/2;int h_offset = -l.pad/2;int h = l.out_h;        // 输出的尺寸int w = l.out_w;int c = l.c;for(b = 0; b < l.batch; ++b){for(k = 0; k < c; ++k){for(i = 0; i < h; ++i){for(j = 0; j < w; ++j){int out_index = j + w*(i + h*(k + c*b));            // 输出的索引float max = -FLT_MAX;int max_i = -1;for(n = 0; n < l.size; ++n){                        // 一个区域内的最大值for(m = 0; m < l.size; ++m){int cur_h = h_offset + i*l.stride + n;      // 输出的尺寸反推到图像的indexint cur_w = w_offset + j*l.stride + m;int index = cur_w + l.w*(cur_h + l.h*(k + b*l.c));  // 卷积核区域的索引int valid = (cur_h >= 0 && cur_h < l.h &&cur_w >= 0 && cur_w < l.w);float val = (valid != 0) ? net.input[index] : -FLT_MAX;max_i = (val > max) ? index : max_i;        // 最大值的索引max   = (val > max) ? val   : max;          // maxpool的最大值}}l.output[out_index] = max;l.indexes[out_index] = max_i;}}}}
}
  • 整个核心就是最内层的两个循环,表示求出ksize*ksize内最大值
  • 外层4个for循环,内层再是两个ksize的for循环
  • l.indexes是保存到反向传播时需要的

2. 反向传播

Code

void backward_maxpool_layer(const maxpool_layer l, network net)
{int i;int h = l.out_h;int w = l.out_w;int c = l.c;for(i = 0; i < h*w*c*l.batch; ++i){int index = l.indexes[i];net.delta[index] += l.delta[i];         // l.delta是误差}
}
  • 只有最大值对应的index才有误差

这篇关于【darknet】源码阅读理解(六)——maxpool的前向传播/反向传播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056892

相关文章

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言