首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Keras神经网络转到Android可用的模型

Keras神经网络转到Android可用的模型

作者头像
PhoenixZheng
发布于 2018-12-10 03:53:57
发布于 2018-12-10 03:53:57
1.8K0
举报

这是一篇对手册性质的文章,如果你刚好从事AI开发,可以参考这文章来进行模型转换。

Keras转TFLite需要三个过程,

  1. Keras 转 Tensorflow
  2. 固化 Tensorflow 网络到 PB(Protocol Buffer)
  3. PB 转 TFLite
Keras 网络构成

Keras网络有一个文件(正常情况)

  • *.h5 它是HDF5格式文件,同时保存了网络结构和网络参数。
Tensorflow 网络的构成

Tensorflow 常见的描述网络结构文件是 ckpt,它有两个文件构成

  • model.ckpt
  • model.ckpt.meta 新版本的 Tensorflow 的 Saver 会默认使用新格式保存,新格式的文件是这几个
  • model.ckpt.data-00000-of-00001
  • model.ckpt.index
  • model.ckpt.meta Tensorflow自从开源之后就经常有改动,目前还不确定新格式的三个文件是什么作用跟含义。 就暂时以最稳定的老版本格式来解释。
  • model.ckpt 这个文件记录了神经网络上节点的权重信息,也就是节点上 wx+b 的取值。
  • model.ckpt.meta 这个文件主要记录了图结构,也就是神经网络的节点结构。

一个完整的神经网络由这两部分构成,Tensorflow 在保存时除了这两个文件还会在目录下自动生成 checkpoint, checkpoint的内容如下,它只记录了目录下有哪些网络。

model_checkpoint_path: "squeezenet_model.ckpt" all_model_checkpoint_paths: "squeezenet_model.ckpt"

Keras 转 Tensorflow

转换过程需要先把网络结构和权重加载到model对象, 然后用 tf.train.Saver 来保存为 ckpt 文件。

目前代码是以V1为基础的,指定Saver版本可以在构建Saver的时候指定参数 saver = tf.train.Saver(write_version=tf.train.SaverDef.V1) saver.save(K.get_session(), './squeezenet_model.ckpt')

CKPT freeze 到 PB

ckpt的网络结构和权重还是分开的 需要先固化到PB,才能继续转成 tflite。

Tensorflow 提供了python脚本用来固化,位置在

/usr/local/lib/python3.6/site-packages/tensorflow/python/tools/freeze_graph.py

对于固化的过程需要关注这几个参数

  • input_meta_graph: meta 文件,也就是节点结构
  • input_checkpoint: ckpt 文件,保存权重
  • output_graph: 输出PB文件的名称
  • output_node_names: 网络输出节点
  • input_binary: 输入文件是否为二进制 下面的命令直接给出了如何转换,对于几个参数的意义比较难理解的是倒数第二个,文章后面再给出对它的解释。

python3 freeze_graph.py \ --input_meta_graph=model.ckpt.meta \ --input_checkpoint=model.ckpt \ --output_graph=model.pb \ --output_node_names="final_result" \ --input_binary=true

PB 到 Tensorflow Lite

Tensorflow 提供了 TOCO 工具用来做转换, 必填的参数有下面这些,

toco --graph_def_file=squeezenet_model.pb \ --input_format=TENSORFLOW_GRAPHDEF \ --output_format=TFLITE \ --output_file=model.tflite \ --inference_type=FLOAT \ --input_type=FLOAT \ --input_arrays=input \ --output_arrays=final_result \ --input_sahpes=1,227,227,3

参数中需要解释的有这几个, --input_shapes: 输入数据的维度,跟你的网络输入有关。比如1,227,227,3,代表的是1个227*227的3通道图片。 --output_arrays 和 --input_arrays: 这两个参数跟网络的输入输出有关。而 output_arrays 跟转换成 PB 时的参数 --output_node_names 是一样的。 也就是说这两个参数必须在查看网络之后才能确定 下面给出如何查看网络的方法

查看PB网络结构

在tensorflow包下面,跟freeze_graph.py同个目录下有另一个脚本

import_pb_to_tensorboard.py

它接受一个protobuf文件作为输入,并输出log到指定路径。之后可以就用tensorboard查看log文件了。 tensorboard是一个把网络视图话的工具,可以在浏览器上直接查看网络结构。 运行

python3 import_pb_to_tensorboard.py --model_dir model.pb --log_dir board/

如果环境没问题的话会在board/目录下生产 local文件, 你会在终端看到tensorflow的提示,

Model Imported. Visualize by running: tensorboard --logdir=board/

