翻译 | 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)。

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

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

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

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

tf_files/retrained_graph.pb

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

tf_files/retrained_labels.txt

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

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

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"

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

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使用如下指令

python -m scripts/label_image \  --graph=tf_files/retrained_graph.pb\--image=tf_files/flower_photos/daisy/3475870145_685a19116d.jpg

optimized_graph.pb使用如下指令

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脚本来对网络结构进行量化:

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

然后对模型进行压缩:

gzip -c tf_files/rounded_graph.pb > tf_files/rounded_graph.pb.gzgzip -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的文件,其中包含以下内容:

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示例中的数据文件夹中:

mkdir -p ~/graphscurl -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/inception5hcp ~/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)。如果你想运行示例代码,那么可以执行下面的命令:

cd tensorflow/examples/ios/simplepod installopen 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文件
现在,用以下命令替换文件,或者你可以手动更改

cp tf_files/rounded_graph.pb android/tfmobile/assets/graph.pbcp tf_files/retrained_labels.txt android/tfmobile/assets/labels.txt

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

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

private static final String INPUT_NAME = "input";private static final String OUTPUT_NAME = "final_result";

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

招聘

新一年,AI科技大本营的目标更加明确,有更多的想法需要落地,不过目前对于营长来说是“现实跟不上灵魂的脚步”,因为缺人~~

所以,AI科技大本营要壮大队伍了,现招聘AI记者和资深编译,有意者请将简历投至:gulei@csdn.net,期待你的加入!

如果你暂时不能加入营长的队伍,也欢迎与营长分享你的精彩文章,投稿邮箱:suiling@csdn.net

如果以上两者你都参与不了,那就加入AI科技大本营的读者群,成为营长的真爱粉儿吧!后台回复:读者群,加入营长的大家庭,添加营长请备注自己的姓名,研究方向,营长邀请你入群。



☟☟☟点击 | 阅读原文 | 查看更多精彩内容

教程 | 如何在手机上使用TensorFlow相关推荐

  1. 如何在手机上使用TensorFlow

    翻译 | AI科技大本营 参与 | zzq 审校 | reason_W 我们知道,TensorFlow是一个深度学习框架,它通常用来在服务器上训练需要大量数据的大模型.随着智能手机的普及,人们也越来越 ...

  2. 苹果手机上运行python_Python新手入门教程_在手机上就能学习编程的软件

    Python新手入门教程_在手机上就能学习编程的软件 很多小伙伴会问:我在学编程,想利用坐地铁坐公交吃饭间隙学编程,在手机上能学编程的软件有哪些?毕竟时间宝贵啊!!哈哈哈!!! 这个问题,在悟空回答的 ...

  3. python 手机编程termux_Python新手入门教程_在手机上就能学习编程的软件

    Python新手入门教程_在手机上就能学习编程的软件 很多小伙伴会问:我在学编程,想利用坐地铁坐公交吃饭间隙学编程,在手机上能学编程的软件有哪些?毕竟时间宝贵啊!!哈哈哈!!! 这个问题,在悟空回答的 ...

  4. python手机开发的软件_Python新手入门教程_在手机上就能学习编程的软件

    Python新手入门教程_在手机上就能学习编程的软件 很多小伙伴会问:我在学编程,想利用坐地铁坐公交吃饭间隙学编程,在手机上能学编程的软件有哪些?毕竟时间宝贵啊!!哈哈哈!!! 这个问题,在悟空回答的 ...

  5. axure文件如何加密_Axure share APP使用教程——如何在手机上演示axure文件

    编辑导读:作为一名产品经理,怎么能不会用Axure呢?今天作者和大家分享Axure share APP的使用方法,包括安装.注册.登录.下载原型以及在手机端预览原型的效果.一起来文中看一下吧~ 一.什 ...

  6. python手机运行器_MobileNet教程:用TensorFlow搭建在手机上运行的图像分类器

    王瀚宸 编译自 Hackernoon 量子位 报道 | 公众号 QbitAI 在移动端本地运行神经网络成了明显的趋势,Google还为此推出了MobileNet框架. MobileNet框架怎么用?C ...

  7. SAP UI5 应用开发教程之五十一 - 如何使用 Chrome 调试运行在手机上的 SAP UI5 Cordova 混合应用试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  8. SAP UI5 应用开发教程之五十一 - 如何使用 Chrome 调试运行在手机上的 SAP UI5 Cordova 混合应用

    本教程的前一步骤,我们介绍了如何使用 Cordova 将已经开发好的,能够在 PC 端运行的 SAP UI5 应用,构建并打包成 apk 文件,以便像 Android 原生应用一样,安装到安卓移动设备 ...

  9. SAP UI5 应用开发教程之四十九 - 如何在桌面电脑端调试运行在手机上的 SAP UI5 应用试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. mysql engine innodb myisam 区别
  2. python any()和all()用法
  3. 搭建Linux0.11系统环境
  4. 【bzoj3866】The Romantic Hero dp
  5. Java并发编程系列之CyclicBarrier详解
  6. 正则表达式与python re
  7. 涉嫌抄袭!致歉,抖音Semi Design承认参考阿里Ant Design
  8. OFD电子文档阅读器功能说明
  9. web前端网页制作课作业:使用HTML+CSS技术制作中华传统文化网站【文房四宝】学生网页设计作品 简单静态HTML网页作品
  10. 证件照换背景-----ps
  11. 麒麟Linux启动目录,优麒麟目录结构介绍 系统入门必备
  12. 十年前与十年后的我们,流着泪看完的经典语录!
  13. 使用JavaScript删除HTML元素
  14. 【gitHubDailyShare】深度学习论文精读
  15. linux-redis设置密码
  16. 解决浏览器被好123劫持主页的问题。
  17. 操作成功的提示信息动态添加
  18. 医疗大数据的发展现状与应用
  19. アプリケーションコンポーネント(大分類)
  20. C语言 关于素数的程序

热门文章

  1. Python常用库使用笔记
  2. Linux下修改mysql的root密码后数据库消失怎么处理
  3. python-Django-01基础配置
  4. MAC 重置MySQL root 密码
  5. jenkins-svn配置
  6. Elasticsearch——Rest API中的常用用法
  7. hdu 4366 Card Collector (容斥原理)
  8. 【组队学习】【33期】数据可视化(Matplotlib)
  9. 【青少年编程】【答疑】控制Scratch异步代码的执行顺序
  10. 刻意练习:LeetCode实战 -- Task14. 最长公共前缀