热门标签 | 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 的核心概念和操作。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • Python第三方库安装的多种途径及注意事项
    本文详细介绍了Python第三方库的几种常见安装方法,包括使用pip命令、集成开发环境(如Anaconda)以及手动文件安装,并提供了每种方法的具体操作步骤和适用场景。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • 本文详细介绍了如何在C#程序运行期间防止系统进入休眠模式以及显示器关闭,提供了具体的实现代码示例,并解释了其应用场景。这不仅有助于提高程序的稳定性,还能优化能源管理。适合需要处理长时间任务(如下载或批处理)的开发者参考。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
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社区 版权所有