1、9.2黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践nTensorFlow Lite1.转化训练好的模型为.tflite文件2.编写自定义操作代码3.TensorFlow lite 的移动端安卓开发4.TensorFlow lite 的移动端iOS开发nTensorFlow.js1.TensorFlow.js JavaScript 库引入2.TensorFlow.js 基础知识3.TensorFlow.js 示例9.3黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow Lite 是 TensorFlow 在移动或嵌
2、入式设备上的轻量级应用。TensorFlow Lite具有以下特点:(1)轻量级:允许载入训练好的模型(小二进制文件)以及模型快速初始化,启动设备端对预测数据进行推断。(2)跨平台:可以在不同的平台上运行,如支持的android和 iOS。(3)快速:专为移动设备进行优化,包括大幅提升模型加载时间,支持硬件加速。9.4黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow Lite 的体系结构,其组件包括:nTensorFlow 模型(TensorFlow Model):保存在磁盘中的训练模型nTensorFlow Lite 转化器(TensorFl
3、ow Lite Converter):将模型转换成 TensorFlow Lite 文件格式的项目 (.tflite)。nTensorFlow Lite 模型文件(TensorFlow Lite Model File):基于 FlatBuffers,适配最大速度和最小规模的模型。9.5黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践nTensorFlow Lite 使用步骤 9.6黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践转化模型为.tflite文件 在桌面PC或是服务器上使用TensorFlow训练出来的模型文件,不能直接用在
4、TensorFlow Lite上运行,需要先转成.tflite文件。转化模型为.tflite文件有两种方法,使用离线工具转成.tflite文件和直接在代码中通过代码直接生成.lite文件。n使用离线工具转成.tflite文件。1.在算法训练的程序中保存图模型文件(GraphDef)和变量文件(CheckPoint)。2.利用freeze_graph工具生成frozen的graphdef文件。3.利用toco工具,生成最终的tflite文件。n 9.7黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践转化模型为.tflite文件 n直接在代码中通过代码直接生成.lit
5、e文件9.8黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践编写自定义操作代码 如果TensorFlow 库没有需要的操作。可以采用Python 编写组合的操作来满足需要。如果Python 编写组合操作还满足不了需求,则使用C+创建自定义操作。用C+编写自定义操作代码包括注册新操作op,以及用C+实现步骤。注册新操作注册新操作op 通过注册定义一个新的操作op的接口interface到TensorFlow 系统。定义操作op名称、输入类型与名称、输出类型与名称,以及任何需要的属性。实现新操作实现新操作op 实现操作接口需要建立扩展 OpKernel 的类,并重载C
6、ompute方法。Compute方法提供参数指针OpKernelContext*,可以访问输入输出张量。9.9黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践移动端安卓开发n 利用Android Studio开发,Android studio安装n 从 G i t H u b 中 C l o n e T e n s o r F l o w :https:/ 建造Android Tensorflow lite Demo1.打开Android Studio,从欢迎窗口,选择“Open an existing Android Studio project”。2.从从 “
7、Open File or Project”窗口窗口,找到并选择找到并选择 clone 的的TensorFlow GitHub repo 中的中的tensorflow/examples/android,点击点击 OK.如果问如果问Gradle Sync,点击点击 OK.3.打开 build.gradle 文件,找到 Gradle Scripts 的 nativeBuildSystem 变量,并修改为 def nativeBuildSystem=none4.点击 Run 按钮(绿箭头)rebuild 项目 9.10黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践移动端
8、安卓开发n另外一种方式是利用Bazel 建APK,然后利用ADB上载到你的手机上。Bazel类似于make。bazel支持各种平台,安装参考官网安装教程,如Linux https:/docs.bazel.build/versions/master/install-ubuntu.html。nadb工具即Android Debug Bridge(安卓调试桥)tools。它就是一个命令行窗口,用于通过电脑端与模拟器设备交互。n下载sdk并解压到tensorflow根目录n更新SDKn安装NDK。下载并解压到tensorflow根目录;n修改workspace文件n连接android手机。首先安装ad
9、b:然后打开手机的开发者模式,开启USB调试,n编译并安装apk9.11黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践移动端iOS开发 CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods本身所支持的),并且可以轻松管理其版本。安装CocoaPods步骤如下:先更新gem:$sudo gem update system。更新gem 镜像资源:$gem sources-remove https:/rubygems.org/$gem sources-a
10、https:/gems.ruby-china.org/,最后,终端输入:$sudo gem install cocoapods。先建好自己的Xcode 代码的app或者demo(如examples/ios/camera)。在根目录中建文件“Podfile”,内容为:target YourProjectNamepod TensorFlow-experimental终端输入 pod install。Open YourProjectName.xcworkspace 9.12黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践移动端iOS开发自带的Samples Demo:D
11、emo 包括三个示例,simple,benchmark,和camera。切换到 tensorflow 目录,下载 Inception v1,以及提取 标签 和 图文件到数据目录:mkdir-p graphscurl-o graphs/inception5h.zip https:/ 如果下载不了,从https:/ graphs/inception5h.zip-d graphs/inception5hcp graphs/inception5h/*tensorflow/examples/ios/benchmark/data/cp graphs/inception5h/*tensorflow/exam
12、ples/ios/camera/data/cp graphs/inception5h/*tensorflow/examples/ios/simple/data/cd tensorflow/examples/ios/simplepod installopen tf_simple_example.xcworkspace#注意是 .xcworkspace,不是.xcodeproj 9.13黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js TensorFlow.js 是一个开源 JavaScript 库,用于训练和部署机器学习模型。TensorF
13、low.js 可用于新建模型、运行现有模型,重新训练模型。n在浏览器中创建模型在浏览器中创建模型 TensorFlow.js 的 API 灵活且直观,可以使用低级的 JavaScript 线性代数库和高级图层 API 在浏览器中定义、训练和运行完整的机器学习模型。n运行现有模型运行现有模型 TensorFlow.js 可导入现有的预先训练的模型进行推理。如果你有一个以前曾经脱机训练过的现有 TensorFlow 或 Keras 模型,则可以将其转换为 TensorFlow.js 格式,并将其加载到浏览器中进行预测。n重新调整现有模型重新调整现有模型 TensorFlow.js 可用于重新训练导
14、入的模型。使用浏览器中收集的少量数据进行离线培训。这是快速训练精确模型的一种方法。9.14黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js TensorFlow.js架构。TensorFlow.js包含支持低级API(以前称为deeplearn.js)和Eager执行。TensorFlow.js提供WebGL支持。TensorFlow.js支持导入TensorFlow SavedModels和Keras模型。9.15黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-JavaScrip
15、t 库引入script标签引入 是最为直接的方式,引入的地址为 https:/ 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-JavaScript 库引入nodejs 引入Node.js是运行在服务端的 JavaScript。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 是事件驱动、非阻塞式 I/O 的模型,故轻量、高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。从官网(http:/nodejs.org/)下载nodejs,直接点击就会自动下载安装 nodejs和npm
16、。安装 TensorFlow.js:npm install tensorflow/tfjs 为了在本地运行,需要安装yarn。在Nodejs环境下,通过sudo npm install-g yarn 命令进行全局安装。然后将核心代码下载到本地,然后进入项目目录如polynomial-regression-core(即多项式回归核心)部分,最后进行yarn安装并运行。$git clone https:/ tfjs-examples/polynomial-regression-core$yarn$yarn watch显示类似:Server running at http:/localhost:12
17、34,并自动启动浏览器。如自动启动的浏览器不行,可以启动Chrome 浏览器。9.17黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识n张量是Tensorflow.js中主要数据的表现形式。张量实例的构造函数就是 tf.tensor 函数。低维度张量也可用标量tf.scalar(零维,数值),tf.tensor1d(一维,向量),tf.tensor2d(二维,矩阵),tf.tensor3d(三维)、tf.tensor4d(四维)表示。/3x2 张量const shape=3,2;/张量形状,3 行,2列const a=tf.te
18、nsor(1.0,2.0,3.0,10.0,20.0,30.0,shape);a.print();/打印张量值/Output:1,2,/3,10,/20,30/张量形状也可以推断出来。const b=tf.tensor(1.0,2.0,3.0,10.0,20.0,30.0);b.print();/Output:1,2,3,/10,20,309.18黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识n变量(变量(Variables)const initialValues=tf.zeros(5);/一维张量,5 个0 元素const
19、biases=tf.variable(initialValues);/初始化偏置biases.print();/output:0,0,0,0,0const updatedValues=tf.tensor1d(0,1,0,1,0);biases.assign(updatedValues);/更新偏置值biases.print();/output:0,1,0,1,09.19黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识n操作(操作(Operations)张量是不可变的,但是通过操作可以操作张量返回一个新的张量张量是不可变的,但是通
20、过操作可以操作张量返回一个新的张量。Tensorflow.js支持链式操作,支持链式操作,如:如:const a=tf.tensor2d(2.0,2.0,2.0,2.0);const b=tf.tensor2d(1.0,1.0,1.0,1.0);const c=tf.tensor2d(3.0,3.0,3.0,3.0);const res=a.add(b).square().sub(c);res.print();/output 6,6/6,6即首先得到即首先得到a 加加 b,即即a.add(b),结果进行平方,即,结果进行平方,即square()(),然后结果再减然后结果再减c,即即sub(c)
21、。)。9.20黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识TensorFlow.js 有两种方法创建模型。一种是底层直接创建,有两种方法创建模型。一种是底层直接创建,function predict(input)/y=a*x 2+b*x+c return tf.tidy()=const x=tf.scalar(input);const ax2=a.mul(x.square();const bx=b.mul(x);const y=ax2.add(bx).add(c);return y;);/Define constants:y
22、=2x2+4x+8const a=tf.scalar(2);/标量,数值标量,数值2const b=tf.scalar(4);/标量,数值标量,数值4const c=tf.scalar(8);/标量,数值标量,数值8/Predict output for input of 2const result=predict(2);/调用调用predict 输入参数输入参数2 result.print()/输出输出t:24 9.21黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识n还有一种方法是利用高级 tf.model API创建,如创
23、建tf.sequential 模型:const model=tf.sequential();/顺序添加神经网络层模型model.add(/添加GRU神经网络层到模型 tf.layers.gru(units:20,returnSequences:true);model.add(/添加全连接神经网络层到模型,排在GRU后面 tf.layers.dense(units:20);const optimizer=tf.train.sgd(LEARNING_RATE);/优化器,随机梯度下降优化器pile(optimizer,loss:categoricalCrossentropy);/模型编译model
24、.fit(x:data,y:labels);/模型训练 9.22黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识n当应用使用了当应用使用了GPU,需要释放,需要释放GPU内存。释放内存。释放GPU内存方法有内存方法有 dispose 和和 tf.tidy。const x=tf.tensor2d(0.0,2.0,4.0,6.0);const y=tf.tensor2d(1.0,2.0,3.0,5.0);const z_add=x.add(y);x.dispose();y.dispose();z_add.dispose();n当有很
25、多当有很多Tensor操作时,使用操作时,使用 dispose 会写很多行代码。会写很多行代码。tf.tidy 的作用是的作用是清理了清理了tf.tidy作用域内创建的张量,作用域内创建的张量,但是它不会清理其最终的返回值。所以但是它不会清理其最终的返回值。所以tf.tidy可以释放可以释放GPU内存,但不会计算结果。内存,但不会计算结果。const average=tf.tidy()=const y=tf.tensor1d(1.0,2.0,3.0,4.0,5.0,6.0);const z=tf.ones(6);return y.sub(z).square().mean(););n tf.ke
26、ep的作用是在的作用是在 tf.tidy()内部保留张量不被清除。内部保留张量不被清除。tf.memory 返回当前返回当前程序的内存信息。程序的内存信息。9.23黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识n 保存模型使用保存模型使用 model.save函数。使用方法如以下代码所示:函数。使用方法如以下代码所示:const saveResult=await model.save(localstorage:/my-model-1);9.24黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践Ten
27、sorFlow.js-基础知识 装载模型使用装载模型使用 tf.Model函数。函数。9.25黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识n导入导入tensorflow 图模型到图模型到Tensorflow.jsntensorflow 图模型(一般是图模型(一般是Python环境训练)可以保存为以下格式环境训练)可以保存为以下格式:TensorFlow SavedModel,Frozen Model,Session Bundle,Tensorflow Hub module。这些格式都可以采用这些格式都可以采用TensorFl
28、ow.js转转换工具(源码在换工具(源码在https:/ 在在Python环境下环境下 pip install tensorflowjs9.26黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js-基础知识转换转换Python训练好的模型为训练好的模型为TensorFlow.js Web 格式格式n SavedModel 示例:tensorflowjs_converter -input_format=tf_saved_model -output_node_names=MobilenetV1/Predictions/Reshape_1 -sav
29、ed_model_tags=serve /mobilenet/saved_model /mobilenet/web_modelnFrozen model 示例:tensorflowjs_converter -input_format=tf_frozen_model -output_node_names=MobilenetV1/Predictions/Reshape_1 /mobilenet/frozen_model.pb /mobilenet/web_modelnSession bundle model 示例:tensorflowjs_converter -input_format=tf_se
30、ssion_bundle -output_node_names=MobilenetV1/Predictions/Reshape_1 /mobilenet/session_bundle /mobilenet/web_modelnTensorflow Hub module 示例:tensorflowjs_converter -input_format=tf_hub https:/tfhub.dev/google/imagenet/mobilenet_v1_100_224/classification/1 /mobilenet/web_model9.27黄理灿黄理灿 2019深度学习原理与深度学习原
31、理与Tensorflow实践实践TensorFlow.js-基础知识n导入转换后的模型,示例代码如下:导入转换后的模型,示例代码如下:const GOOGLE_CLOUD_STORAGE_DIR=https:/ MODEL_URL=mobilenet_v2_1.0_224/tensorflowjs_model.pb;const WEIGHTS_URL=mobilenet_v2_1.0_224/weights_manifest.json;const model=await tf.loadFrozenModel(GOOGLE_CLOUD_STORAGE_DIR+MODEL_URL,GOOGLE_C
32、LOUD_STORAGE_DIR+WEIGHTS_URL);const zeros=tf.zeros(1,224,224,3);model.predict(zeros).print();9.28黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js示例-数据拟合曲线n对于一个多项式函数的回归来说,通过训练模型来找到多项式的系数,并使利用这些系数的多项式产生的值与给定数据集值的误差最小。这里,我们使用TensorFlow.js来拟合训练数据并描绘出拟合曲线。这个示例的源码在下载的polynomial-regression-core 目录中。这里,
33、我们将源码的数据参数改为 a=-0.9,b=-0.28,c=0.81,d=0.58。9.29黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js示例-数据拟合曲线n数据产生代码 9.30黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js示例-数据拟合曲线n生成的数据生成的数据9.31黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js示例-数据拟合曲线n训练前的拟合曲线 9.32黄理灿黄理灿 2019深度学习原理与深度学习原理与Tenso
34、rflow实践实践TensorFlow.js示例-数据拟合曲线 训练迭代器SGD75次迭代之后,a、b、c以及d 已经比开始随机分配系数的结果拟合要好很多9.33黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js示例-卷积网络手写数字识别n TensorFlow.js 的卷积网手写数字识别的数据来源为MNIST handwriting dataset。$cd tfjs-examples/mnist-core$yarn$yarn watch启动浏览器9.34黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践Tens
35、orFlow.js示例-卷积网络手写数字识别n data.js 作用为处理数据n建立模型 model.js/Our actual model 模型function model(inputXs)const xs=inputXs.as4D(-1,IMAGE_SIZE,IMAGE_SIZE,1);const strides=2;const pad=0;/Conv 1 第一层卷积网 const layer1=tf.tidy()=return xs.conv2d(conv1Weights,1,same).relu().maxPool(2,2,strides,pad););/Conv 2 第二层卷积网 c
36、onst layer2=tf.tidy()=return layer1.conv2d(conv2Weights,1,same).relu().maxPool(2,2,strides,pad););/Final layer最后一层为全连接层 return layer2.as2D(-1,fullyConnectedWeights.shape0).matMul(fullyConnectedWeights).add(fullyConnectedBias);9.35黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js示例-卷积网络手写数字识别/Trai
37、n the model.训练网络export async function train(data,log)const returnCost=true;for(let i=0;i const batch=data.nextTrainBatch(BATCH_SIZE);return loss(batch.labels,model(batch.xs);,returnCost);log(loss$i:$cost.dataSync();await tf.nextFrame();/Predict the digit number from a batch of input images.预测函数expor
38、t function predict(x)const pred=tf.tidy()=const axis=1;return model(x).argMax(axis););return Array.from(pred.dataSync();/Given a logits or label vector,return the class indices.求分类索引值export function classesFromLabel(y)const axis=1;const pred=y.argMax(axis);return Array.from(pred.dataSync();9.36黄理灿黄理灿 2019深度学习原理与深度学习原理与Tensorflow实践实践TensorFlow.js示例-卷积网络手写数字识别n运行后结果第第章章 结束结束