news 2026/4/10 12:43:38

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/4/10 12:11:11

XS2100S 兼容于IEEE 802.3af/at ,为PD提供检测信号、分级信号以及带有浪涌电流控制的集成隔离功率开关

XS2100S 为用电设备(PD)提供符合以太网供电 (PoE)系统 IEEE802.3af/at 标准的完整接口。XS2100S 为PD提供检测信号、分级信号以及带有浪涌电流控制 的集成隔离功率开关。发生浪涌期间&#xff0c;XS2100S 将电 流限制在180mA 以内&#xff0c;直到隔离功率MOSFET 完全 开启后切…

作者头像 李华
网站建设 2026/4/8 21:15:56

【沈阳工业大学主办、连续5届EI稳定】第六届能源工程、新能源材料与器件国际学术会议(NEMD 2026)

第六届能源工程、新能源材料与器件国际学术会议&#xff08;NEMD 2026&#xff09;将于2026年3月27-29日召开。本次会议将为研究人员、从业者和教育工作者提供一个重要的跨学科平台&#xff0c;不仅介绍和探讨在能源工程、新能源材料与器件领域的最新创新、趋势和关注点&#x…

作者头像 李华
网站建设 2026/4/7 4:47:59

java+vue基于springboot的在线考试系统

目录 系统概述技术架构核心功能创新点应用场景 开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 基于SpringBoot和Vue的在线考试系统是一个前后端分离的Web应用&#xff0c;旨在提供高效、安全的在线考试解决方…

作者头像 李华