项目 | 内容 |
---|---|
课程 | 人工智能实战2019 |
作业要求 | 人工智能实战第八次作业(个人) |
我的课程目标 | 第一次作业 介绍自己,提出课程项目建议 |
我的Github主页 | LeeDua |
思考题1 - 如何识别不合法的输入
- 分类的概率输出来自于softmax,不合法输入的输出值送进softmax前相对于合法输入导出的输出在此处的分布情况会有较大差异。
- 对于给定字符_alpha_,softmax前输出_ALPHA_,可以预先计算其他合法l={a,b,c,d,1,2,3,...}在softmax前输出分布的集合L,L中每个元素可以以一个N维(总类别数)正态分布拟合,人为设定sigma判定使ALPHA落在所有L中分布均值sigma外时认为alpha为非法输入。
思考题2 - 如何识别下列元素
- 算式的语义识别本质上是一个编译问题
- 进行图像预处理、轮廓提取获得预定义的合法的字符流后,要做的就是根据字符流按照预定义的合法记号(可以包括多个字符,如果是运算符还可以包含关联字符的关系)按照预定义的记号结构进行记号提取,这一部分就是lexer。
- 之后根据lexer返回的记号流按照预定义的算式文法规则进行语义分析和语法制导计算就是parser。
- 具体地回答三个问题:
- A:支持sin:已能分别识别s,i,n后如果在一个字符流读到s,继续向后读i和n,如果读到了return TOKEN_SIN,如果没有将后面多读的字符rollback回记号流按照读到了一个s继续处理。
- B:复杂的表达式结构:任何表达式结构可以定义一个运算符,指数结构定义成x^y运算符,分数结构定义为竖式x/y,如此返回的字符需要包含该字符的空间关系或该字符在读字符流的过程中根据该字符和之后的字符的空间关系判断是否满足预定义好的运算符规则。
- C:和B没有任何区别,只不过需要根据文法多次记号递归,文法中需要定义某些记号的作用范围,即结合性(如定义根号的作用范围从而读到根号后把其下的所有记号一次全部读出再做处理;指数运算符单一字符左结合,从而不会出现(a2+b)2的行为)
最终,任何算式都能按文法表达成抽象语法树,对树做后序遍历的过程中根据节点的类型(字符、运算符的类型)做对应的语法制导翻译(计算),顶层节点不断调用子节点的计算函数进行递归计算即可求出整棵树顶节点的值,即整个表达式的值。