范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

动手学深度学习框架(4)手把手教你写一个功能完整的简易Demo

  0、前言
  一定不要错过!一定不要错过!一定不要错过!重要的事情说 3 遍。本篇文章中,我将手把手教你写一个功能完整的深度学习框架 demo,本文将满足你对 Pytorch、Tensorflow、Paddle 中神秘的 C++ 后端的所有好奇心。1、问题描述
  为了在有限的篇幅中把深度学习框架讲明白,我们以一个简单的例子开始:
  组网结构:超级简单的 FC(全连接),Loss(损失函数)采用 MSE(最小均方误差)
  为了进一步简化,输入输出张量纬度均设为 1,也就是全为标量
  上式中,  是输入数据,  是模型输出,  是参数。
  给定一条训练样本  2、数学推导
  上述公式中的  就是神经网络中的 loss,则该最优化问题可抽象为:
  如何求解呢?3 板斧:反向梯度 + 链式求导 + 梯度更新
  3、详细代码及解释#include  #include  #include  #include  #include  #include  #include   //自定义 Tensor 类型,这里数据成员非常简单,就是个标量,重载了基本数学运算符 class MyTensor { public:     uint32_t data; public:     MyTensor(){};     MyTensor(uint32_t x) : data(x) {}     MyTensor operator*(const MyTensor& a) {         this->data = this->data * a.data;         return *this;     }     MyTensor operator+(const MyTensor& a) {         this->data = this->data + a.data;         return *this;     }     MyTensor operator-(const MyTensor& a) {         this->data = this->data - a.data;         return *this;     }     MyTensor operator*(const int& a) {         this->data = this->data * a;         return *this;     } };  // Op 基类 class OpBase { public:     std::unordered_map inputs;     std::unordered_map outputs;     std::unordered_map labels; public:     virtual void Run() = 0; };  // 乘法前向 Op class MultipylyForward : public OpBase { public:     void Run() {         MyTensor x = inputs["X"];         MyTensor w = inputs["W"];         MyTensor y1 = x * w;         outputs["Y"] = y1;     } };  // 乘法反向 Op class MultipylyBackward : public OpBase { public:     void Run() {         MyTensor x = inputs["X"];         outputs["Y"] = x;     } };  // 加法前向 Op class AddForward : public OpBase { public:     void Run() {         MyTensor x1 = inputs["X1"];         MyTensor x2 = inputs["X2"];         MyTensor y = x1 + x2;         outputs["Y"] = y;     } };  // 加法反向 Op class AddBackward : public OpBase { public:     void Run() {         MyTensor x;         x.data = 1;         outputs["Y"] = x;     } };  // loss 前向 Op,这里选取 MSE 作为示例 class LossForward : public OpBase { public:     void Run() {         MyTensor y = inputs["X"];         MyTensor label = labels["Label"];         MyTensor loss = (y - label) * (y - label);         outputs["Y"] = loss;     } };  // loss 反向 Op class LossBackward : public OpBase { public:     void Run() {         MyTensor y = inputs["X"];         MyTensor label = labels["Label"];         outputs["Y"] = (y - label) + (y - label);     } };  // 梯度更新 Op class UpdateGrad : public OpBase { public:     double lr = 0.1;     std::unordered_map inputs;     std::unordered_map outputs; public:     void Run() {         MyTensor w = inputs["W"];         MyTensor grad = inputs["Grad1"] * inputs["Grad2"] * inputs["Grad3"];  // 链式求导         MyTensor lr;         lr.data = this->lr;         outputs["Y"] = w - lr * grad;     } };  int main()  {     //1. 用户自定义前向组网     std::vector program{"Multiply", "Add", "Loss"};      //2. 框架生成前向op + 自动补全反向OP + 插入梯度更新op     std::vector ops{"multiply_forward", "add_forward", "loss_forward",         "loss_backward", "Add_forward", "multiply_backward", "update_grad"};      //3. 实例化 c++ 端 op 对象     std::vector opClass {new MultipylyForward(), new AddForward(), new LossForward(),         new LossBackward(), new AddBackward(), new MultipylyBackward(), new UpdateGrad()};      //4. 框架根据用户组网,自动给每个op的输入赋值,这里仅以乘法前向op作个例子。一定要记住一点:框架中所有输入数据、     //参数、模型中间输入、输出、以及每个参数的梯度都有一个 string 类型的名字,它的存在是为了给op输入赋值服务的     opClass[0]->inputs["X"] = MyTensor(10);     opClass[0]->inputs["W"] = MyTensor(20);     for (auto op : opClass) {         op->Run();     }      //5. 测试第1个op的输出     std::cout << opClass[0]->outputs["Y"].data;  // 输出结果:200 } 3.0、框架实现 7 个算子(Op)
  Op 就可以简单理解为函数符号化,对于每个 Op(函数),我们需要指定输入是什么,输出是什么,所以很显然想到用 string 类型的名字去描述。在 Op 运行时,只要按名字找到实际的数据即可。
  3.1、用户描述组网信息
  由 python 前端接口提供,具体可参考本系列专题之前的文章。 3.2、框架生成前向 Op(3 个) + 框架生成反向 Op(3 个) + 框架插入参数更新 Op(1 个)3.3、框架运行 Op4、总结
  当然,本文为了让大家理解神经网络框架的基本原理,所以非常简化。实际框架比这要复杂得多(功能更加完善、训练和推理的区别、静态图和动态图、cpu/gpu 等异构硬件、自动微分、序列化等等),但本质思想上是完全一样的。感兴趣的同学,可以去深入研究下 Pytorch、Paddle、Tensorflow 的源码吧。
  之后的文章,我将重点介绍下深度学习分布式技术的方方面面,欢迎关注。
  更多内容,也请关注我同名知乎账号『自由技艺』

