打造第一个自训练模型的Core ML应用

1. 介绍

Core ML是iOS11的新特性,赋予iOS App更多AI的能力,例如垃圾短信识别、Siri、人脸识别、场景识别等等,过去集成在iOS系统的AI能力终于通过Core ML开放给第三方开发者了。随后苹果在今年WWDC发布了Create ML,这个苹果自家人工智能模型训练平台,苹果人工智能生态系统正逐渐形成,今天我们就借着一个简单的Core ML应用简单窥探一下。

Core ML 是iOS系统中人工智能模型的运行环境,开发者可以将自己训练好的模型转换为mlmodel,然后就可以应用内调用模型进行分类或预测了,目前支持转换的模型有caffe、keras、scikit-learn等。至于Core ML的能耐本文也不详细介绍了,参考苹果自己封装的图像处理分析框架vision和NLP框架就知道了。

image.png

2. 准备工具

为了简单起见,数据处理和模型的训练本文使用Python编写,以下都是机器学习常用类库,均可通过pip install xxx安装。

模型训练工具:scikit-learn

数据处理:pandas

模型转换工具:linear_model

3. 生成数据

由于本文编写的只是一个demo,所以数据是本地随机生成的,生成脚本如下

import random
import pandas as pd
if __name__ == '__main__':
    params_count = 4
    params = []
    for i in range(params_count):
        params.append(random.random())
    df = pd.DataFrame(columns=['x1', 'x2', 'x3', 'y'])
    for i in range(10000):
        X = []
        for j in range(params_count - 1):
            X.append(random.randint(0, 100))
        y = sum([X[i] * params[i] for i in range(params_count - 1)])
        y += params[-1]
        line = X
        line.append(y)
        df.loc[i] = line
    df.to_csv('random_data.txt', index=False, sep=',')
    print('params = %s\n'%(','.join(map(str, params))))

4. 训练模型

我们将生成的数据分为训练数据和测试数据,对于训练数据,我们用最简单的线性回归模型训练,训练过程中我们用交叉数据验证下模型的准确率,最后保存到文件中,代码如下:

from sklearn.cross_validation import KFold
import pandas as pd
from sklearn import linear_model
import numpy as np
from sklearn.externals import joblib
if __name__ == '__main__':
    train_data = pd.read_table('random_train_data.txt', sep=',')
    X_train = train_data.ix[:, [0, 1, 2]]
    y_train = train_data[['y']]
    kf = KFold(y_train.shape[0], n_folds=5)
    residuals, scores = [], []
    for train_index, test_index in kf:
        clf = linear_model.LinearRegression()
        clf.fit(X_train.iloc[train_index, :], y_train.iloc[train_index, :])
        residual = np.mean(clf.predict(X_train.iloc[test_index, :]) - y_train.iloc[test_index, :]) ** 2
        print('Residual sum of squares = %.2f'%(residual))
        residuals.append(residual)
        score = clf.score(X_train.iloc[test_index, :], y_train.iloc[test_index, :])
        print('Score = %.2f'%(score))
        scores.append(score)
        print('\n')
    print('Mean Residual sum of squares = %.2f' % np.mean(residuals))
    print('Mean score = %.2f' % np.mean(scores))
    clf = linear_model.LinearRegression()
    clf.fit(X_train, train_data['y'])
    joblib.dump(clf, 'linear_regression.pkl')

5. 转换模型

我们得到scikit-learn模型后还不能直接在iOS中调用,需要经过苹果的工具coremltools进行转换,代码如下,关键是convert函数和save函数,其他都是关于模型的描述,可以不设置,可以说非常符合苹果API风格,简单易用。

import coremltools
from sklearn.externals import joblib
from sklearn import linear_model
if __name__ == '__main__':
    clf = joblib.load('linear_regression.pkl')
    coreml_model = coremltools.converters.sklearn.convert(clf, ["x1", "x2", "x3"], "y")
    coreml_model.author = "forrestlin"
    coreml_model.license = "BSD"
    coreml_model.input_description['x1'] = 'x1 in [0, 100)'
    coreml_model.input_description['x2'] = 'x2 in [0, 100)'
    coreml_model.input_description['x3'] = 'x3 in [0, 100)'
    coreml_model.output_description['y'] = 'result'
    coreml_model.save('linear_regression.mlmodel')

