用iOS的ML(机器学习)创建自己的AI App
@TOC
推荐超级课程:
在机器学习中,一切都始于模型,这是进行预测或识别的系统。教计算机学习涉及使用训练数据的机器学习算法进行学习。从训练中生成的输出通常称为机器学习模型。有不同类型的机器学习模型来解决同一个问题(例如对象识别),但使用不同的算法。神经网络 , 树集成 , 支持向量机(SVM) 是其中一些机器学习算法。
机器学习如同迭代过程
首先,我们尝试使用公共模型,但为了带来独特的市场价值和优势,我们希望我们的模型能胜过其他模型。我们在寻找的是所谓的ML反馈循环。谷歌在其ML功能中遵循以下模式:
- 获取初始数据(一次性)
- — — — — —
- 对数据进行标记
- 训练模型
- 测试模型
- 将模型投入生产运行
- 获取新数据(并重复)
现在,对于一个移动应用程序,流程看起来像是:
在上图中,移动应用程序似乎使用了由ML创建的模型,但是它是如何工作的?是的,这里就是Core ML发挥作用的地方。
CoreML 的使用方法?
Core ML 是苹果的一种新的机器学习框架。它将机器学习模型带到苹果设备上,并让开发者能够轻松利用机器学习。我们可以使用苹果准备的十几种模型,或者从流行的ML框架(比如Keras ,Caffe 或 scikit-learn )中转换开源模型。
使用 CoreML 创建IOS应用程序的工作流程如下:
1- 您需要使用如Caffe、turi、Keras等ML框架创建一个数据模型。
2- 安装名为Core ML Tools的Python框架,将数据模型转换为Core ML格式。此转换的结果将是一个带有mlmodel扩展的文件。
3- 就是这样,您可以使用Core ML Tools创建的模型,并将其用于您的移动应用程序。
软件要求
为了训练模型,我们需要一个ML框架。最流行的是由Google开发的Tensorflow 。它受到社区最好的支持,并拥有大量的教程和开发者的关注。然而,当您深入了解时,您可能会最终发现自己在Github 问题页面 或堆栈溢出上处理一些数学问题或未记录的代码。与Web应用程序或移动开发相比,ML仍处于婴儿阶段,作为开发者,您需要准备好面对这些。建议您留出额外的时间来探索ML的神秘之处。开始使用高级库如Keras 或许更容易。您可以在文章结尾处查看一些训练教程的链接。
Tensorflow 和 Keras 是最常见的ML库之一
硬件
许多人说我们需要一个GPU来训练模型。对于需要高精度或进行一些网络架构调整的项目来说这是正确的。如果我们需要一个包含10个类别的图像分类器,那么我们可以利用迁移学习,在标准CPU上对我们的模型进行10分钟的微调。然而,对于真实的生产应用,我们通常需要GPU的性能。我们已经尝试了几家云服务提供商,亚马逊AWS的g2.2xlarge实例是一个不错的选择。
开始吧!!
到目前为止,您已经知道了使用机器学习创建IOS应用所需的必要工具,那就开始吧!
构建管道:
要使用Core ML工具,第一步是在您的Mac上安装Python。首先,下载Anaconda (选择Python 2.7版本)。Anaconda是一种在Mac上运行Python而不会出现问题的超级简单方式。安装Anaconda后,请转到终端并输入以下命令:
conda install python=2.7.13conda update python
接下来是创建一个虚拟环境。在虚拟环境中,您可以使用不同版本的Python或包来编写程序。要创建一个新的虚拟环境,请输入以下命令。
conda create --name handwriting
当终端提示您时,
proceed ([y]/n)?
输入“y”以确认。恭喜!现在,您有一个名为handwriting的虚拟环境!
要激活此环境,请使用:source activate handwriting
最后,请输入以下命令以安装Core ML工具和Kera的依赖项:
conda install pandas matplotlib jupyter notebook scipy opencv
pip install -U scikit-learn==0.15
pip install -U coremltools
pip install tensorflow==1.1
pip install keras==2.0.6
pip install h5py
设计和训练网络
在本文中,我将使用Kera作为我们示例的ML框架。
好的,您应该创建一个名为train.py
的Python文件。在train.py
中,插入以下代码:
- 首先让我们导入一些必要的库,并确保Keras后端是TensorFlow:
import numpy as np
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.utils import np_utils
# (确保)将后端设置为tensorflow
from keras import backend as K
K.set_image_dim_ordering('tf')
- 接下来,让我们为训练和测试准备数据集。
# 定义一些变量
num_rows = 28
num_cols = 28
num_channels = 1
num_classes = 10
# 导入数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], num_rows, num_cols, num_channels).astype(np.float32) / 255
X_test = X_test.reshape(X_test.shape[0], num_rows, num_cols, num_channels).astype(np.float32) / 255
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
- 设计用于训练的模型。
# 模型
model = Sequential()
model.add(Conv2D(32, (5, 5), input_shape=(28, 28, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(128, (1, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
- 训练模型。
# 训练
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=200, verbose=2)
- 通过移除退出层准备模型进行推断。
# 准备模型以进行推断
for k in model.layers:
if type(k) is keras.layers.Dropout:
model.layers.remove(k)
- 最后保存模型。
model.save('handWritten.h5')
然后,转到之前打开的终端,输入以下命令:
python train.py
它会创建一个名为handWritten.h5的经过训练的数据模型。
Keras 转 CoreML
要将您的模型从Keras转换为CoreML,我们需要执行更多的附加步骤。我们的深度学习模型需要一个28×28的归一化灰度图像,输出类别预测的概率。此外,让我们为我们的模型添加更多信息,如许可证、作者等。我们创建一个名为convert.py
的文件,并插入以下代码:
import coremltools
output_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
scale = 1/255.
coreml_model = coremltools.converters.keras.convert('./handWritten.h5',
input_names='image',
image_input_names='image',
output_names='output',
class_labels= output_labels,
image_scale=scale)
coreml_model.author = 'Gerardo Lopez Falcon'
coreml_model.license = 'MIT'
coreml_model.short_description = 'Model to classify hand written digit'
coreml_model.input_description['image'] = 'Grayscale image of hand written digit'
coreml_model.output_description['output'] = 'Predicted digit'
coreml_model.save('handWritten.mlmodel')
回到终端,输入以下内容:python convert.py
。它会为我们创建一个名为handWritten.mlmodel的文件(现在,我们可以在IOS应用程序中使用此文件)。
将模型集成到 Xcode 中
现在我们来到了将我们刚刚转换的模型集成到Xcode项目的最后一步。打开初始项目 ,根据您迄今为止所学的内容,我挑战您将Core ML模型集成到应用程序中。
第一步是将handWritten.mlmodel
拖放到我们的Xcode项目中。确保目标成员资格的框已被选中。
现在,进入视图控制器下面,实例化IBOutlet,并从handWritten类型创建一个对象:
let model = handWritten()
然后,进入tappedDetect函数,插入以下内容:
let output = try? model.prediction(image: pixelBuffer!)
我们刚刚定义了常量prediction等于模型预测的数据。
这就是全部!构建并运行应用程序。这是在iPhone 7上测试时应用程序的结果。
结论
现在,您了解了如何转换数据模型,您可能会想知道从何处获取数据模型。通过简单的Google搜索,您就可以找到大量结果。您几乎可以找到几乎任何类别的数据模型,例如不同类型的汽车、植物、动物,甚至能告诉您与哪位名人最像的模型。以下是一些开始的地方!
如果找不到符合您需求的模型,您可能会想知道是否可以创建自己的数据模型。虽然可以做到,但这可能是困难的。如果您觉得您能应对这个挑战,我建议您从访问它们的主页开始,使用Scikit-Learn或TensorFlow。
感谢您分享这篇文章,如果您愿意与他人分享这篇文章,我会很感激。同时,我希望您点赞 :D