机器学习之CreateML使用(一)

Apple 在WWDC2018上演示了CreateML的使用, 主要包括了图像识别, 文本分类等 ML 应用.

CreateML 是什么?

Apple 在iOS11开始支持 CoreML, 通过 mlModel 这种类型的文件, 编写 Swift 代码, 可以实现 ML 的各种功能, 比如图像识别, 文本分类, 语言翻译等. CreateML 就是一种便捷的框架, 用来快速训练出模型的框架.

如何使用 CreateML?

Mac环境: Xcode10, macOS Mojave, Swift
App运行环境: iOS12

制作一个数字的图片分类器

1. 准备数据:
数据: mnist数字集(训练集60000, 测试集10000).

2. 训练模型:

    1. 新建一个 macOS 的playgroud, 为什么一定要 macOS 下的, 因为 CreateML 的使用需要调用系统的支持, 比如GPU训练, 这也就是为什么 Apple 推出了 Mojave 的原因 .
    1. 编码, 点击运行
image.png

image.png

Max iterations: 迭代次数, 默认是10, 可以通过增加epoch, 来提高识别准确率, 但是epoch越多, 可能造成过拟合. 梯度不降反升等问题.
Augmentation: 增强, 下面的几个选项, 勾选的话, 一张图片会经过多次处理, 用于数据不足的情况.

    1. 将我们准备好的训练集拖到虚线框内, 或者点击 Training data 旁的 Choose 按钮 选择目前文件.

我尝试过将训练集60000张图片, 训练完大概需要160分钟, 中间还中断过几次, 所以后来采用10000张图片, 训练了30分钟左右, 最终采用1000张, 大概3分钟不到,

image1.png

image2.png
image3.png
image4.png

3. 评估表现
经过我的多次测试, 发现模型在迭代次数为 30 时, 表现是最好的.(没有进行数据增强, 太耗时间了)

Epoch Training Validation Evaluation
10 85% 77% 78%
15 91% 89% 84%
20 95% 92% 84%
25 99% 87% 85%
30 100% 91% 85%
35 100% 92% 84%

4. 保存模型

image.png

模型大小148KB, 挺小的.

5. 使用模型
核心代码

private func predictByModel(src: UIImage, model: MNIST_LC) -> [String: Double] {
        
    // 获取图片数据
    guard let buffer = Help_Utils.pixelBufferFromImage(inputImage: src) else {
        fatalError("获取pixelBuffer失败")
    }
    
    // 进行预测
    guard let result = try? model.prediction(image: buffer) else {
        fatalError("Prediction failed!")
    }
        
    // 显示结果
    return result.classLabelProbs
}

在这里提一句, 像这种Model, 如果做的多了会发现, 同种类型的Model, 他们预测的代码基本相同, 如果遇到没见过的 Model, 直接跟到Model里面, 去看可以调用的方法也是可以的.

如果运行报错, 类似下面这种情况, 那么你需要升级你的手机系统为 iOS12.


image.png

运行结果:


image.png

我特意选了几个比较刁钻的图片, 结果没有识别出来 :].

小结:

  1. 机器学习的一般过程: 准备数据 -> 训练模型 -> 评估表现 -> 保存模型 -> 使用模型
  2. 训练数据和测试数据都是我们已经打好标签的数据, 也就是我们事先已经把不同类型的数字图片分成不同的文件夹. 尽量保证每种分类文件下的文件数量一样.
  3. 上面介绍的那种方式是通过CreateML UI, 也就是 MLImageClassifierBuilder 来实现的, 如果要使用代码来做的话, 则必须调用 MLImageClassifier, 示例在文末
  4. 用 CreateML 来实现图片分类, 目前来说还不太成熟, 仅靠 Mac 这一台机器, 算力非常有限, 训练1000张图片在 2m 30s 左右, 训练60000张, 就要花3个小时左右.

CreateML 的应用目前除了 图像识别, 还有自然语言处理, 回归分析, 下篇文章再讲.


借助 MLImageClassifier 代码实现 图片分类

// 使用代码训练模型

// 数据预处理
let rootDir = "/Users/linchuan/Downloads/四种格式的mnist/mnist.zip/"
let trainDir = URL(fileURLWithPath: rootDir).appendingPathComponent("train_lc_1000")
let testDir = URL(fileURLWithPath: rootDir).appendingPathComponent("test_lc_100")


/**
 训练参数:
 featureExtractor: 特征提取器
 validationData:   验证集, 为nil, 则会从训练集中取 5% 来补充
 maxIterations:    迭代次数
 augmentationOptions: 数据增强, 包括图片翻转, 模糊, 修剪等
 */
let parameters = MLImageClassifier.ModelParameters(featureExtractor: .scenePrint(revision: 1),
                                                 validationData: nil,
                                                 maxIterations: 30,
                                                 augmentationOptions: [])

// 创建模型
let classifier = try MLImageClassifier(trainingData: .labeledDirectories(at: trainDir),
                                   parameters:  parameters)

// 训练模型
//...

// 测试模型
let evaluation = classifier.evaluation(on: .labeledDirectories(at: testDir))
// 打印测试结果
print(evaluation.precisionRecall.columnNames)

// 保存模型
let saveDir = URL(fileURLWithPath: rootDir).appendingPathComponent("MNISTClassifier.mlmodel")
let modelMetadata = MLModelMetadata(author: "LC",
                                    shortDescription: "image classifier" ,
                                    license: nil,
                                    version: "1.0",
                                    additional: nil)
try classifier.write(to: saveDir, metadata: modelMetadata)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容