华为Mate50抱歉,让你久等了在广大花粉的心中,华为Mate系列才是真正的灵魂。我至今都还记得,在华为Mate40发布的那天,麒麟9000一夜之间扭转了国产芯片常年不如高通的局面,让整个数码圈都为之欢呼。不过,新诺基亚N76概念图从华为苹果口中夺食,高调回归搅局高端市场当前手机市场的份额中,国内手机市场份额排名较高的就是荣耀手机,而在海外市场中则是苹果和三星手机的市场份额较高。在高端手机市场,原本华为还可以与三星苹果进行抗衡,但是现在高端市场中也RedmiK50至尊版正式开售,出色的外表外加强劲的性能大伙都知道,Redmi在8月11日举行新品发布会吧,发布会上推出了RedmiK50至尊版,这款手机经过Redmi官方的调校,不管是性能还是外观都有所变化。据官方表示,RedmiK5上下叠放的两个洗衣机有什么用?洗烘一体机VS独立干衣机我之前在网上看一些别人家的装修,看到有不少人家的阳台上摆放了两台洗衣机,就像下面这样,一上一下地叠放在一起后来我甚至直接拿着照片去商场里咨询了售货员,才明白上面那个,并不是洗衣机,光大理财818理财节,八箭齐发与美好共鸣8月18日,恰逢中国光大银行30周年生日,光大理财积极参与818理财节8月15日至8月19日期间,将主推8款各具特色的理财。2022年上半年,光大理财曾以不俗的产品募集能力理财产品北京大学元培学院团委书记郭一杰到惠民县魏集镇调研大众网海报新闻记者段峰通讯员徐淑扩杜培培滨州报道8月12日,北京大学元培学院团委书记郭一杰带领学院暑期社会实践团队到魏集镇观摩调研。实践团队实地参观了鲁北民俗印象地魏集古村落,观看光大理财818理财节,八箭齐发与美好共鸣8月18日,恰逢中国光大银行30周年生日,光大理财积极参与818理财节8月15日至8月19日期间,将主推8款各具特色的理财。2022年上半年,光大理财曾以不俗的产品募集能力理财产品北京大学元培学院团委书记郭一杰到惠民县魏集镇调研大众网海报新闻记者段峰通讯员徐淑扩杜培培滨州报道8月12日,北京大学元培学院团委书记郭一杰带领学院暑期社会实践团队到魏集镇观摩调研。实践团队实地参观了鲁北民俗印象地魏集古村落,观看一味中药,疏通经脉,活血化瘀,告别颈椎不舒服颈椎病的引起主要包括内因和外因两种内因是指,日常生活中一些不良的生活习惯,例如长时间低头工作,长期保持同一个姿势,躺在床上看电视,正对着吹空调等。导致人体内阳气亏损,气滞血瘀,出现三款价格跳水手机推荐,最高直降2200,总有一款适合你随着新手机频频发布,旧手机不得不选择降价来让出市场空间。今天,我们要聊的就是三款价格跳水的手机,总有一款是适合你的。小米11Ultra对于当时买不起小米11UItra的米粉来讲,现5nmZen4来了!AMD锐龙7000处理器首发型号及价格曝光采用5nmZen4架构的AMD锐龙7000桌面处理器呼之欲出,最新消息指出,基本确定9月15日上市,发布时间则会更早,大约提前一周时间。同时,有经销商泄露了首发SKU阵容以及对应的
商标热点丨茶颜悦色注册万般皆苦华为申请华为灵境3D1近日,知名奶茶品牌茶颜悦色所属的湖南茶悦文化产业发展集团有限公司申请注册万般皆苦商标,国际分类为方便食品,目前商标状态为注册申请中。2又被驳回!农夫山泉股份有限公司于今年5月申请软银史上最大亏损裁员,套现,孙正义低头了丨深度文章作者翟傲风数据支持路演时刻创投数据(www。dyly。com)前几天巴菲特旗下伯克希尔哈撒韦归母净利润亏损437。55亿美元之后,现在世界最大的风投机构,软银集团也迎来了至暗时刻。2022年8月换机,这四款千元机性价比最高,连用三年毫无压力您在阅读前请点击上面的关注二字,后续会第一时间为您提供更多有价值的相关内容,感谢您的支持。随着手机处理器性能的不断提升,千元机的性能也有了明显的提高,现在千元机可以买到次旗舰的配置乌鸦变凤凰,从68元跌到5。64元,跌了两年了高位68元跌到5。64元,达到了79。64的跌幅,小鸭出水在均线的下方运行,呈空头排列,股票价格开始向上运行,突破各均线的压制,呈多头运行。热点概念3D玻璃华为概念车联网触摸屏概念美国7月CPI同比上涨8。5中新社华盛顿8月10日电美国劳工部10日发布的数据显示,美国7月消费者价格指数(CPI)同比上涨8。5,仍处于高位运行。得益于能源价格回落,7月CPI环比未现上涨。当地时间8月107月乘用车零售量增20。4,新能源出口持续攀升来源中国经济网郭跃7月,国内乘用车零售量达到181。8万辆,同比增长20。4,是近十年来的同期第二高增速。国内乘用车产销链条则形成产量高于批发量2。4万辆批发量高于零售量31。6万白萝卜学会这样做,我家天天吃都不腻,营养又解馋,给肉都不换三餐美味,四季幸福,大家好!萝卜有土人参的称号,里面所含有的营养物质对人体有很多好处,我们在日常生活中可以多吃点萝卜。今天,我要给大家分享一个用白萝卜做出来的美食,做法真的很特别,美特斯邦威森马以纯,当年潮牌三巨头现在怎么样了?前一阵,周杰伦带着新专辑回来了。但是他以前爱穿的亮面彩色棉服内搭格子衬衫的潮流,早就消失在人海。缔造这一中学生穿搭潮流的,是周杰伦代言过好多年的国民品牌美特斯邦威。最近,有疑似美邦奥利尼克与女友结婚,新娘颜值符合东方审美,新郎曾拖拽乐福胳膊近日美国杂志人物报道了NBA圈内的最新消息,活塞队中锋球员奥利尼克已经在加利福利亚州的圣伊内斯Sunstone葡萄酒庄园完成了自己的婚礼。从照片不难看出奥利尼克的妻子非常漂亮,身材长期吃六味地黄丸的人,身体会怎样?医生5个变化等着他六味地黄丸由熟地黄山茱萸山药泽泻丹皮茯苓六味中药组成,出自宋代名医钱乙的小儿药证直诀。它以滋补肾阴为主。有的人长期服用六味地黄丸,希望可以延年益寿,强身健体,的确,六味地黄丸对5种女人会不会打扮,看一眼领子就能判断!选对领口,不吃亏领子作为一件衣服距离脸部轮廓最近的部分,一直是服装最为重要的关键。因为衣领的形状直接和能否体现较好脸型完美身材有着密切的关系。有品位的女性在选择裙子时,从来都不会忽略领子的形状,因