Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >教程 | 如何在手机上使用TensorFlow

教程 | 如何在手机上使用TensorFlow

作者头像
AI科技大本营
发布于 2018-04-26 08:44:14
发布于 2018-04-26 08:44:14
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

翻译 | AI科技大本营

参与 | zzq

审校 | reason_W

我们知道,TensorFlow是一个深度学习框架,它通常用来在服务器上训练需要大量数据的大模型。随着智能手机的普及,人们也越来越注意到手机这个巨大的新兴市场,这个市场未来的发展同样也需要人工智能。过去的几年,市场上涌现出了很多热爱机器学习并且愿意迫切推动人工智能发展的人,而现在他们已经开始向手机这个数万亿美元的市场砸钱了。

而能够在智能手机上运行TensorFlow的工具也已经被开发了出来。你是否也曾想过自己在手机上训练一个深度学习模型呢?如果你手边正好有一部Android或者iOS系统的手机的话,那刚好可以跟着这篇教程来做。

下面我将给出两个教程,一个是在安卓系统运行机器学习模型的方法,另一个则是在ios设备上运行机器学习模型的方法。

我们以在手机上实现一个图像分类功能为例。总体思路十分简单:首先使用Inception-v3模型,只对它的最后一层重新训练,然后对模型进行优化,最后嵌入到手机设备上就可以使用了。

在本教程中,ios设备需要6步,而安卓设备仅需要5步,我们将首先介绍这两种设备中相同的前三步,然后分别介绍之后的步骤。

▌步骤一:使用TensorFlow创建模型

首先,我们需要在电脑或者服务器上先使用TensorFlow创建好一个模型。因为本文是在手机上使用TensorFlow的教程,所以我就假设你已经熟练掌握创建模型这一步了。

没有掌握也没有关系,我推荐给你一个快速入门的教程如何利用用户图像在CPU上训练Inception模型

