深度神经网络与TensorFlow Lite在移动设备上的应用

深度神经网络(DNN)在图像分类和其他类型的自动分类任务中表现出色。十年前,这些成果需要数百万的研究经费和计算能力,而现在,任何拥有半体面的GPU的人都可以轻松获得。然而,尝试在移动设备上运行DNN时可能会遇到一些缺点。如果使用传统代码实现,DNN可能会在移动设备上消耗大量处理器资源并且运行缓慢。幸运的是,TensorFlow Lite提供了一种解决方案,可以将DNN缩小规模,使其在移动设备上运行更加流畅。

DNN是实现人工智能的众多方法之一。神经网络是模仿生物实体(基于生物实体设计技术和过程)的AI方法之一。DNN基于神经元。生物神经元是相互连接的,可能会对来自环境的外部刺激或来自其他神经元的刺激做出反应,并刺激它们连接的其他神经元。软件神经元类似,它们的外部刺激来自保存的数据或来自相机和麦克风等传感设备。

软件神经网络的实现方式和连接形成值得单独讨论。如果想了解更详细的信息,请查看《AI:神经网络初学者》。简而言之,单个软件神经元(或节点)有多个输入,接受一些数值,对于每个输入,该值会乘以某个数字,并加上一个基础值。所有这些输入的结果加在一起,并通过激活函数传递,以决定神经元将输出什么值。这些不同的神经元相互连接以传递信息。这些神经元的集体配置被称为模型。对于单个神经元,涉及许多数学运算。对于一个完整的神经网络模型,可能涉及数千个相互连接的神经元。

典型的计算机处理器可以快速执行顺序操作。但即使是多核CPU,在并行操作的数量上也极其有限,与GPU相比。GPU旨在一次性执行大量向量的数学运算。这对于高性能的3D渲染和训练神经网络是必要的。CPU非常快,但并不是进行3D渲染或训练神经网络所需要的。

GPU旨在执行大量并行操作,以便它们可以快速处理和显示构成视觉场景的形状和像素。GPU并不关心它们处理的数据的最终目的,但发现它们也可以用于更通用的计算。一些GPU现在还提供了用于执行通用计算的原生API。在移动设备上,巧妙地使用GPU可以显著加速神经网络的处理。除了GPU,现在还有专门为处理神经网络而设计的硬件。使用TensorFlow Lite,代码可以利用可用的硬件加速。

在深入研究Android上的神经网络之前,需要设置开发环境。可以从Windows、macOS或Linux进行开发。所有三个平台都有可用的软件:

对于手机开发和部署,将需要Android Studio。对于训练和转换网络,将需要Python 3.7+。Netron虽然不是绝对必要的,但在需要视觉检查保存的神经网络模型时非常有用。

安装完所有这些软件后,可以开始配置。由于将从命令行使用Python,希望将其安装位置添加到PATH变量中,以便不需要键入其完整路径即可使用它。

此外,还需要安装一些额外的Python库到环境。这些库可以很容易地使用命令行的PIP实用程序安装。想要安装的库包括:

numpy - 数值计算库,用于处理数组、线性代数等。 pip3 install numpy onnx-tf - 用于将网络模型从Open Neural Network Exchange格式转换。 pip3 install git+https://github.com/onnx/onnx-tensorflow.git tensorflow - 用于创建或使用神经网络模型。 For Windows and Linux with GPU support: pip3 install tensorflow For Windows, Linux, and maxOS: pip3 install tensorflow-gpu tensorflow_addons pip3 install tensorflow_addons

对于Tensorflow,有多种安装选项。默认情况下,将安装一个兼容版本的tensorflow。兼容版本虽然不是最快的,但可以在最广泛的硬件上工作。如果计算机有一个支持某些向量操作指令的处理器,那么TensorFlow将打印一条消息,告知计算机支持可以用于提高性能的选项。

如果计算机有一个支持的图形适配器,还可以安装一个支持GPU的TensorFlow版本。在撰写本文时,NVIDIA的CUDA启用GPU是支持的显卡系列。如果有一个兼容的显卡并想使用GPU加速版本的TensorFlow,可以使用以下命令安装它:

pip3 install tensorflow-cpu

Android Studio还必须配置为使用NDK进行本地代码编译。不需要自己编写任何本地代码,但TensorFlow LiteAndroid库依赖于此。要安装NDK,请打开Tools菜单并选择SDK Manager。在SDK Tools标签下有一个名为NDK(Side by side)的项目。选择这个将导致最新版本的NDK安装。TensorFlow Lite经常更新。要安装使用的版本(21.0.6113669),请勾选右下角的Show Package Details复选框。选中后,展开NDK(Side by side)以查看NDK版本。

在选择SDK版本并点击OK后,Android Studio将下载并安装组件。下载完成后,通过创建一个新的Android项目并向其中添加TensorFlow引用来测试正确的NDK版本是否存在。在Android Studio中,打开文件菜单并选择New Project。选择Empty Activity并接受此项目的默认设置。点击Finish。

在项目的build.gradle文件的依赖部分,添加以下行:

implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'

然后构建项目。如果一切顺利,项目将编译。如果NDK要求发生了变化,应该会收到一个错误,指出找不到所需的NDK版本,并且还提供了所需的版本。如果遇到这种情况,请打开SDK管理器并选择错误识别的NDK版本。

作为Python和TensorFlow安装的测试,让制作一个使用TensorFlow的快速应用程序。对于这个应用程序,TensorFlow将获得一系列数字及其相关输出,并且必须弄清楚它们之间的关系。对于这个测试,数字将具有线性关系。输入值将是2, 5, 10, 12, 24, 32, 66, 100。输出值将是5, 14, 29, 35, 71, 95, 197, 299。发现这类数字集之间的关系被称为线性回归。在这段代码中,创建了一个简单的网络来学习这种关系,然后计算测试值7的输出:

import tensorflow as tf print(tf.__version__) # 这是训练数据 training_x = [2, 5, 10, 12, 24, 32, 66, 100] training_y = [5, 14, 29, 35, 71, 95, 197, 299] # 构建将被训练的网络 layer0 = tf.keras.layers.Dense(units=1, input_shape=[1]) model = tf.keras.Sequential([layer0]) # 编译网络 model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(1)) # 训练 history=model.fit(training_x, training_y, epochs=1000, verbose=False) # 显示网络权重 weights = layer0.get_weights() print('weight: {} bias: {}'.format(weights[0], weights[1])) # 尝试预测 print(model.predict([7]))

将此程序保存在名为regression.py的文件中。要运行程序,请从终端运行以下命令:

python3 regression.py

当此程序运行时,TensorFlow将运行其训练周期,然后打印输入值为7的输出。

weight: [[3.]] bias: [-1.000001] [[20.]]
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485