你在数据预处理上花费的时间,是否比机器学习还要多?

本文作者:三川 2017-05-31 19:05
导语:IBM 模型架构专家,向大家介绍一个新出世的 Python 数据预处理神器——nuts-ml。

雷锋网按:本文作者  Stefan Maetschke 为 IBM 机器学习架构模型专家,根据自身工作经历向大家推荐这款全新的数据预处理工具。雷锋网编译。

Nuts-ml 是一个新的 Python 数据预处理库,专门针对视觉领域的 GPU 深度学习应用。 它以独立、可复用的单元模块的形式,提供主流数据预处理函数。前者便是“nuts-ml” 里的 “nuts”,开发者可自由将其排列组合,创建高效、可读性强、方便修改的数据流。

对于机器学习项目,数据预处理都是基础。相比实际的机器学习,开发者花在数据预处理上的时间往往还要更多。有的数据预处理任务只针对特定问题,但大多数,比如把数据分割为训练和测试组、给样本分层和创建 mini-batch 都是通用的。下面的 Canonical 流水线展示了深度学习视觉任务常见的处理步骤。

Reader 读取文本文件、 Excel 或 Pandas 表格中的样本数据。接下来 Splitter 把数据分割为训练、验证和测试集,如需要再进行分层。一般情况下,并不是所有图像数据都能载入内存,于是,我们需要 Loader 按需导入。这些图像一般由 Transformer 进行处理,以修改尺寸、截图或做其它调整。另外,为增加训练集, Augmenter 会随机选取图像进行扩充(比如翻转),以合成额外图像。基于 GPU 的高效率的机器学习,需要用 Batcher 把图像和标签数据编成 mini-batch。随后导入 Network 进行训练或者推理。最后,为追踪训练过程,一般我们会用 Logger 来把训练损失或精度记录到 log 文件。

有些机器学习框架,比如 Keras,就在 API 中提供了这些预处理模块。若与任务的匹配程度高,这就能大幅简化神经网络的训练。请见下面的用 keras 训练采用了数据扩充(augmentation)的模型。

datagen = ImageDataGenerator(  # augment images
   width_shift_range=0.1,  
   height_shift_range=0.1, 
   horizontal_flip=True)

datagen.fit(x_train)

model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),
   steps_per_epoch=x_train.shape[0] 
   epochs=epochs,
   validation_data=(x_test, y_test))

但如果,深度学习框架的 API 没有提供图像格式、数据扩充等预处理功能呢?

扩展 Keras 这样的库并不是一个轻松的活儿。常见的解决方案是简单粗暴地(重新)实现所需功能。但实现一个强鲁棒性的数据流水线,能按需加载、转换、扩充、处理图像仍然很具挑战性,并且有很高时间成本。

这便要 nuts-ml 上场了。

如开头介绍的,nuts-ml 是一个 Python 库,它提供了常见的预处理函数,即所谓的 “nuts”,能自由排列并且轻松扩展,以创建高效的数据预处理流水线。下面是节选的一段 nuts-ml 示例代码,展示了训练神经网络的流水线,>> 指示操作流。

t_loss = (train_samples >> augment >> rerange >> Shuffle(100) >> 
         build_batch >> network.train() >> Mean())
print "training loss  :", t_loss

上面的示例中,训练图像被扩充,像素值被重新分配,样本在创建训练网络的 batch 之前被打乱顺序。最后,batch 的平均训练损失被分批计算、打印出来。组成该数据流的 nuts 可如下定义:

rerange = TransformImage(0).by('rerange', 0, 255, 0, 1, 'float32')

augment = (AugmentImage(0)
          .by('identical', 1.0)
          .by('brightness', 0.1, [0.7, 1.3])
          .by('fliplr', 0.1)))
          
build_batch = (BuildBatch(BATCH_SIZE)
              .by(0, 'image', 'float32')
              .by(1, 'one_hot', 'uint8', NUM_CLASSES))

network = KerasNetwork(model)

重分配(rerange)是一个把 [0, 255] 区间的像素值转化为 [0, 1] 区间的图像转换过程。数据扩充生成用于训练的额外图像。build_batch 创建由图像和 one-hot 编码的类标签组成的 batch。神经网络把现有 Keras 模型封装为一个 nut,后者能插入进流水线。该示例的完整代码在这里。

Nuts-ml 的作用,是帮助开发者在深度学习任务重更快地创建数据预处理流水线。产生的代码根据可读性,修改后还可试验不同的预处理方案。针对特定任务的函数可方便地作为 nuts 实现并添加进数据流。下面就是一个调整图像亮度的简单 nut:

