news 2026/6/10 19:34:48

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/20 20:49:04

改稿速度拉满! 降AI率平台 千笔AI VS speedai,MBA专属高效之选

在AI技术迅猛发展的今天&#xff0c;越来越多的MBA学生开始借助AI工具辅助论文写作&#xff0c;以提升效率、优化内容。然而&#xff0c;随着学术审查标准的不断升级&#xff0c;AI生成内容的痕迹愈发明显&#xff0c;查重率和AIGC检测成为论文通过的关键门槛。许多学生在使用各…

作者头像 李华
网站建设 2026/5/27 10:55:49

Java教练培训排课系统源码全攻略

以下是一份Java教练培训排课系统源码设计的全攻略&#xff0c;涵盖架构设计、核心功能、关键代码实现及数据库设计等方面&#xff1a;一、系统架构设计分层架构&#xff1a;采用经典的MVC模式&#xff0c;结合Spring Boot框架&#xff0c;将系统划分为视图层&#xff08;View&a…

作者头像 李华
网站建设 2026/6/9 23:19:33

WiFi模块选型及技术解析:从无线通信原理到典型应用场景

随着物联网与智能终端的持续发展&#xff0c;设备联网已经成为系统设计中的基础能力之一。在众多无线通信技术中&#xff0c;Wi-Fi 模块因其传输速率高、协议成熟、部署成本低等特点&#xff0c;被广泛应用于智能家居、工业设备、车载系统以及各类联网终端中。 本文将围绕 Wi-…

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

必收藏!AI爆发时代,程序员别只顾用AI摸鱼,职业危机已在眼前

最近复盘各类技术项目、刷行业文章时发现&#xff0c;AI出现的频率已经高到离谱——一篇技术博文里&#xff0c;不提十几次AI、大模型&#xff0c;仿佛都跟不上行业节奏&#xff0c;甚至会被觉得“out”了。 说实话&#xff0c;每次看到这种场景都忍不住感叹&#xff1a;AI的发…

作者头像 李华
网站建设 2026/6/10 19:00:32

自动循迹智能小车的研究设计

自动循迹智能小车的研究设计 第一章 研究背景与核心目标 自动循迹智能小车作为移动机器人的典型载体&#xff0c;在工业巡检、物流运输、教育科研等领域具有广泛应用前景。传统循迹小车存在循迹精度低、抗干扰能力弱、转向响应滞后等问题&#xff0c;难以适应复杂路径与多变环境…

作者头像 李华
网站建设 2026/5/30 15:17:03

CSDN:To B软件企业的生死一跃:从“项目承包商”到“范式定义者”

CSDN&#xff1a;To B软件企业的生死一跃&#xff1a;从“项目承包商”到“范式定义者”引言&#xff1a;技术人的商业困境各位To B软件企业的技术创始人、架构师、解决方案专家&#xff1a;您是否时常感到一种巨大的“价值错配”&#xff1f;您的团队用最前沿的架构&#xff0…

作者头像 李华