此次有幸申请到《深度学习》一书,在为期三周的时间内进行了阅读,由于本人之前是利用单片机进行开发,所以希望能够获取一些单片机上进行机器学习的相关知识。本书中对于深度学习内容的阐述较为生动形象,引用了许多贴近生活的示例,让人可以直观地感受深度学习的原理。通过阅读并且查阅资料,我希望和大家分享一下我所关注问题的一些收获,首先是对于机器学习中数据集获取的解决办法。通常我们在训练时需要有一定的数据才能完成,而此前通常都需要人工去产生数据集以满足使用需求。通过学习与查阅,还了解到以下的获取方法:
公开数据集:许多研究机构和大学会发布一些标准的公开数据集,这些数据集通常经过清洗和标注,适合用于学术研究和教育目的。例如,MNIST数据集是手写数字识别的入门级数据集,CIFAR-10和CIFAR-100是常用的图像识别数据集,ImageNet是一个大规模的图像识别数据集,而Pascal VOC则常用于对象检测和图像分割任务。
网络爬虫:可以通过编写网络爬虫程序从互联网上抓取数据,这种方法可以获得大量数据,但需要处理数据的不确定性和质量问题。
数据平台:一些数据平台如Kaggle、Google Dataset Search、AWS Public Datasets等提供了大量的数据集,这些数据集覆盖了各种领域和应用。
平时在进行项目开发时,有一些情况下需要对单片机部署机器学习模型,通常使用STM32Cube.AI来进行模型转换和代码生成。对于我自己使用单片机进行机器学习时,也了解了一些需要注意的地方用来优化性能,比如可以通过以下方式:使用位操作代替算术操作:位操作通常比算术操作更快,例如使用位与、位或、位异或等操作来处理标志位,或者使用位移操作来替代乘除法。避免不必要的操作:去除代码中不必要的变量赋值和函数调用,减少程序的复杂性和执行时间。控制数据类型大小:尽量使用较小的数据类型,如char
或int
,而不是float
,因为浮点数运算通常需要更多的CPU周期和内存空间。利用硬件资源:例如,使用DMA(直接内存访问)来传输数据,减少CPU负载,或者利用单片机的硬件加速器(如果存在)来执行特定任务。自加、自减指令:使用i++
和i--
等自增自减操作,因为某些编译器对这些操作进行了优化,效率更高优化算法:选择或设计适合单片机资源限制的算法,例如使用简单的线性回归而不是复杂的神经网络模型。代码重用:通过函数或宏来重用代码,减少代码冗余,提高代码的可维护性。寄存器优化:将频繁使用的变量存储在寄存器中,以加快访问速度。指令流水线优化:通过合理组织代码,使得指令可以并行执行,提高执行效率。内存优化:优化数据结构和内存使用,减少内存碎片,提高内存访问速度。中断优化:合理配置中断,减少中断处理程序的复杂性,确保中断服务例程尽可能简短。模型优化:在模型训练阶段,可以通过模型压缩、量化等技术减小模型大小,使其更适合在单片机上运行。
不知道有无同行对于使用单片机进行机器学习模型部署有丰富的经验,希望可以交流学习,在这方面我还较为生疏。