按提示执行tensorboard,就可以在浏览器中通过 localhost:6006 查看网络结构了。 需要关注的是网络的输入和输出节点的命名, 而它的命名就是上面几个步骤中我们需要的参数名了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习入门篇--手把手教你用 TensorFlow 训练模型
该文介绍了如何使用TensorFlow实现YOLO v2神经网络模型对图像进行分类,并给出了代码示例和训练过程的详细步骤。
付越
2017/10/16
9.9K2
深度学习入门篇--手把手教你用 TensorFlow 训练模型
如何将自己开发的模型转换为TensorFlow Lite可用模型
对于开发者来说,在移动设备上运行预先训练好的模型的能力意味着向边界计算(edge computing)迈进了一大步。[译注:所谓的边界计算,从字面意思理解,就是与现实世界的边界。数据中心是网络的中心,PC、手机、监控照相机处在边界。]数据能够直接在用户手机上处理,私人数据仍然掌握在他们手中。没有蜂窝网络的延迟,应用程序可以运行得更顺畅,并且可大幅减少公司的云服务账单。快速响应式应用现在可以运行复杂的机器学习模型,这种技术转变将赋予产品工程师跳出条条框框思考的力量,迎来应用程序开发的新潮流。
云水木石
2019/07/01
3.4K0
如何将自己开发的模型转换为TensorFlow Lite可用模型
详解TensorFlow查看ckpt中变量的几种方法
2. 使用tf.train.NewCheckpointReader直接读取ckpt文件里的变量,使用tools.inspect_checkpoint里的print_tensors_in_checkpoint_file函数打印ckpt里的东西
狼啸风云
2019/10/24
5.2K0
tensorflow的模型持久化
tensorflow提供了一个非常简单的API来保存和还原一个神经网络模型。这个API就是tf.train.Saver类。以下代码给出了保存tensorflow计算图的方法。
狼啸风云
2019/03/06
2K0
卷积神经网络实现图像识别及过程可视化
样本按照不同类别保存在不同文件夹中,每个文件夹代表一个类别,然后这些文件夹放在同一文件夹中,该文件夹和脚本同一目录下。
全栈程序员站长
2022/06/27
6490
卷积神经网络实现图像识别及过程可视化
TensorFlow学习笔记--自定义图像识别
本篇文章主要讲解自己的图像数据如何在TnesorFlow上训练,主要从数据准备、训练模型、验证准确率和导出模型并对图片分类。重点如下:
喵叔
2020/09/08
8300
Tensorflow c++ 实践及各种坑
曾子骄
2017/10/13
7.1K12
Tensorflow c++ 实践及各种坑
【Kaggle竞赛】迭代训练模型
CV领域中,在完成数据准备工作和设计定义好模型之后,我们就可以去迭代训练模型了,通过设置调节不同的超参数(这需要理论知识和丰富的经验)来使得损失(loss)和准确率(accuracy)这两个常用的指标达到最优。一般在训练完成之后,都需要通过损失曲线图和准确率曲线图来衡量整个训练过程。
嵌入式视觉
2022/09/05
7950
【Kaggle竞赛】迭代训练模型
安卓手机如何玩转动作手势检测?有TensorFlow就够了,附实用教程
原文来源:Lemberg Solutions Ltd 作者:Zahra Mahoor、Jack Felag、 Josh Bongard 编译:嗯~阿童木呀、KABUDA 现如今,与智能手机进行交互的方式有很多种:触摸屏、硬件按钮、指纹传感器、视频摄像头(如人脸识别)、方向键(D-PAD)、手持设备控制等等。但是我们该如何使用动作识别功能呢? 我们可以举一个例子来说明这个问题,比如当你持手机将其快速移动到左侧或右侧时,可以非常精确地显示出想要切换到播放列表中下一首或上一首歌曲的意图;或者,你可以将手机快
企鹅号小编
2018/01/25
3.2K0
TensorFlow-Slim图像分类库
本文介绍了如何使用深度学习模型进行图像分类,并探讨了在训练和评估模型时出现的问题及解决方案。
chaibubble
2018/01/02
2.7K0
TensorFlow-Slim图像分类库
Keras模型转TensorFlow格式及使用
由于方便快捷,所以先使用Keras来搭建网络并进行训练,得到比较好的模型后,这时候就该考虑做成服务使用的问题了,TensorFlow的serving就很合适,所以需要把Keras保存的模型转为TensorFlow格式来使用。
Cloudox
2021/11/23
1.4K0
MNIST数据集 — 前期准备
前面都是基础零碎的知识,需要通过一个栗子来为大家把整个流程走一遍,从整体上对TensorFlow进行一个把握,大概分为四篇文章来说明吧(前期准备、前馈计算、模型训练、模型评价)。
木野归郎
2020/10/30
5810
MNIST数据集 — 前期准备
基于tensorflow的MNIST数字识别
MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会作为深度学习的入门样例。下面大致介绍这个数据集的基本情况,并介绍temsorflow对MNIST数据集做的封装。tensorflow的封装让使用MNIST数据集变得更加方便。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。在MNIST数据集中的每一张图片都代表了0~9中的一个数字。图片的大小都为28*28,且数字都会出现在图片的正中间。
狼啸风云
2019/03/01
3.1K0
Tensorflow的图像操作(三)
这里我们重点来看一下这个train方法,在训练的部分有一个非常重要的点就是如何去进行样本的选择。如果使用triplet loss训练我们的网络结构,会存在一个非常严重的问题,就是正负样本的样本对的数量存在很大的差异。这个时候会进行难样本的挖掘,在FaceNet中的策略,我们不能将其称为OHEM,不能称为严格意义上的难例挖掘,但有其核心思想在里面。如果要想使我们的模型训练的更好,此处可以对样本选择的部分进行优化。
算法之名
2021/12/13
5470
相关推荐
深度学习入门篇--手把手教你用 TensorFlow 训练模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档