news 2026/5/22 12:42:55

C++20模板实战tuple展开入参

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++20模板实战tuple展开入参

背景

之前使用了C++17标准写了人工神经网络,里面涉及了大量的模板递归。比如我要建立一个多层网络组成的复杂网络,在模板参数里面需要以各层网络为实参,逐层保存每层的神经网络,并且撰写正向反向逻辑。对于BP要一层一层写forward和backward,对于CNN也要一层一层写forward和backward,这里面涉及了大量的重复代码。但实际多层的神经网络的处理主干逻辑都是一样的。正向是从前层到后层逐一调用forward,前层输出为后层输入;反向传播从后向前逐一调用backward。最近学习了C++20以及折叠表达式,我就在想能不能将这些逻辑通过模板的方式处理以减少重复代码。

设计思路

我首先定义了单层的权重层,以后还将有各类激活层、标准化层,这些层的具体代码就不一一展示了,本章只谈主干逻辑。这些逻辑层都有forward和backward成员函数,用来接收上一层的输出作为本层输入,并且返回下一层的输入。通过折叠表达式可以实现正反向传播:

template<typenamenet_type,typenameinput_type>requiresis_forwardable<net_type,input_type>autooperator>>(input_typeconst&input,net_type&net){returnnet.forward(input);}template<typenameinput_type,typename...net_types>autonet_forward(input_typeconst&input,net_types&&...nets){return(input>>...>>nets);}template<typenamenet_type,typenameinput_type>requiresis_backwardable<net_type,input_type>autooperator<<(net_type&net,input_typeconst&input){returnnet.backward(input);}template<typename...net_type,typenameinput_type>autonet_backward(input_typeconst&input,net_type&&...nets){return(nets<<...<<input);}

重载了>>和<<分别实现正向传播和反向传播,重载的目的是使用折叠表达式。init op ... op pack的样式表示的是(...((init op arg1) op arg2)... op argN,重载了>>用于正向传播(注意符号重载函数参数顺序)。这里我的目的是让net_forward和net_backward可以一次性由浅层到深层传入各层网络,最终得到网络的正向输出和反向输出。这样做的初衷是避免多层的递归调用。
下面我想定义一个多层的网络,这个网络的模板参数是各层的类型,复杂网络模板可以将各层作为内部成员进行保存,在前向传播时候调用net_forward一次性传入,得到输出;反向传播的时候也是一次性输入各层,得到反向误差传播结果并且更新网络。这里存在3个问题:

  1. 如何保存各层网络的对象;
  2. 如何将对象队列按照正向顺序一次性传入forward;
  3. 如何将对象队列按照正向顺序一次性传入backward;
    我这里使用的是tuple保存各类对象,并且使用std::apply模板函数将入仓一次性传入。
template<typename...net_types
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 12:42:24

Java打造教练培训专属排课系统源码

以下为您深度解析基于Java的教练培训专属排课系统源码实现&#xff0c;涵盖架构设计、核心算法、冲突检测及部署优化全流程&#xff1a;一、系统架构设计&#xff08;Spring Boot 3.0 Vue3微服务架构&#xff09;技术栈分层&#xff1a;前端&#xff1a;Vue3 Element Plus T…

作者头像 李华
网站建设 2026/5/20 21:02:41

CSDN专栏:技术领袖如何从“代码架构师”跃迁为“产业定义者”?

CSDN专栏&#xff1a;技术领袖如何从“代码架构师”跃迁为“产业定义者”&#xff1f;引言&#xff1a;技术巅峰之上&#xff0c;为何仍感“无力”&#xff1f;尊敬的CTO、技术VP、创始人&#xff1a;当您的团队已能攻克最复杂的技术架构&#xff0c;当您的产品在细分领域已做到…

作者头像 李华
网站建设 2026/5/20 5:19:44

【视觉slam14讲学习笔记1——构建docker环境】

文章目录 1、构建docker镜像环境1、拉取代码2、拉取docker镜像3、测试chapter2 参考&#xff1a; 《视觉SLAM十四讲》Docker环境配置及代码复现 1、构建docker镜像环境 1、拉取代码 git clone https://github.com/gaoxiang12/slambook2.git cd slambook2/3rdparty/ git subm…

作者头像 李华
网站建设 2026/5/22 1:09:42

反传统笔记APP,摒弃纯文本/图片记录,支持语音+场景自动补充,用户说明天下午三点开会,自动补充会议地点,参会人员,(从通讯录提取),还能生成思维导图。

1. 实际应用场景与痛点场景传统笔记 APP 只能记录纯文本或图片&#xff0c;用户在记录会议信息时&#xff0c;需要手动输入&#xff1a;- 会议地点- 参会人员- 相关背景资料这导致&#xff1a;- 记录效率低- 容易遗漏关键信息- 无法自动关联已有数据&#xff08;如通讯录、日历…

作者头像 李华
网站建设 2026/5/21 11:58:04

深圳汇芯生物全自动外泌体提取系统界面设计

01项目背景深圳汇芯生物医疗科技有限公司&#xff08;以下简称汇芯生物&#xff09;是由外泌体领域知名科学家和产业专家共同创立的国家高新技术企业&#xff0c;致力于推动外泌体在癌症早期诊断和治疗领域的研究及应用&#xff0c;开发全球领先的生物医疗技术&#xff0c;满足…

作者头像 李华
网站建设 2026/5/21 20:59:09

Light Image Resizer v7.5.1 批量压缩加水印工具

Light Image Resizer v7.5.1 是一款免激活的专业批量图片处理工具&#xff0c;集批量调整大小、格式转换、加水印、优化压缩等多功能于一体&#xff0c;操作便捷且参数灵活&#xff0c;完美适配个人日常与职场办公的图片批量处理需求&#xff0c;助力高效完成图片优化任务。一、…

作者头像 李华