(https://towardsdatascience.com/training-inception-with-tensorflow-on-custom-images-using-cpu-8ecd91595f26)。

好了,回到本文,我们现在就得到一个已经训练好的模型了。

我们以花为例,在训练模型时,使用的数据:包括郁金香、雏菊、向日葵、蒲公英和玫瑰。当然你也可以使用其它种类的数据对模型进行训练。

之后,你会得到两个文件。首先是对所选网络最后一层重新训练以后的模型版本:

之后,你会得到两个文件。首先是对所选网络最后一层重新训练以后的模型版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf_files/retrained_graph.pb

然后是一个包含类别标签的文本文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf_files/retrained_labels.txt

▌步骤二:创建一个优化的模型

运行下面的命令行(请确保路径是正确的)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m tensorflow.python.tools.optimize_for_inference \
  --input=tf_files/retrained_graph.pb \
  --output=tf_files/optimized_graph.pb \
  --input_names="input" \
--output_names="final_result"

这将创建一个新的优化模型文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf_files/optimized_graph.pb

折中方案

为了减少应用程序中需要进行的预处理工作,同时也为了降低库的大小,TensorFlow只支持在推理过程中常用到的操作子集。不支持的操作过程可以查看这个链接。

(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/makefile/tf_op_files.txt)

现在,我们只要需要刚刚创建的图文件包含后面的操作就行了。

校验

为了确保之前创建的新的优化图能够正常运行,同时也为了移除optimize_for_inference文件中多余的输入和输出节点——这些节点不会改变网络的输出,我们需要进行校验。

使用图retrained_graph.pb和optimized_graph.pb中的label_file对相同的输出图像进行对比:

retrained_graph.pb使用如下指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m scripts/label_image \
  --graph=tf_files/retrained_graph.pb\
--image=tf_files/flower_photos/daisy/3475870145_685a19116d.jpg

optimized_graph.pb使用如下指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m scripts/label_image \
    --graph=tf_files/optimized_graph.pb \
--image=tf_files/flower_photos/daisy/3475870145_685a19116d.jpg

执行这些命令,如果两个输出相同,则意味着我们完美创建了optimize_graph.pb 。

▌步骤三:模型量化和压缩

由于我们要将模型嵌入到手机上,模型的大小就成了一个问题,手机无法处理如此巨大的模型。因为图所占用的大部分空间都是由权重构成的,这些权重是一些变化很小的浮点数,同时规律性又很小。

但是,数据压缩的工作原理又是基于数据中的规律性,这就会为模型压缩带来困难性。通过对网络的权重按因子进行量化,可以减小神经网络的大小。这会在网络图中带来更多的相同大小的权重(即重复),在之后的压缩中有很大的帮助。

现在我们使用quantize_graph脚本来对网络结构进行量化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m scripts/quantize_graph \
  --input=tf_files/optimized_graph.pb \
  --output=tf_files/rounded_graph.pb \
  --output_node_names=final_result \
--mode=weights_rounded

然后对模型进行压缩:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gzip -c tf_files/rounded_graph.pb > tf_files/rounded_graph.pb.gz
gzip -l tf_files/rounded_graph.pb.gz

这将创建一个名为rounded_graph.pb的文件。我们可以从中看到压缩情况有了明显的改善。

注意:如果运行quantize_graph时遇到任何错误,请下载此文件并将其复制到tensorflow库(TensorFlow安装位置)中的tools / quantization / quantanti_graph.py中。

从下面开始,教程将分为Android和iOS系统两部分。

iOS

▌步骤四:添加TensorFlow-experimental pod

将TensorFlow-experimental pod添加到你的pod文件中,这会安装一个通用二进制框架。这是在iOS上运行Tensorflow的最简单的方法。

▌步骤五:创建你的App

创建你自己的应用程序或者在XCode中加载已经创建好的的应用程序。

在项目根目录下添加一个名为Podfile的文件,其中包含以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target 'YourProjectName'
pod 'TensorFlow-experimental'

运行pod install下载并安装TensorFlow-experimental pod. 打开YourProjectName.xcworkspace并且添加你的代码。 在你的应用程序的Build Settings中,确保将$(inherited)添加到Other Linker Flags和 Header Search Paths 章节中。

▌步骤六:运行Sample

你需要Xcode 7.3或更高版本才能运行我们的iOS示例。

这有三个示例,包括:simple,benchmark,camera。你可以从这个链接(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios#building-the-tensorflow-ios-libraries-from-source)直接下载代码。

然后,从Tensorflow的根目录下载Inception v1,并使用以下步骤将标签和图文件提取到simple和camera示例中的数据文件夹中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p ~/graphs
curl -o ~/graphs/inception5h.zip \
 https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip \
 && unzip ~/{g}{r}{a}{p}{h}\frac{{s}}{\in}{c}{e}{p}{t}{i}{o}{n}{5}{h}.{z}{i}{p}-{d}~/graphs/inception5h
cp ~/graphs/inception5h/* tensorflow/examples/ios/benchmark/data/
cp ~/graphs/inception5h/* tensorflow/examples/ios/camera/data/
cp ~/graphs/inception5h/* tensorflow/examples/ios/simple/data/

切换到其中一个示例目录,下载Tensorflow-experimental pod(https://cocoapods.org/pods/TensorFlow-experimental)然后打开Xcode工作区。请注意,安装pod可能需要很长时间,因为它很大(约450MB)。如果你想运行示例代码,那么可以执行下面的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd tensorflow/examples/ios/simple
pod install
open tf_simple_example.xcworkspace #note .xcworkspace,not .xcodeproj

在XCode模拟器中运行简单的应用程序。你应该看到带有“Run Model”按钮的单屏幕应用程序。点击它,然后可以看到一个Grace Hopper图标。一旦你建立和运行它以后,你应该就能得到一个实时的相机视图,你可以指向物体获得实时的物体识别结果。

注意:我很确定我在iOS部分留下一些疏漏。如果你有任何错误,请通过这个官方链接进行评论,寻找帮助。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios#building-the-tensorflow-ios-libraries-from-source

Android

▌步骤四:设置Android Studio和测试运行

在安卓上有两种方法来实现我们的目的,一个是Android Studio 另一个是 Bazel。因为使用Android Studio的人更多,所以我就使用它了。

如果你还没有安装它,请从下面这个链接下载并安装Android Studio: (https://developer.android.com/studio/index.html)

测试运行

为了检查Android Studio能否正常运行,我们将做以下几个小测试: 打开Android Studio并选择“打开一个已有的Android Studio”工程 去tensorflow-for-poets-2/android/tfmobile目录下打开Build.gradle文件并同步Gradle。如果一切正常,请点击BUILD> BUILD APK按钮

现在,就创建了一个名为app.apk的文件,把它复制到你的手机上并安装。(要记得打开手机的开发者模式哦。)

▌步骤五:运行定制的应用程序

如果到目前为止都没有问题,那么后面的工作将易如反掌。

我们实现的应用程序是一个图像分类程序,它能够识别ImageNet中1000个类别的图像。

现在,要运行我们的应用程序,请执行以下两个步骤:

将模型文件添加到工程中

程序会引用手机目录android/tfmobile/assets下的graph.pb 和label.txt文件,而不再是rounded_graph.pb 和 retrained_labels.txt文件 现在,用以下命令替换文件,或者你可以手动更改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp tf_files/rounded_graph.pb android/tfmobile/assets/graph.pb
cp tf_files/retrained_labels.txt android/tfmobile/assets/labels.txt

更改ClassifierActivity.java文件中的"output_name"

模型的输出节点有不同的名字:"final_result"。打开ClassifierActivity.java文件,按照如下方法更改output_name变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static final String INPUT_NAME = "input";
private static final String OUTPUT_NAME = "final_result";

再试一遍,现在应该就可以正常运行了。

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

本文分享自 AI科技大本营 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用腾讯云对象存储最低成本搭建静态网站
前期准备 准备:域名,对象存储COS存储桶,SSL证书及CDN 准备内容 域名,很简单,在腾讯云直接注册即可:https://cloud.tencent.com/act COS对象存储:https:/
Ar-Sr-Na
2020/06/09
7K0
使用腾讯云对象存储最低成本搭建静态网站
使用对象存储最低成本搭建静态网站
前期准备 准备:域名,对象存储COS存储桶,SSL证书及CDN ---- 准备内容 域名,很简单,在腾讯云直接注册即可:https://cloud.tencent.com/act COS对象存储:ht
Ar-Sr-Na
2020/05/31
9.9K1
使用对象存储最低成本搭建静态网站
使用腾讯云对象存储搭建图床
平常在学习一些东西或者研究一些东西的时候会整理一下然后发到博客网站上,然后编辑时候一般使用的都是markdown格式,然后图片的存储有时候就很闹心,开始用的公共图床,但是没几天不是图片失效了就是图床网站倒闭了,然后现在很多网站都加限制防外链的。就想着自己搭建个图床,费用不高,可玩性较高,最主要资源自主管控,没有那么多限制。
愷龍
2023/02/26
6.7K0
使用腾讯云对象存储搭建图床
使用腾讯云 CDN 与腾讯云 COS 服务托管静态网站
注:本文以国内的 COS 存储桶为例,请准备好一个已经备案了的域名,否则将无法自定义域名以及无法使用腾讯云 CDN 服务
猫猫摸大鱼
2022/06/19
27K1
使用腾讯云 CDN 与腾讯云 COS 服务托管静态网站
新版微擎框架对接轻量对象存储LighthouseCOS
本次课程为小白基础课程,从服务器购买到微擎框架安装和对接轻量对象存储等一系列的教程。可能会有点长,请耐心阅读。
快乐的小白
2024/02/18
2830
新版微擎框架对接轻量对象存储LighthouseCOS
腾讯云对象存储
  对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
别团等shy哥发育
2023/02/25
58.3K2
腾讯云对象存储
腾讯云存储最佳实践系列一:使用对象存储COS托管静态网站
腾讯云开发者社区
2017/12/27
7.9K1
腾讯云存储最佳实践系列一:使用对象存储COS托管静态网站
如何使用对象存储 COS ?七个步骤,帮你搞定!
腾讯云对象存储 COS(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务,用户可通过网络随时存储和查看数据。同时为用户提供了高数据持久性、高可用性、高性能的对象存储服务。
云存储
2022/02/25
9K0
如何使用对象存储 COS ?七个步骤,帮你搞定!
拿什么记录下这魔幻又真实的一年
当这一年还剩下最后不到一个星期,我们试图将阳光、洪水、暴乱、疫情、蝗灾、山火、贫困拼接成一幅游牧的画卷。虽然这些碎片并不能构成一幅完整的地图。
云存储
2020/12/30
5790
拿什么记录下这魔幻又真实的一年
玩转腾讯云CDN
加速区域选择为中国境内或全球时,需要先完成 ICP 备案,若您的域名尚未完成 ICP 备案,您可以使用腾讯云网站备案。
杜志强
2021/07/25
11.2K0
玩转腾讯云CDN
【对象存储COS】使用COS自动数据备份,解放硬盘空间
视频,照片,录音......诸如此类的文件在手机电脑里,永远是不断增多,不断占用的东西,每次空间告急时,都要花一大片时间去整理,删除照片释放这宝贵的空间,“这个删,这个删不删呢?可能以后要用......”,挑选照片还真是一个费时费力还费心的活。
Ar-Sr-Na
2024/06/03
2810
使用腾讯云对象存储 COS + PicGo 搭建图床服务
平时写博客记笔记大都是使用 markdown 编辑器 ,插入图片时默认保存在电脑本地磁盘。如果需要在多个平台上发布文章,就要分别多次上传图片,非常繁琐。所以需要一种更好的图片管理方案,就是使用图床服务。将图片文件上传到图床并得到一个 url 地址,就可以方便的分享图片了。
昆吾kw
2022/08/05
6.4K0
Docsify+腾讯云对象存储 COS,一键搭建云上静态博客
最近一直在想如何利用 COS 简化静态博客的搭建过程。搜了很多的静态博客搭建过程,发现大部分的静态博客都要通过编译才能生成静态页面。功夫不负有心人,终于让我找到了一个超简洁博客的搭建方法。
云存储
2020/12/03
2.3K0
WordPress使用腾讯云对象存储COS进行静态资源CDN加速
个人博客目前使用的腾讯云服务器只有1M带宽,如果文章里图片多一些的话加载速度会明显变慢,解决这个问题除了升级带宽最好的办法就是将博客进行动静分离来加速图片加载。今天将博客使用腾讯云对象存储COS进行静态资源CDN加速布置方法写出来,做一个简单的教程,给需要的朋友参考。
聚优云惠
2019/12/25
5.9K0
【腾讯云轻量对象存储“用户实践”征文】腾讯云轻量对象存储LighthouseCOS 实践体验:简单高效的数据存储解决方案
摘要:本文将介绍分享关于LighthouseCOS的功能和特点,并分享用户在实践中的体验,因为LighthouseCOS作为一种简单高效的数据存储解决方案,为用户提供了可靠、安全和易用的云端存储服务,值得一用。
三掌柜
2024/02/23
2723
【腾讯云轻量对象存储“用户实践”征文】腾讯云轻量对象存储LighthouseCOS 实践体验:简单高效的数据存储解决方案
对象存储COS-防盗刷指引
近年来,越来越多的用户在搭建网站或图床时将图片视频等资源上传到对象存储COS,提升了访问稳定性的同时降低了服务器的存储空间压力,但随之而来的流量盗刷、图片盗链问题也困扰着不少开发者,一旦存储空间被恶意访问,会产生高额的流量费用,产生不必要的纠纷。这类问题实际上可以通过多种手段来防护,本文将主要介绍一些常见的防护手段,帮助开发者合理配置存储桶,建立安全机制,降低因类似问题带来的大额资金损失的风险。
云存储
2023/09/22
1.8K0
对象存储COS-防盗刷指引
【玩转腾讯云】我的typecho上云历程
PS:这次记录时间比较长,大家有兴趣的可以看完整篇文章并提出点建议,这篇文章是我多次碰壁而得来的,也希望大家不要那啥我,哈哈
勤奋的思远
2021/04/05
9.9K2
【玩转腾讯云】我的typecho上云历程
一文带你玩转对象存储COS文档预览
随着“互联网+”的发展,各行各业纷纷“去纸化”,商务合同、会议纪要、组织公文、商品图片、培训视频、学习课件、随堂讲义等电子文档无处不在。而要查看文档一般需要先下载,但动辄几十上百兆的文档下载费时,如果不下载,大部分软件的预览兼容性差,和原文档内容相差甚远。若是同时查看多种不同格式的文档,还要先下载对应的阅读器,再频繁更换阅读器进行文档阅读,影响用户使用和工作进度。
云存储
2020/11/18
2.7K0
一文带你玩转对象存储COS文档预览
基于腾讯云的个人网站架构
本文介绍如何基于腾讯云的各种云产品优雅地搭建个人网站,涉及的云产品有云服务器、SSL、企业邮箱、对象存储、CDN、云函数、API网关、云监控等。
zhayujie
2020/06/17
5.2K0
基于腾讯云的个人网站架构
如何快速实现内容分发网络切换到腾讯云CDN
内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免网络拥堵、地域、运营商等因素带来的访问延迟问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
Charlie Huston
2020/05/14
7K0
如何快速实现内容分发网络切换到腾讯云CDN
推荐阅读
相关推荐
使用腾讯云对象存储最低成本搭建静态网站
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验