@nut_function
def AdjustBrightness(image, c):
 return image * c
 
... images >> AdjustBrightness(1.1) >> ...

Nuts-ml 本身并不能进行神经网络的训练,而是借助于 Keras、Theano 等已有的库来实现。任何能接受 Numpy 阵列的 mini-batch 用来训练、推理的机器学习库,都与它兼容。

你在数据预处理上花费的时间,是否比机器学习还要多?相关推荐

  1. R 多变量数据预处理_R语言常用统计方法包+机器学习包(名称、简介)

    上期帮大家盘点了一下R中常用的可视化包,这期将简要盘点一下关于统计分析与机器学习的R包,并通过简要介绍包的特点来帮助读者深入理解可视化包. 本文作者为"食物链顶端"学习群中的小伙伴 ...

  2. 数据预处理--上采样(过采样)与下采样(降采样)

    Imblearn package study 1. 准备知识 1.1 Compressed Sparse Rows(CSR) 压缩稀疏的行 2. 过采样(Over-sampling) 2.1 实用性的 ...

  3. R语言caret机器学习(二):数据预处理上

    [R语言数据科学]

  4. cnn对网络数据预处理_CNN中的数据预处理和网络构建

    cnn对网络数据预处理 In this article, we will go through the end-to-end pipeline of training convolution neur ...

  5. 数据预处理之数据描述

    转载自:http://www.douban.com/note/128903131/ 在数据挖掘过程中数据预处理至关重要.根据统计,在一个完整的数据挖掘过程中,数据预处理要花费60%左右的时间. 数据挖 ...

  6. 预处理加速干货:大幅加速数据预处理、轻松定制高性能ML算子

    Taichi能够更精细地控制并行和每个元素(element)的操作,极大地提升了用户操作的灵活性.而Torch则将这些细节抽象成张量(Tensor)级别的操作,使得用户能聚焦于机器学习的模型结构. 0 ...

  7. 时间轴ui设计_我应该在UI设计上花更多时间吗?

    时间轴ui设计 Let's start with an example of communication skills: they are important for any profession, ...

  8. [机器学习-sklearn]数据预处理要点总结

    数据预处理要点总结 1. 为什么要数据预处理 2. 数据中存在缺失值 2.1 查看数据的完整性(missingno) 2.2 简单删除法 2.3 人工填写(filling manually) 2.4 ...

  9. 阻止android应用调用_如何在Android上设置应用时间限制和阻止应用

    阻止android应用调用 Khamosh Pathak Khamosh Pathak Spending way too much time on your Android device? Use a ...

最新文章

  1. python argparse_Python 命令行之旅:初探 argparse
  2. 英伟达首次实现SDF实时3D渲染,还是细节超清晰的那种
  3. python排序的方法_python中排序的一种方法
  4. 图片和图形之性能和视图层次结构(18)
  5. hue迁移数据库到mysql
  6. 查找单链表的中间节点,要求只能遍历一次链表(C语言)
  7. centos6中三台物理机配置nginx+keepalived+lvs
  8. 如何入门 Python 爬虫?
  9. Flutter基础—定位对齐之中心定位
  10. Python 攻克移动开发失败!
  11. 自动驾驶算法-滤波器系列(五)——高级运动模型在UKF中的应用
  12. linux 下 /dev和/sys/dev的区别
  13. 十八岁白帽子与“攻陷五角大楼”众测计划
  14. 我失窃的信用卡资料在4500英里外被使用,我试图找出它是怎么发生的
  15. 防滑链行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  16. mybatis 父子级树形结构查询
  17. 邮件编码介绍及乱码的解决
  18. jquery插件zoom
  19. Win10系统重装 华硕笔记本电脑
  20. 【python实战】不玩微博,一封邮件就能知道实时热榜,天秀吃瓜

热门文章

  1. linux nvme分区,这些 loop 分区是什么鬼东西?
  2. java udp 多播 广播_Java UDP 广播与多播
  3. 温铁军、林毅夫、陈平,从学术、现实等多方面来分析,谁的价值高?
  4. php聊天功能_php实现简单聊天功能
  5. 丛高教授《空间数据管理和挖掘及在智慧城市的应用》演讲笔记
  6. SPSS实战应用案例50篇(一):从SPSS的角度讲清楚卡方检验
  7. 深度学习核心技术精讲100篇(四十二)-Seq2seq框架下的文本生成
  8. 理工科毕业设计献礼,MATLAB从入门到精通之矩阵是如何实现寻访与赋值的
  9. XGBoost类库使用小结
  10. NLP通用模型decaNLP诞生,一个模型搞定十大自然语言常见任务