① 嵌入式系统自学
嵌入式系统软件工程 方法实用技术及应用,免费下载
链接:https://pan..com/s/10No3IypKyLg01bV4T9b22w
《嵌入式系统软件工程:基础知识、方法和应用》系统地阐述嵌入式系统软件工程所涉及的过程、方法、内容,以及在典型工业领域中的应用。全书内容分为两大部分:第一部分介绍嵌入式系统软件工程方法论,主要包括嵌入式软件的开发过程(需求工程、软件和系统体系结构、编程和测试等内容),开发和测试中所采用的标准,与安全性相关的软件系统的准入,以及嵌入式软件所涉及的法律问题:第二部分介绍嵌入式系统软件在汽车领域、轨道交通领域、航天领域、医疗器械、工业自动化、通信系统中的应用,在每个应用领域重点介绍具体应用领域的一些特定需求、技术和限制条件,以及它们对于嵌入式系统软件开发过程的影响。
② 文字转语音芯片(单片机用)
45Microcontrollers & Embedded Systems2002.12
新器件新技术 NEW PRODUCT & TECH
用EP7211实现传呼信息实时语音合成和播放
■ 郑州解放军信息工程大学 胡泽明 王鹏
摘 要
关键词
阐述在一款集成传呼功能的二合一PDA系统中,使用嵌入式处理器EP7211实现个人传呼信
息的实时语音合成和播放的功能,主要包括字符语音库的建立,字符语音合成算法和Codec
语音中断服务例程等3部分.
PDA G.729 语音库 语音合成
引 言
PDA(Personal Digital Assitant,个人数字助理)
是近年来继寻呼机和移动电话之后,在国内市场迅
速崛起的便携式电子产品.就其扩展意义来讲,它
能够集成移动计算,电话和网络等多种功能.根据
不同的应用需求,它可以管理个人信息,提供名片
存储和日程安排,也可以接收各种寻呼信息(如股
市,天气预报等).如果是集成通信模块,还可以
作为移动电话使用,进行无线网络互联.广义的
PDA包括简单的电子记事本,电子辞典和功能强大
的掌上电脑,它们的主要区别表现在操作系统,存
储能力,运算速度和数据交换能力等方面.
目前国内传统PDA产品经过几年的高速发展
后,市场基本饱和,销售额出现负增长.不过由于
PDA产品的灵活性,有针对性的行业应用作为一个
新亮点,开始为人们所关注.经过行业应用改造后
的PDA产品,已经在国内市场大显身手.文曲星
展现超强的语言翻译能力,比较适合于大学生和语
言翻译者使用;蓝火系列能实时接收股市信息和
专家点评,适合工薪阶层的炒股者.国家信息产业
部已经鼓励PDA产品在交通,警务,保险等领域
的行业应用和推广.
分析市场需求,我们研发了集成传呼功能的,
专门面向铁路交通行业应用的铁路交通信息系统
PDA.本PDA系统除了具备传统PDA的个人名片
管理和辞典检索等功能外,同时提供交通行业应用
的民航航班查询,铁路列车时刻表查询等功能.
本PDA的寻呼系统实现如下功能:能够通过寻
呼对列车时刻表,列车晚点信息,列车剩余票额,
股道信息等行业数据进行动态更新.作为另一个特
色,当接收到个人寻呼时,能够将寻呼内容实时地
转换成语音并播放.
下面重点介绍本PDA系统中使用嵌入式处理
器EP7211实现个人寻呼内容的实时语音转换和播
放.该功能的实现包含前后相关的3个部分:字符
语音库的建立,字符的语音合成算法和Codec语音
中断服务例程.
1实现条件和要求
PDA属于嵌入式应用系统,其同一般PC机有
很大差别.硬件方面,嵌入式处理器基于RISC体
系结构,一般工作频率在几十MHz,甚至更低;系
统内存容量一般在几百KB~几MB之间;一般使用
容量小的ROM或者Flash作为硬盘来存储可执行程
序和数据.软件方面,PDA系统一般有专用的嵌入
式操作系统和软件开发调试移植环境.
个人传呼信息的特点是单条传呼信息长度变化
较大,20~50个字符不等.最为常见的是"请回电
话***";传呼信息涉及到的字符数量较大,字符
语音合成时运算量大,单字符合成后语音数据占用
的存储空间多;需要事先建立字符语音库等.
由于具体硬件环境的限制,传呼信息的特点和
语音合成的要求,该功能能够实现的前提有:语音
库占用的空间小;字符合成时速度要快;采用前台
进行字符语音合成时,以后台中断方式进行合成语
音的播放来保证其实时性和连续性.
2具体实现
下面分别介绍字符语音库的建立,字符语音合成
算法,本PDA系统的框架结构和语音中断服务例程.
2.1建立字符语音库
我们选用G.729语音压缩编码标准来建立语音
库.该标准采用的算法是共轭结构的代数码激励线
462002.12
新器件新技术 NEW PRODUCT & TECH
性预测(CS-ACELP),是基于CELP(码激励线性预
测)编码模型的算法.这种编码规范的严格性使性
能达到或超过了32 Kbps的G.726 ADPCM编码,具
有很高的语音质量;同时,它是在语音信号8 KHz
取样的基础上得到16 bit线性PCM后进行编码的,
压缩后的数据速率仅为8 Kbps,具有相当于8:1的
高压缩率.其算法延迟少于16 ms.由于G.729编解
码器能够实现很高的语音质量和很低的算法延时,
因此被广泛地应用.
字符语音库是一个单字发音语音数据的集合,
各段数据之间相互独立,不具有相关性.语音库包
含了国标一,二级字库中的所有6763个汉字,10个
阿拉伯数字和26个英文字符的标准普通话语音数
据.每个汉字或字符发音时长为0.65 s,采用8 KHz
抽样频率,使用了G.729A语音编码算法对上述的语
音数据进行压缩,压缩后的数据速率为8 Kbps,相
当于具有8:1的高压缩率.在汉字中,同音字占了
相当大的比例,而在语音合成中对于同音字的处理
是没有区别的,故近7000个汉字,我们只存储1123
个不同的发音.经过同音字处理和采用G.729A标准
压缩字符语音数据,则最终建立的语音库文件大小
为729 950字节,完全符合本PDA系统的数据存储
要求;否则,语音库数据量太大,本PDA系统不
能接受!
建立一个语音压缩数据库的具体步骤如下:
◇ 将数字和常用汉字的标准发音独立地录入到
数据文件中,作为基础数据.使用cooledit2000软
件完成语音的录入.
◇ 对于输入数据,按照每帧10 ms(80个样点)
的长度,将A_law语音通过简单换算变成16 bit PCM
数据,作为编码算法的输入.
◇ 按照G.729A算法标准,对数据进行编码.
◇ 将编码后的数据转换为二进制比特流,写
入语音库文件中.压缩后数据速率为8 Kbps,具有
相当于8:1的高压缩率.
用C语言实现这一过程的程序流程如图1所示.
字符语音库的建立是在Windows平台及Visual
C++编程环境下实现的,最终压缩处理后数据量的
大小为729 950字节,每个字符语音数据的大小是
650字节.
2.2语音合成
当收到个人传呼信息时,语音合成程序首先从
指定位置获取传呼信息数据,然后在语音库中查找
每个汉字,阿拉伯数字或者英文字符的发音,重组
一个数据文件.解码程序对该文件进行解码并且输
出原始语音.语音合成流程如图2所示.
语音合成过程首先是当前字符在语音库的定
位.对于10个阿拉伯数字和26个英文字符,将其
放在语音库开头.这些字符的查找比较方便.汉字
是2字节存储,我们依据其区位码来作为语音库中
的定位索引.字符语音库检索结束后的语音压缩数
头文件,全局变量,函数原型的说明
输入语音文件及压缩后的码文件名
初始化编码器,包括滤波器状态的初始
化及语音,激励等缓冲区的初始化
语音文件是否结束
读1帧语音(80点)(A_Law)
转换成16bit线性PCM
将参数码字转成串行码
流,再转成码字codeword
写文件
结束
编码主函数Coder_ld8a()
Y
N
图1 字符语音库的建立流程图
查找语音库,将寻呼文字信
息替换为压缩语音文件
解码器初始化
码文件是否结束
读取1帧数据,并
转换成二进制码流
解码主函数
输出数据变为A_LAW信号
语音播放
结束
Y
N
图2 语音合成流程图
47Microcontrollers & Embedded Systems2002.12
新器件新技术 NEW PRODUCT & TECH
据作为该字符解码过程的输入.
数据解码过程可以分为参数解码和重构信号后
处理2部分.首先要从输入的数据中提取参数符
号,对这些符号解码之后,可以获得相应于10 ms
话音帧的编码器参数.这些参数包括线性预测系
数,自适应码本矢量,固定码本矢量以及它们的增
益.解码之后的参数用来计算重建语音信号.得到
重构语音信号只有通过后处理过程来对该信号进行
放大,包括后向滤波,高通滤波以及按比例因子扩
大,最后得到原始的语音数据.
字符解码器原理如图3所示.
2.3PDA系统的体系结构
PDA系统的硬件体系结构如图4所示.
PDA系统中嵌入式处理器EP7211进行数据处
理,传呼解码芯片接收传呼信息并进行解码, LCD
提供数据输出显示,触摸屏提供用户输入接口,
Flash用来存储应用程序和数据,SRAM为程序运行
提供内存空间,电源电路为嵌入式处理器和外围设
备提供所需要的工作电压.
嵌入式处理器EP7211是Cirrus Logic公司专门为
低成本,超低功耗的嵌入式应用设计的,包含
ARM7TDMI处理器内核和丰富的外围接口.外围接
口有CODEC音频接口,SPI串行A/D接口,单色LCD
接口,DRAM接口,红外接口,2个PWM接口,实
时时钟RTC以及电源检测接口.EP7211的内核电路
工作在2.5 V,而外围电路工作在3.3 V;可根据具
体情况对内核的
时钟进行动态编
程控制,可工作
在18,36,49和74
MHz.另外EP7211
还有3种基本供
电模式:正常操
作(operating),
空闲(idle)和等
待(standby).在
等待模式,主时
钟被关断,整个
CPU及相关外围
(除中断和RTC)
也关断,但可通
过中断或按钮来
唤醒.
系统软件开发平台采用了我们自主开发研制
的,专门面向嵌入式应用系统开发的XGW平台.
XGW开发平台采用消息驱动机制,是C语言开发.
它功能强大,模块化设计,扩展性强,产品升级容
易,总体框架如图5所示.
图5全面反应了XGW开发平台的体系结构,包
括事件消息驱动机制,内存管理,字符和图形显示
输出,图形组件库等.图形组件库中的编辑框,列
表框,按钮等为用户应用程序开发提供了系统应用
编程接口API.不过,XGW平台对于系统硬件的中
断响应没有提供统一的入口和出口,需要开发人员
单独处理.XGW开发平台的消息分为鼠标消息,键
盘消息和定时器消息等3类.
2.4语音中断服务例程
嵌入式处理器EP7211本身提供的外设语音录放
Codec(coder/decoder)芯片可以实现语音的录入和
适应码
向量解码
增益解码
固定码
向量解码
结构激励
MA码增
益预测
11
,GBGA
22
,GBGA
)(nv
间隔延时
p
g^
^
c
g^
11
,CS
22
,CS
)(zP
)(nc
编码序号
LP综合
滤波器
)(nu
后滤波器
)(^ns
高通上标定
)(nfs
LSP解码内插值)(^zALSF
LSP序号
3210
,,,LLLL
每帧
每子帧
210
,,PPP
图3 字符解码原理框图
天线
LCD
触摸屏
时钟,复
位,唤醒射频输入
FlashSRAM电源管理
串行口
红外口
传呼解
码芯片嵌入式
处理器
EP7211
收音设备
语音录放电路
图4 硬件结构
482002.12
新器件新技术 NEW PRODUCT & TECH
播放功能.该模块提供2个独立的16字节长的数据
发送和接收缓冲区(FIFO),其为全双工模式,数
据收发速率是64 kbps.芯片自身提供工作时钟,定
时脉冲以及数据的串/并和并/串转换功能.编程
人员通过设置EP7211相应的控制寄存器使能这些项
功能,则每当数据收发缓冲区半慢或者半空时(8
字节),芯片自身就会产生一次中断信号供外部处
理.理论计算芯片中断速率是1 ms/次.
语音播放中断服务例程主要完成的工作是,当
产生语音中断时,仍然有数据需要播放,则向语音
数据发送缓冲区FIFO中写入指定数据,剩下的工
作由Codec芯片本身来完成.中断服务例程ISR的
伪代码如下(因为具体实现代码没有通用性,故此
处用伪码描述):
void IRQ_Codec_Handler(void)
{
while(检测系统状态寄存器,发现语音芯片数据发送缓
冲区FIFO非满)
{
if(已经播放过的语音数据长度 = 给定的需要播
放的语音数据长度) //结束
{
禁止数据发送缓冲区中断;
复位各相关的全局变量;
程序返回;
}
}
else
{
向语音芯片发送数据缓冲区FIFO写入默认数据
系统调用
通用开
发控件字符输出图形输出
内存管理用户自
定义控件
事件消息驱动
硬件中断
执行
ISR
中断返回
硬件中断
执行
ISR
中断返回
用户级应用程序
图5 XGW平台的软件体系结构
0XFF;
}
}
}3试验结果和分析
由于在设计阶段充分考虑过语音合成算法的
大运算量和系统的实时性要求,故我们在具体实
现的时候也采取了一些措施,比较突出的有:用
ARM汇编语言来实现关键性的函数代码;语音合
成时提高处理器EP7211的工作频率(处理器正常
工作频率是18 MHz);对于一些常用的三角函数计
算,采用查表的方式等来加快程序执行速度.在
PDA样机测试中,单字符合成时间在650 ms左右,
基本上能够满足实际应用需求.数据语音库经过
处理之后,占用了729 560字节也能够满足本PDA
系统的存储要求.
当PDA系统收到1条个人传呼信息时,在语音
库的支持下,立刻启动语音合成算法,逐个进行字
符语音合成.当第1个字符语音合成结束后,立刻
启动语音中断服务例程进行语音播放.这样收到的
个人传呼信息,在前台逐个字符解码时,其后台语
音播放也在进行.根据实际测试参数,基本上满足
了系统的实时性要求.
从一定角度看,单字符650 ms的语音合成时间
基本能够满足实际应用需要,但还是希望能够进一
步减小这个值.这由于我们对ARM处理器的使用
还处在研究阶段.ARM本身提供了16位的Thumb
指令集和32位的ARM指令集,而且两者在某些方
面表现出较大差别.一般来讲,Thumb代码长度是
ARM代码长度的65%,而执行效率要比后者高出
60%.但在某些方面,32位的ARM指令集也会表
现出其优于16位Thumb指令集的强大功能;同时
该处理器系统支持ARM指令集和Thumb指令集混
合编程模式.随着对二者差别和各自优势的深入理
解,结合本系统的硬件体系结构,采用有效的指令
集混合编程模式将会使程序执行效率进一步提高,
从而使实时性得到进一步加强.
参考文献
1Cirrus Logic公司. EP7211数据手册
2马忠梅. ARM嵌入式处理器结构与应用基
础. 北京:北京航空航天大学出版社,2002
3Gibson Jerry D,等. 多媒体数字压缩原理与
标准. 李煜晖等译. 北京:电子工业出版社,2000
③ N-Shot Learning:用最少的数据训练最多的模型
作 者 | Heet Sankesara
翻 译 | 天字一号(郑州大学)、邺调(江苏 科技 大学)
审 校 | 唐里、Pita
如果将AI比作电力的话,那么数据就是创造电力的煤。
不幸的是,正如我们看到可用煤是消耗品一样,许多 AI 应用程序可供访问的数据很少或根本就没有数据。
新技术已经弥补了物质资源的不足;同样需要新的技术来允许在数据很少时,保证程序的正常运行。这是正在成为一个非常受欢迎的领域,核心问题:N-shot Learning
1. N-Shot Learning
你可能会问,什么是shot?好问题,shot只用一个样本来训练,在N-shot学习中,我们有N个训练的样本。术语“小样本学习”中的“小”通常在0-5之间,也就是说,训练一个没有样本的模型被称为 zero-shot ,一个样本就是 one-shot 学习,以此类推。
1-1 为什么需要N-Shot?
我们在 ImageNet 中的分类错误率已经小于 4% 了,为什么我们需要这个?
首先,ImageNet 的数据集包含了许多用于机器学习的示例,但在医学影像、药物发现和许多其他 AI 可能至关重要的领域中并不总是如此。典型的深度学习架构依赖于大量数据训练才能获得足够可靠的结果。例如,ImageNet 需要对数百张热狗图像进行训练,然后才能判断一幅新图像准确判断是否为热狗。一些数据集,就像7月4日庆祝活动后的冰箱缺乏热狗一样,是非常缺乏图像的。
机器学习有许多案例数据是都非常稀缺,这就是N-Shot技术的用武之地。我们需要训练一个包含数百万甚至数十亿个参数(全部随机初始化)的深度学习模型,但可用于训练的图像不超过 5 个图像。简单地说,我们的模型必须使用非常有限的热狗图像进行训练。
要处理像这个这样复杂的问题,我们首先需要清楚N-Shot的定义。
对我来说,最有趣的子领域是Zero-shot learning,该领域的目标是不需要一张训练图像,就能够对未知类别进行分类。
没有任何数据可以利用的话怎么进行训练和学习呢?
想一下这种情况,你能对一个没有见过的物体进行分类吗?
夜空中的仙后座(图源:https:// www .star-registration .com /constellation/cassiopeia)
是的,如果你对这个物体的外表、属性和功能有充足的信息的话,你是可以实现的。想一想,当你还是一个孩子的时候,是怎么理解这个世界的。在了解了火星的颜色和晚上的位置后,你可以在夜空中找到火星。或者你可以通过了解仙后座在天空中"基本上是一个畸形的'W'"这个信息中识别仙后座。
根据今年NLP的趋势,Zero-shot learning 将变得更加有效(https://blog.floydhub .com /ten-trends-in-deep-learning-nlp/#9-zero-shot-learning-will-become-more-effective)。
计算机利用图像的元数据执行相同的任务。元数据只不过是与图像关联的功能。以下是该领域的几篇论文,这些论文取得了优异的成绩。
在one-shot learning中,我们每个类别只有一个示例。现在的任务是使用一个影像进行训练,最终完成将测试影像划分为各个类。为了实现这一目标,目前已经出现了很多不同的架构,例如Siamese Neural Networks(https:// www .cs.cmu.e/~rsalakhu/papers/oneshot1.pdf),它带来了重大进步,并达到了卓越的结果。然后紧接着是matching networks(https://ar xi v.org/pdf/1606.04080.pdf),这也帮助我们在这一领域实现了巨大的飞跃。
小样本学习只是one-shot learning 的灵活应用。在小样本学习中,我们有多个训练示例(通常为两到五个图像,尽管上述one-shot learning中的大多数模型也可用于小样本学习)。
在2019年计算机视觉和模式识别会议上,介绍了 Meta-Transfer Learning for Few-Shot Learning(https://ar xi v.org/pdf/ 181 2.02391v3.pdf)。这一模式为今后的研究开创了先例;它给出了最先进的结果,并为更复杂的元迁移学习方法铺平了道路。
这些元学习和强化学习算法中有许多都是与典型的深度学习算法相结合,并产生了显着的结果。原型网络是最流行的深度学习算法之一,并经常用于小样本学习 。
在本文中,我们将使用原型网络完成小样本学习,并了解其工作原理。
2. 原型网络背后的思想
上图为原型网络函数的示意图。编码器将图像进行编码映射到嵌入空间(黑圈)中的矢量中,支持图像用于定义原型(星形)。利用原型和编码查询图像之间的距离进行分类。图源:https:// www .semanticscholar.org/paper/Gaussian-Prototypical-Networks-for-Few-Shot-on-Fort//figure/1
与典型的深度学习体系结构不同,原型网络不直接对图像进行分类,而是通过在度量空间(https://en.wikipedia.org/wiki/Metric_space)中寻找图像之间的映射关系。
对于任何需要复习数学的人来说,度量空间都涉及"距离"的概念。它没有一个可区分的"起源"点。相反,在度量空间中,我们只计算一个点与另一个点的距离。因此,这里缺少了矢量空间中加法和标量乘法(因为与矢量不同,点仅表示坐标,添加两个坐标或缩放坐标毫无意义!)请查看此链接,详细了解矢量空间和度量空间之间的差异:https://math.stackexchange .com /questions/1 149 40/what-is-the-difference-between-metric-spaces-and-vector-spaces。
现在,我们已经学习了这一背景,我们可以开始了解原型网络是怎样不直接对图像进行分类,而是通过在度量空间中寻找图像之间的映射关系。如上图所示,同一类的图像经过编码器的映射之后,彼此之间的距离非常接近,而不同类的图像之间具有较长的距离。这意味着,每当给出新示例时,网络只需检查与新示例的图像最近的集合,并将该示例图像分到其相应的类。原型网络中将图像映射到度量空间的基础模型可以被称为"Image2Vector"模型,这是一种基于卷积神经网络 (CNN) 的体系结构。
现在,对于那些对 CNN 不了解的人,您可以在此处阅读更多内容:
简单地说,他们的目标是训练分类器。然后,该分类器可以对在训练期间不可用的新类进行概括,并且只需要每个新类的少量示例。因此,训练集包含一组类的图像,而我们的测试集包含另一组类的图像,这与前一组完全不相关。在该模型中,示例被随机分为支持集和查询集。
很少有镜头原型ck被计算为每个类的嵌入式支持示例的平均值。编码器映射新图像(x)并将其分类到最接近的类,如上图中的c2(图源:https://ar xi v.org/pdf/ 1703 .05 175 .pdf)。
在少镜头学习的情况下,训练迭代被称为一个片段。一个小插曲不过是我们训练网络一次,计算损失并反向传播错误的一个步骤。在每一集中,我们从训练集中随机选择NC类。对于每一类,我们随机抽取ns图像。这些图像属于支持集,学习模型称为ns-shot模型。另一个随机采样的nq图像属于查询集。这里nc、ns和nq只是模型中的超参数,其中nc是每次迭代的类数,ns是每个类的支持示例数,nq是每个类的查询示例数。
之后,我们通过“image2vector”模型从支持集图像中检索d维点。该模型利用图像在度量空间中的对应点对图像进行编码。对于每个类,我们现在有多个点,但是我们需要将它们表示为每个类的一个点。因此,我们计算每个类的几何中心,即点的平均值。之后,我们还需要对查询图像进行分类。
为此,我们首先需要将查询集中的每个图像编码为一个点。然后,计算每个质心到每个查询点的距离。最后,预测每个查询图像位于最靠近它的类中。一般来说,模型就是这样工作的。
但现在的问题是,这个“image2vector”模型的架构是什么?
论文汇总 Image2Vector 向量的结构
对于所有实际应用中,一般都会使用 4-5 CNN 模块。如上图所示,每个模块由一个 CNN 层组成,然后是批处理规范化,然后是 ReLu 激活函数,最后通向最大池层。在所有模块之后,剩余的输出将被展平并返回。这是本文中使用的网络结构(https://ar xi v.org/pdf/ 1703 .05 175 v2.pdf),您可以使用任何任何你喜欢的体系结构。有必要知道,虽然我们称之为"Image2Vector"模型,但它实际上将图像转换为度量空间中的 64 维的点。要更好地了解差异,请查看 math stack exchange(https://math.stackexchange .com /questions/ 64 5672/what-is-the-difference-between-a-point-and-a-vector)。
负log概率的原理,图源:https://ljvmiranda921.github.io/notebook/2017/08/13/softmax-and-the-negative-log-likelihood/#nll
现在,已经知道了模型是如何工作的,您可能更想知道我们将如何计算损失函数。我们需要一个足够强大的损失函数,以便我们的模型能够快速高效地学习。原型网络使用log-softmax损失,这只不过是对 softmax 损失取了对数。当模型无法预测正确的类时,log-softmax 的效果会严重惩罚模型,而这正是我们需要的。要了解有关损失函数的更多情况,请访问此处。这里是关于 softmax 和 log-softmax 的很好的讨论。
Omniglot数据集中的部分示例(图源:https://github .com /brendenlake/omniglot)
该网络在 Omniglot 数据集(https://github .com /brendenlake/omniglot)上进行了训练。Omniglot 数据集是专门为开发更类似于人类学习的算法而设计。它包含 50个不同的字母表,共计1623 个不同的手写字符。为了增加类的数量,所有图像分别旋转 90、 180 和 270 度,每次旋转后的图像都当做一个新类。因此,类的总数达到 了 64 92(1,623 + 4)类别。我们将 4200 个类别的图像作为训练数据,其余部分则用于测试。对于每个集合,我们根据 64 个随机选择的类中的每个示例对模型进行了训练。我们训练了模型 1 小时,获得了约 88% 的准确率。官方文件声称,经过几个小时的训练和调整一些参数,准确率达到99.7%。
是时候亲自动手实践了!
您可以通过访问以下链接轻松运行代码:
代码地址: https://github .com /Hsankesara/Prototypical-Networks
运行地址: https://floydhub .com /run?template=https://github .com /Hsankesara/Prototypical-Networks
让我们深入学习一下代码!(向左←滑动可查看完整代码)
以上的代码是 Image2Vector CNN结构的一个实现。它的输入图像的维度为28*28*3,返回特征向量的长度为 64 。
上面的代码片段是原型网中单个结构的实现。如果你有任何疑问,只需在评论中询问或在这里创建一个问题,非常欢迎您的参与和评论。
网络概述。图源:https://youtu.be/wcKL05DomBU
代码的结构与解释算法的格式相同。我们为原型网络函数提供以下输入:输入图像数据、输入标签、每次迭代的类数(即 Nc )、每个类的支持示例数(即 Ns )和每个类的查询示例数(即 Nq )。函数返回 Queryx ,它是从每个查询点到每个平均点的距离矩阵, Queryy 是包含与 Queryx 对应的标签的向量。 Queryy 存储 Queryx 的图像实际所属的类。在上面的图像中,我们可以看到,使用3个类,即 Nc =3,并且对于每个类,总共有5个示例用于训练,即 Ns =5。上面的s表示包含这15个( Ns * Nc )图像的支持集, X 表示查询集。注意,支持集和查询集都通过 f ,它只不过是我们的“image2vector”函数。它在度量空间中映射所有图像。让我们一步一步地把整个过程分解。
首先,我们从输入数据中随机选择 Nc 类。对于每个类,我们使用random_sample_cls函数从图像中随机选择一个支持集和一个查询集。在上图中,s是支持集,x是查询集。现在我们选择了类( C1 、C2 和 C3 ),我们通过“image2vector”模型传递所有支持集示例,并使用get_centroid函数计算每个类的质心。在附近的图像中也可以观察到这一点。每个质心代表一个类,将用于对查询进行分类。
网络中的质心计算。图源:https://youtu.be/wcKL05DomBU
在计算每个类的质心之后,我们现在必须预测其中一个类的查询图像。为此,我们需要与每个查询对应的实际标签,这些标签是使用get_query_y函数获得的。 Queryy 是分类数据,该函数将该分类文本数据转换为一个热向量,该热向量在列点对应的图像实际所属的行标签中仅为“1”,在列中为“0”。
之后,我们需要对应于每个 Queryx 图像的点来对其进行分类。我们使用“image2vector”模型得到这些点,现在我们需要对它们进行分类。为此,我们计算 Queryx 中每个点到每个类中心的距离。这给出了一个矩阵,其中索引 ij 表示与第 i 个查询图像对应的点到第 j 类中心的距离。我们使用get_query_x函数构造矩阵并将矩阵保存在 Queryx 变量中。在附近的图像中也可以看到同样的情况。对于查询集中的每个示例,将计算它与 C1、C2 和 C3 之间的距离。在这种情况下, X 最接近 C2 ,因此我们可以说 X 被预测属于 C2 类。
以编程方式,我们可以使用一个简单的ARMmin函数来做同样的事情,即找出图像被预测的类。然后使用预测类和实际类计算损失并反向传播错误。
如果你想使用经过训练的模型,或者只需要重新训练自己,这里是我的实现。您可以使用它作为API,并使用几行代码来训练模型。你可以在这里找到这个网络。
3. 资源列表
这里有些资源可以帮你更全面的了解本文内容:
4. 局限性
尽管原型网络的结果不错,但它们仍然有局限性。首先是缺乏泛化,它在Omniglot数据集上表现很好,因为其中的所有图像都是一个字符的图像,因此共享一些相似的特征。然而,如果我们试图用这个模型来分类不同品种的猫,它不会给我们准确的结果。猫和字符图像几乎没有共同的特征,可以用来将图像映射到相应度量空间的共同特征的数量可以忽略不计。
原型网络的另一个限制是只使用均值来确定中心,而忽略了支持集中的方差,这在图像有噪声的情况下阻碍了模型的分类能力。利用高斯原网络(https://ar xi v.org/abs/ 1708 .02 73 5)类中的方差,利用高斯公式对嵌入点进行建模,克服了这一局限性。
5. 结论
小概率学习是近年来研究的热点之一。有许多使用原型网络的新方法,比如这种元学习方法,效果很好。研究人员也在 探索 强化学习,这也有很大的潜力。这个模型最好的地方在于它简单易懂,并且能给出令人难以置信的结果。
via https://blog.floydhub .com /n-shot-learning/
本文由雷锋字幕组成员翻译,雷锋字幕组是由AI爱好者组成的字幕翻译团队;团队成员有大数据专家、算法工程师、图像处理工程师、产品经理、产品运营、IT咨询人、在校师生;志愿者们来自IBM、AVL、Adobe、阿里、网络等知名企业,北大、清华、港大、中科院、南卡罗莱纳大学、早稻田大学等海内外高校研究所。了解字幕组 请加 微信 ~
④ 学习嵌入式开发要学习哪些知识
嵌入式系统是计算机软件和硬件的综合体,你可以先下载全套嵌入式视频课自学,看是否感兴趣。
①C,Java核心编程:c语言核心编程,Java核心编程;
②Linux核心操作与算法:Linux系统使用,Linux-c编程核心技术,精品数据结构,Linux-c编程精髓;
③核心操作与算法:Linux系统编程,Linux网络编程核心技术,UI编程,Java核心编程,安卓核心技术;
④ARM+Linux底层开发:数字电路,ARM编程核心,Linux系统开发,嵌入式Linux驱动开发;
⑤大型项目实践:每期安排各类型真实的项目,详细可以点我下载资料。
ESE(嵌入式软件工程师);
ADE(嵌入式应用开发工程师);
FWE(嵌入式底层开发工程师);
FEC(嵌入式固件开发工程师)
你可以考察对比一下南京课工场、北大青鸟、中博软件学院等开设有嵌入式开发专业的学校。记得下载全套嵌入式开发视频课,祝学有所成!望采纳!
⑤ ARM中内存是如何存放数据的
每条指令都按照规定的编码格式 arm是32位的,所以每条指令的格式如下:
[31:28] [24:21] [20]
指令执行条件编码 指令操作符编码 是否影响CPSR的值
[19:16] [15:12] [11:0]
第一个操作数寄存器编码 目标寄存器编码 第二个操作数
所以ARM的指令和数据不是存储在同一个单元的,是根据指令(在flash中)到对应的寄存器中读取该寄存器中的数据或地址的内容进行操作的。