6. 应用模型

得到mlmodel文件后,我们可以直接将其拖入xcode工程中,选中模型文件会显示模型信息,如下图所示:

image.png

在导入模型后,xcode会自动生成模型类,以模型文件名为类名,创建模型实例后,我们调用prediction方法即可得到预测结果,十分简单,代码如下:

let linearRegression = linear_regression()
let x1 = Double.init(x1TextField.text ?? "0") ?? 0.0
let x2 = Double.init(x2TextFied.text ?? "0") ?? 0.0
let x3 = Double.init(x3TextField.text ?? "0") ?? 0.0
guard let resultOutput = try? linearRegression.prediction(x1: x1, x2: x2, x3: x3) else {
	fatalError("Unexpected runtime error.")
}
resultLabel.text = "预测结果:\(String.init(format: "%.3f", resultOutput.y))"

运行界面如下,由于是自己就是根据线性模型生成的数据,所以预测结果和真实结果完全一致,2333~

image.png

总结

demo虽小,但五脏俱全,希望以此打开苹果人工智能生态系统的大门,也希望对各位读者有用,App demo源码见附件。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

KNN算法实战-改进约会网站配对效果

kNN实战之改进约会网站配对效果 引言 简单的说,KNN算法采用测量不同特征值之间的距离方法进行分类。工作原理:存在一个样本数据集,即训练数据集,并且样本集中每...

597100
来自专栏企鹅号快讯

教你快速使用OpenCV/Python/dlib进行眨眼检测识别!

摘要: 图像识别的新思路:眼睛纵横比,看看大牛如果用这种思路玩转识别眨眼动作! ? 今天我们来使用面部标志和OpenCV 检测和计算视频流中的眨眼次数。为了构建...

805100
来自专栏AI研习社

手把手教你用Python 和 Scikit-learn 实现垃圾邮件过滤

文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注。目前,在机器学习模型的帮助...

40880
来自专栏机器之心

入门 | 无需基础知识,使用JavaScript构建你的第一个神经网络

选自ITNEXT 作者:Daniel Simmons 机器之心编译 参与:程耀彤、李泽南 随着新技术和新工具的出现,构建神经网络已不再是一件需要大量机器学习相关...

36550
来自专栏新智元

解决关系推理,从图网络入手!DeepMind图网络库开源了!

DeepMind提出的简单而强大的关系推理网络“graph network”终于开源了!

68620
来自专栏AI研习社

实例+代码,你还怕不会构建深度学习的代码搜索库吗?

本文展示了一个端到端的实例,说明如何构建一个可以语义化搜索对象的系统。项目作者是 Hamel Husain (https://www.linkedin.com/...

8930
来自专栏机器之心

KDD2018 | 电商搜索场景中的强化排序学习:形式化、理论分析以及应用

(1)对电商搜索场景中的多步排序问题进行形式化描述,定义搜索会话马尔科夫决策过程问题模型(Search Session Markov Decision Proc...

26320
来自专栏新智元

旧照片着色修复神器!自注意力GAN效果惊艳

图像着色、图像增强、恢复旧图像等是计算机视觉领域的热点问题,不过,用一个模型很好地实现多个任务的研究不多。

12610
来自专栏大数据挖掘DT机器学习

用python实现K-近邻算法改进约会网站的配对效果

摘自:《机器学习实战》,用python编写的(需要matplotlib和numpy库)   海伦一直使用在线约会网站寻找合适自己的约会对象。尽管约会网站会推荐不...

32950
来自专栏MixLab科技+设计实验室

TensorFlow.js、迁移学习与AI产品创新之道

TensorFlow 的 JS 版本终于出啦,deeplearn.js 正式收编至 TensorFlow 项目,并改名为 TensorFlow.js : 采用 ...

48940

扫码关注云+社区

领取腾讯云代金券