自制深度学习推理框架 |
您所在的位置:网站首页 › pandas计算方差 › 自制深度学习推理框架 |
自制深度学习推理框架-第7节-计算图中的表达式¶
什么是表达式¶
表达式就是一个计算过程,类似于如下: output_mid = input1 + input2 output = output_mid * input3用图形来表达就是这样的. 但是在PNNX的Expession Layer中给出的是一种抽象表达式,会对计算过程进行折叠,消除中间变量. 并且将具体的输入张量替换为抽象输入@0,@1等.对于上面的计算过程,PNNX生成的抽象表达式是这样的. add(@0,mul(@1,@2)) 抽象的表达式重新变回到一个方便后端执行的计算过程(抽象语法树来表达,在推理的时候我们会把它转成逆波兰式)。其中add和mul表示我们上一节中说到的RuntimeOperator, @0和@1表示我们上一节课中说道的RuntimeOperand. 这个抽象表达式看起来比较简单,但是实际上情况会非常复杂,我们给出一个复杂的例子: add(add(mul(@0,@1),mul(@2,add(add(add(@0,@2),@3),@4))),@5)这就要求我们需要一个鲁棒的表达式解析和语法树构建功能. 我们的工作¶ 词法解析¶词法解析的目的就是将add(@0,mul(@1,@2))拆分为多个token,token依次为add ( @0 , mul等.代码如下: enum class TokenType { TokenUnknown = -1, TokenInputNumber = 0, TokenComma = 1, TokenAdd = 2, TokenMul = 3, TokenLeftBracket = 4, TokenRightBracket = 5, }; struct Token { TokenType token_type = TokenType::TokenUnknown; int32_t start_pos = 0; //词语开始的位置 int32_t end_pos = 0; // 词语结束的位置 Token(TokenType token_type, int32_t start_pos, int32_t end_pos): token_type(token_type), start_pos(start_pos), end_pos(end_pos) { } };我们在TokenType中规定了Token的类型,类型有输入、加法、乘法以及左右括号等.Token类中记录了类型以及Token在字符串的起始和结束位置. 如下的代码是具体的解析过程,我们将输入存放在statement_中,首先是判断statement_是否为空, 随后删除表达式中的所有空格和制表符. if (!need_retoken && !this->tokens_.empty()) { return; } CHECK(!statement_.empty()) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |