神经网络是建立在数学的基础上进行计算的,因此对数字更敏感,不管是什么样的特征数据都需要以向量的形式喂入神经网络,无论是图片、文本、音频、视频都是一样。
one-hot编码,也就是独热编码,是一种常用的编码手段。在多分类识别的时候,喂入神经网络的标签就是独热码,比如手写数字识别一共有10个分类,某张图片标签是6,则独热码为:0 0 0 0 0 0 1 0 0 0
下面演示将一个单词进行ont-hot编码:
#字母表 word_id = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9,'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14,'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19,'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25} #进行编码的单词 word = 'china' #ont-hot编码 arr = np.zeros((len(word),len(word_id))) for k,w in enumerate(word): arr[k][word_id[w]] = 1 print(arr)
打印结果:
[[0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
文本->单词->向量
文本编码则与单词编码不同,单词编码以26个字母为映射字典,文本编码需要以单词为单位进行字典映射,因为单词是有语义的,在实际场景中往往捕捉的是文本所表达的意思,而不是文本本身的字母组成。
#要编码的文本 text = 'I am Chinese, I love China' total_num = len(text.replace(',',' ').split()) #映射字典 word_id = {} sentences = text.split(',') for line in sentences: for word in line.split(): if word not in word_id: word_id[word] = len(word_id) print(word_id) #ont-hot编码 arr = np.zeros((len(sentences),total_num,len(word_id))) for k,v in enumerate(sentences): for kk,vv in enumerate(v.split()): arr[k][kk][word_id[vv]] = 1 print(arr)
打印结果:
{'I': 0, 'am': 1, 'Chinese': 2, 'love': 3, 'China': 4}
[[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]]
2. 模块
-
系统内部所有需要等待的异步响应都要有超时处理。
-
关联组件的行为不一致要做异常处理:比如:APP模块认为通信已经断开,故不会再次请求通信MID模块去执行通信,而通信MID模块等待APP模块来触发下一次通信。
-
模块内部暂态都要设置最长停留时间,以及超过这个时间后做什么样的处理。
-
模块的错误处理至少要考虑以下几种类型错误:
-
输入了范围外的值
-
在规定时间内,处理没有结束或者没有应答
-
与期待的时序不一致
-
期待的数据不完整:
-
-
由错误转化为异常的判定标准:
-
不以单次Error做判定,而是执行一定次数(3次)的Retry处理。
-
测试时间以大于一定时间为目标 。
-
-
通信关联的功能模块在设计时需要考虑:
-
用户异常切断时怎么处理
-
通信正常切断时怎么处理
-
通信正常终了时怎么处理
-
设备异常切断时怎么处理"
-
-
做状态迁移表的设计时,如果状态迁移表的事件有外部设备异常切断的通知。要明确各状态下收到该通知时处理的妥当性,并且明确这些设计。
-
需要考虑起动处理时各模块消息的同步问题。例如,优先级高的A模块启动后,发送消息给后B模块,考虑如果此时B模块未启动的处理情况。
-
对于Backup的数据,需要考虑Backup各种状态下启动之后处理:
1 没有读取到Backup数据
2 Backup数据为初始值
3 Backup数据达到最大边界值
4 Backup数据超过最大边界值或者异常。 -
备份的数据要有默认值。
-
备份的数据要进行完整性校验。
-
设计模块时,尽量保证此模块可以有机制来恢复。
-
模块出现异常时,有一套机制可以检测出来。
3. 函数
-
输入范围之外的值需要做处理。
-
函数设计时需要明确设计目标函数所调用函数的所有返回值。对正常值以外的返回值进行分析,分析不同的返回值是否需要做不同的异常处理。并且明确这些异常设计。
-
Loop循环,一定要设定跳出循环的条件或者是范围的判定。
-
进行数据的格式转换的处理,需要明确:1 数据转换前后的格式2 转换规则3 是否有数据在转换时需要特殊处理,比如边界值。
2. 实现
-
不允许使用C语言中非安全的经典函数,如下:
-
strcpy/wcscpy/stpcpy/ wcpcpy
-
scanf/ sscanf /vscanf /fwscanf /swscanf/ wscanf
-
gets/ puts
-
strcat /wcscat
-
wcrtomb /wctob
-
sprintf/ vsprintf /vfprintf
-
asprintf/ vasprintf
-
strncpy /wcsncpy
-
strtok/ wcstok
-
-
代码满足静态检查规范(cert C,misra C)。
-
函数的入参要进行范围判断。
-
不允许使用函数的递归。
-
优先使用RAII技术来管理资源(使用C++语言),比如锁,文件句柄等。
-
优先使用引用来代替裸指针(使用C++语言)。
-
优先使用智能指针代替裸指针(使用C++语言)。
-
尽量避免强制类型转换。
3.测试
1. 测试用例
测试用例至少覆盖以下几种情况:
-
基本功能:典型时序(所有的错误;异步超时需要重点关注)。
-
性能:性能相关时序。
-
边界值:外部输入所有的边界值。
-
异常值:接口中数据范围异常;时序重复混乱;备份数据损坏;服务器来的数据破坏;总线上数据异常等 。
-
恶意操作:ACC ON,OFF频繁操作;外部线恶意插拔;外部没有得到结果就再次请求;外部连续两个相反的请求;外部连续两个不同的请求等。
-
内部状态:内存使用量大时;CPU占有率大时;各种电源状态下 。
-
外部状态:总线负载大时;Linux下2038问题;MQTT/HTTP同时进行;正常功能和debug功能同时进行。OTA/diag/factory reset处于执行中时。
2. 测试工具
-
测试用例要能支持回归测试。
-
搭建自动化测试环境。