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

动手学深度学习框架(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 的源码吧。
  之后的文章,我将重点介绍下深度学习分布式技术的方方面面,欢迎关注。
  更多内容,也请关注我同名知乎账号『自由技艺』

点云可视化点击显示点坐标1点云可视化基于点云库PCL1。8。11。1包含头文件includeincludeincludeincludeusingnamespacepcltypedefpclPointXYZ科技股抛售打击风投信心初创企业估值恐遭下调周五,美股市场在苹果特斯拉和英伟达等科技股强劲反弹的提振下,终止了连日下跌,纳斯达克也避免连续五周的跌势。纳斯达克综合指数今年迄今已下跌超过15,全球市场此轮科技股抛售潮已影响到风乐视北京员工每年5天带薪育儿假1月29日,乐视视频官方微博对外公布了公司育儿假的政策我们从2021年12月21日起释放育儿假,北京员工,子女不满三周岁的父母每人每年享受5天带薪育儿假(外地天数参考当地政策)。产漂流七年的马斯克火箭要撞月球了,就在3月据美国知名科技博客媒体ArsTechnica报道,马斯克的SpaceX七年前在美国佛罗里达州发射了一枚猎鹰9号火箭,任务完成后,被留在太空的火箭第二级将于今年3月撞上月球,但预计撞今年1月,超20家光谷企业获融资乐居买房讯据悉,2022年以来,光谷股权投融资市场延续强劲态势。1月份,聚芯微电子奋进智能云岭光电锂鑫自动化等20多家企业获得股权融资,金额超23亿元,新年开门红。投资机构中,不乏小米8手机刷Win1110项目最新进展触屏已经工作IT之家1月31日消息,据B站UP主5超级菜鸟5的视频显示,小米8刷Windows11Windows10项目取得新的进展,触屏已经工作!小米8手机已适配触屏,uefi和驱动程序过段这30个互联网项目,有的已经让人血本无归了,别上当了今天除夕,万家灯火,喜迎佳节,大学士祝大家虎年虎虎生威,财源滚滚!同时我们不能忘记了防骗,下面这些互联网项目,别去涉足!1冯宝成团队,又名冯保成团队,忽悠中老年人已经3年了2某鸿股iOS15。4Beta1发布,支持戴口罩解锁苹果在今天凌晨向全体开发者用户推送了以下系统更新iOS15。4beta(19E5209h)iPadOS15。4beta(19E5209h)watchOS8。5beta(19T521驻安徽聆思智能科技有限公司岗位安徽聆思智能科技有限责任公司是一家面向人工智能物联网领域提供AI芯片及行业解决方案的高科技企业。公司核心优势在于将业界领先的人工智能算法芯片设计技术行业解决方案有机结合,在智慧家庭比亚迪半导体过会今年IPO过关第26家中金公司过2单中国经济网北京1月28日讯创业板上市委员会2022年第5次审议会议于昨日召开,审议结果显示,比亚迪半导体股份有限公司(简称比亚迪半导体)首发符合发行条件上市条件和信息披露要求。这是氪星晚报丨360宣布全面转型数字安全公司英伟达否认放弃收购Arm,公司回应态度不变快手推出蓝领招聘平台快招工大公司YouTubeCEO将为视频创作者提供NFT功能据报道,YouTubeCEO苏珊沃西基近日表示,YouTube正在探索为视频创作者提供NFT(非同质化代币)功能。尽管沃西基并