iOS:使用 Core ML 进行机器学习初探

1.什么是机器学习?

从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。但从实践的意义上来说,机器学习是一种通过利用数据,训练出模型,然后使用模型预测的一种方法

与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习如何完成任务。这个过程跟人的学习过程有些类似,比如人获取一定的经验,可以对新问题进行预测。
举一个简单的例子:

一个人买西瓜买的多了,就会接受大量的西瓜数据

例如敲西瓜的声音、西瓜外皮颜色、纹路等

从而生成了一个西瓜模型(敲击声音清脆、纹路清晰、颜色鲜绿的瓜会比较甜)

下次遇到一个新的西瓜,这个人就可以通过西瓜模型来判断出这个瓜甜不甜。

通过大量的西瓜数据 + 大脑学习 = 西瓜模型

遇到一个新西瓜 + 西瓜模型 = 判断西瓜是不是甜的

2.训练模型工具(Creat ML)

在介绍使用 Core ML 之前,我们要先训练出上面所提到的模型

如果模型已经写好,你可以使用 coremltools Python 包将模型从第三方训练库(如 TensorFlow 和 PyTorch)转换为 Core ML。然后,你可以使用 Core ML 将模型集成到你的应用中。

或者用苹果官方的Creat ML训练出一个模型,Create ML 是苹果于2018年 WWDC 推出的生成机器学习模型的工具。它可以接收用户给定的数据,生成 iOS 开发中需要的机器学习模型(Core ML 模型)

接下来我将由训练一个情感语言分类模型开始,介绍模型的训练过程和如何将模型运用于工程中。

3.Core ML

3.1 训练模型

Xcode10以上已经集成了createML工具,只需要打开Xcode,左上角打开Open Develop Tool -> Create ML

打开后创建新模型,可以看到已经内置了许多模型类别,如图像分类、文字识别、手势分类、动作识别等

 选择图像分类并创建项目 

项目打开后可以看到主要有三类数据:训练数据、验证数据、测试数据
一般来说,只要你的数据足够多,App 会自动从 Training Data 中划分出一部分,作为 Validation Data,所以第二个显示为Automatic。当数据太少时,第二项不可用

所以一般我们选择第一项 Training Data 的文件夹,和 Testing Data 文件夹,前者是必须的,后者可以不添加,也能训练出模型,但是你无法快速知道训练出的模型在新数据上表现好不好而已

它的基本工作流程是:从 Training Data 中提取特征,然后在 Validation Data 中检测提取的对不对,对的保留,错的重新提取

为了简便这里只添加训练数据,这里的训练数据是两个文件夹中的文字,文件名会作为训练后的分类标签,文件夹内是已经分好类的心情语言

这个是我们的数据集(有点糊从App文档截图过来的)

两个文件名分别是积极(pos)和消极(neg),每个文件里面放了有关改心情的语句

比如积极:今天天气真好,我好开心

导入后点击training即可进行训练

训练后可以得到结果

训练完成后点击Preview可以测试一下模型

训练完成后点击output可以看到模型的相关信息

从上图可以看到,模型的输入数据为string类型的text,输出数据一种为string类型的Label,表示了识别概率最高的类型名字

点击导出按钮即可保存模型,其后缀为.mlmodel

至此,已完成了模型的生成,下面将进行iOS工程中的模型使用

3.2 使用模型

对于Xcode而言,已有的模型就相当于是一个库文件

你只需要将.mlmodel文件直接拖入项目导航栏,Xcode会自动为你生成模型API,只需要满足其输入数据要求即可获得结果

 请记住你的模型名字还有输入输出的类型,一会将会用到

别忘了  import CoreML

初始化器创建模型

let model = posNegClassify_1()  //后面是你的模型名字

获取要传递给模型的输入值

我的输入值是json文件导入,之后解析成了数组的形式。大体都是相似的,都是用Input方法

let input = posNegClassify_1Input(text: diaryData[indexPath].content)

传入的参一定要是你模型的输入类型 

使用模型进行预测

Mars类有一个生成的prediction(solarPanels:greenhouses:size:)方法,用于从模型的输入值中预测结果

guard let outdata = try? model.prediction(input: input) else{
    return
}

这样 outdata.label (不同模型不一样哦,这要看你之前模型设置输出的类型)就会得到结果啦,在我们的模型中我们可能会得到两种结果(也就是我们的文件名),分别是pos和neg

生成的prediction(input:)方法可能会引发错误。在使用 Core ML 时,遇到的最常见的错误类型是,输入数据的详细信息与模型预期的细节不匹配,所以一定要确定再确定好自己模型的输入输出类型

下面是这一块的完整代码,这里我们是为了完成一个心情曲线,如果消极心情就在当时的心情分数基础上减去50得到最后的分数

func getData(){
    handyJSON()
    for indexPath in 0...diaryData.count - 1  {
        let input = posNegClassify_1Input(text: diaryData[indexPath].content)
        guard let outdata = try? model.prediction(input: input) else{
            return
        }
        if(outdata.label == "neg"){
            diaryData[indexPath].index = diaryData[indexPath].index - 50
            print(diaryData[indexPath].index)
        }
            
        mood.append(diaryData[indexPath].index)
    }
}

最后结果呈现

这里的曲线使用第三方库画的,下篇博客会提到

4.关于已训练好的模型

在翻官网的时候我发现,苹果官网也提供了一些训练好的模型

(目前自己能找到的或者爬虫得到的数据集还是有限,做出来的东西准确率会有很大的问题,如果能用别人做好的模型在准确率上面应该会提高一个level)

(有兴趣可以看看)

还有一些第三方库的模型

5.其他平台模型工具介绍

(我自己也是个机器学习小白,下面这些也是为了做个笔记)

5.1 Tensor Flow
Tensor Flow是一个开源软件库,主要用于使用数据流图的数值计算。Google开发了Tensor Flow,以帮助将机器学习建立到自己的系统中,并辅助神经网络研究。研究人员发现,该系统可以适用于各种其他领域。Tensor Flow是一种高度可扩展的机器学习系统,适用于各种系统。

5.2 Torch
Torch是一种广泛使用的开源机器学习开发框架。它允许基于神经网络的算法在GPU硬件上运行,而不需要在硬件级别进行编码。Torch易于使用,而且高效,因简单、快速的脚本语言而受到青睐。Torch的目标是在构建科学算法时具有最大的灵活性和速度,而不会使过程变得困难,这个广泛的平台鼓励使用它的企业对应用进行创新。

5.3 H20
H20,也称为H20.ai,正在为全球最具影响力的一些公司开发关键任务数据产品。H20是世界上使用最广泛的开源深度学习平台。它被全球超过8万名数据科学家和研究人员以及超过9000家企业和组织所利用。H20提供基于Web的用户界面,同时可访问机器学习软件库,并开启机器学习。

5.4 MLib
MLib是Apache Spark的机器学习库,它包含常见的学习算法和实用程序,包括分类,回归,聚类,协同过滤,维数降低等。MLlib易于部署和运行在现有的数据集群上。

5.5 Caffe
Caffe支持广泛的代码使用。1000多名开发人员推动其发展,为机器学习做贡献。Caffe帮助学术研究项自,启动原型,以及视觉,语音和多媒体等大型工业应用。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>