window 下 Android studio 上运行tensorflow
1.开发环境
- win10 x64 操作系统
- Android 的 IDE : Android Studio
2.问题描述
- 网上大多数教程,都是基于 Linux 的开发,对于window上使用tensorflow的描述较少
- 大部分教程都是使用 bazel 来将tensorflow的源文件编译成so,jar文件,貌似这个工具对于Linux的支持还是不错的(但暂时不支持Linux 32的操作),但是对window就相对不太友好 ,而且整个过程复杂,本文不会采取这种方法
3.基本知识
3.1 tensorflow
TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
—来自百度百科
3.2. Android studio
Android Studio 是一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse
ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。
—来自百度百科
记得你的Android studio中一定要安装SDK和NDK
4.怎么做
其实很简单,网上教程太复杂了,其实一行代码就能解决,再编译一下的工程,你的Android studio 就有了tensorflow的接口
//加入这一行代码就可以,编译之后我们的Android项目就可以使用tensorflow接口
//不需要Bazle之类的工具,进行一系列的操作
compile 'org.tensorflow:tensorflow-android:+'
5.测试
5.1首先写一个简单的python代码
"""
开发时间:2018.6.17
模型作用:简单的矩阵想加
目的:测试Android中tensorflow是否可用
"""
import tensorflow as tf
# 1.注意这里面的 name 很重要,我们给这个tensorflow模型喂值就靠 name !!!
first = tf.constant([1,2],dtype=tf.float32,name="input")
# 就是测试简单的矩阵想加
result = tf.add(first,first,name="output")
# 2.开启一个Session
sess = tf.Session()
sess.run(tf.initialize_all_variables())
# 3.这几行代码就是把当前的模型保存为PB文件,PB文件会保存当前tensorflow的模型,将其他值固化为常量
# 第一个参数 sess指定为当前的Session,第二个参数是要保存的 图的定义,默认是当前图,然后是要输出的节点
output_graph_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def,
output_node_names=['output'])
# 这里是选择要保存的位置
with tf.gfile.FastGFile('F:/android_tensorflow.pb', mode='wb') as f:
f.write(output_graph_def.SerializeToString())
# 运行以上代码就会在 你选择的对应的目录找打PB文件
5.2将生成的PB文件放在Androidstudio相应目录下
5.3 在Android中调用feed 并且运行
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//保存要输入和输出的结果
float[] inputs = new float[]{7,8}; //随机给定值看是否达到想加的效果
float[] outputs = new float[2];
// 这里是那个PB文件的绝对路径
String filename = "android_tensorflow.pb";
// 以那个PB文件创建一个tensorflow的接口
TensorFlowInferenceInterface tensorFlowInferenceInterface =
new TensorFlowInferenceInterface(getAssets(),filename);
//1.feed 参数, 第一个参数是 张量的名称 ,第二个是一个一维数组存放数据, 最后指定矩阵的维度,我这里是1行2列
tensorFlowInferenceInterface.feed("input",inputs,1,2);
//2.运行要输出的张量
tensorFlowInferenceInterface.run(new String[]{"output"});
//3.然后将结果获取到,保存在数组中,方便我们获取
tensorFlowInferenceInterface.fetch("output",outputs);
//然后你可以控制台打印出来,或者用textView等在Android界面显示出来,看有没有达到我们的效果,有没有显示两个矩阵的想加
Toast.makeText(this, String.valueOf(outputs[0])+":"+String.valueOf(outputs[1]),
Toast.LENGTH_LONG).show();
}
当我们把这个app下载到手机上就可以看到结果14.0 : 16.0
我们的Android项目中已经可以成功使用tensorflow的接口运行tensorflow模型