热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TensorFlowLite在移动设备上的部署实践与优化笔记

近期在探索如何将服务器端的模型迁移到移动设备上,并记录了一些关键问题和解决方案。本文假设读者具备以下基础知识:了解TensorFlow的计算图(Graph)、图定义(GraphDef)和元图定义(MetaGraphDef)。此外,文中还详细介绍了模型转换、性能优化和资源管理等方面的实践经验,为开发者提供有价值的参考。

最近在研究怎么将服务器跑的模型移植到手机端,需要一些问题记录下~

前提知识:

1)熟悉 Graph、GraphDef和MetaGraphDef的含义和区别

2)熟悉tf lite官网上的文档,包括python api和命令行CLI的使用方法(lite converter和lite interpreter)

3)熟悉quantization_aware traning的官网示例(区别于post quantization)

4)熟悉mobilenet_v1官方的train和eval示例

 

如果熟悉了上面的前提知识,那么手机端lite移植也就不难了~

步骤:

1)使用quantization_aware的方式训练模型(quant delay延迟加载)得到checkpoint文件。(包含模型变量的参数值)

2)将train graph转为eval graph。(模型图的前向传播图,只包含结果,不包含参数值)

3)基于eval graph,得到frozen graph(freeze_graph命令行工具),将变量转为常量~。(将ckpt文件中变量值附加到前向传播图中,作为参数常量存在,也就是“frozen”的意思[将变量冻结为常量]~)

4)调用toco命令行工具,将frozen graph转为lite graph(指定输入和输出的name、输入的大小、inference的输入和输出类型、GraphDef或其他包含GraphDef的格式文件等等)。

 

采坑:

1)量化的graph目标不是train graph,而是eval graph

2)python api方式转为lite一直报错,转为freeze_graph+toco解决

3)freeze_graph和toco命令行的参数说明

4)input_shape要前后始终统一

5)要熟悉Graph、GraphDef、MetaGraphDef等区别

6)熟悉summary.save、savedModel、save_graph_def和export_meta_graph等api的区别

7)熟悉tf的整个流程,深刻理解tensor和operation的作用和地位

8)post quantization和quantization-aware训练模型,量化处理的方式不一样(详情见tf官方文档)

 

如何保证量化之后的精度:

待定~

 


更多学习笔记可以关注我的微信公众号「kelly学挖掘」,欢迎交流。


-- over --


推荐阅读
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • Keras 实战:自编码器入门指南
    本文介绍了使用 Keras 框架实现自编码器的基本方法。自编码器是一种用于无监督学习的神经网络模型,主要功能包括数据降维、特征提取等。通过实际案例,我们将展示如何使用全连接层和卷积层来构建自编码器,并讨论不同维度对重建效果的影响。 ... [详细]
author-avatar
殇者残雪_270
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有