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

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 用来训练、推理的机器学习库,都与它兼容。

====================================分割线================================

本文作者:三川

本文转自雷锋网禁止二次转载,原文链接

时间: 2024-09-27 06:05:09

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

尼尔森:美国网民在社交网络和博客上花费的时间总共为810亿分钟

据国外媒体报道,在过去十年中,互联网已经融入到了我们的生活之中.根据尼尔森的统计数据,在2011年,约有2.742亿美国人上网,这个数字是2000年的两倍以上.而且,他们在社交网络和博客上花费的时间总共为810亿分钟. 尼尔森的统计数据还显示,在去年,约有1.176亿人通过移动设备访问互联网.而根据市场研究公司comScore 在2月发布的统计数据,美国人去年在网络购物方面的总支出为2560亿美元,较2010年同比增长了12%. 互联网已对美国经济产生了重大的影响.全球管理咨询公司波士顿咨询集团

调查显示:过去一年美国人在社交网站上花费的时间大幅增加

据新华社华盛顿 6月3日电(记者 王薇 杨晴川) 美国3日公布的一项调查结果显示,过去一年美国人在社交网站上花费的时间大幅增加. 这份由尼尔森在线完成的调查报告说,从2008年4月至2009年4月,美国人在Facebook.Myspace和LinkedIn等社交网站上花费的时间增加了83%. 报告还说,在此期间,美国人在Facebook上花费的时间从17亿分钟增至139亿分钟,增加了约7倍,在各社交网站中居首位.人们在微博客网站Twitter上花费的时间则从790万分钟增至3亿分钟. 报告发现,

人们在数字屏幕上的阅读时间几乎与印刷媒体相同

Garnter的调查显示,绝大多数平板电脑和iPad用户表示,电子读物比印刷读物更易阅读(52%)或者二者相等(42%).然而,47%的笔记本用户认为,电子读物比印刷读物的阅读难度大,33%认为二者相等.2010年第四季度,Gartner共对美国.英国.中国.日本.意大利和印度等6个国家的1569名读者进行了调查,以便了解他们对电子读物和印刷读物的阅读感受.本次调查的数据来源包括网上调查.面对面调查和电脑辅助的电话调查三种类型."有人担心数字媒体将蚕食印刷媒体,根据是世界许多地区的报纸总体销量下

标准-请懂计算机的帮忙估算一下,我鼠标连续移动一秒,计算机要花费多少时间在鼠标移动这一事件的处理上

问题描述 请懂计算机的帮忙估算一下,我鼠标连续移动一秒,计算机要花费多少时间在鼠标移动这一事件的处理上 以市面上普通正常的计算机标准大概估算一下就行了,只要误差在一个数量级以内,一直觉得计算很快,但是不知道到底有多快,学编程,书里有句话说:"不要以为你连续移动鼠标,电脑就处于忙碌状态,它依然有很多的空闲时间,所以我才有此一问" 解决方案 鼠标晃晃还是需要消耗一些资源的,因为窗口上很多控件都需要判断自身是否需要响应鼠标滑过的消息,以及处理显示.你可以打开任务管理器,切换到性能标签, 晃动

机器学习项目中的数据预处理与数据整理之比较

要点 在常见的机器学习/深度学习项目里,数据准备占去整个分析管道的60%到80%. 市场上有各种用于数据清洗和特征工程的编程语言.框架和工具.它们之间的功能有重叠,也各有权衡. 数据整理是数据预处理的重要扩展.它最适合在可视化分析工具中使用,这能够避免分析流程被打断. 可视化分析工具与开源数据科学组件之间,如R.Python.KNIME.RapidMiner互为补充. 避免过多地使用组件能够加速数据科学项目.因此,在数据准备步骤中利用流式获取框架或流式分析产品会是一个不错的选择. 机器学习和深度

《移动数据挖掘》—— 第2章 移动数据预处理 2.1 移动数据简介

第2章 移动数据预处理 第2章 移动数据预处理在本章中,首先对移动数据及其特性进行介绍,再介绍针对移动数据的预处理.因为移动数据的挖掘是从原始移动数据.语义移动数据等多个层次进行的,在挖掘时总是会出现各种各样的数据缺失或数据异常.因此,本章的数据预处理包括缺失数据补全.重要地点检测.语义信息标注三个方面,预处理的目的就在于更好地为后续移动数据的挖掘和分析做准备. 2.1 移动数据简介 移动数据的类型众多.范围较广,有来自于人类日常生活中使用手机等智能设备留下的印记,也有为研究人类和动物等的日常行

数据可视化设计:给数据穿上美丽的外衣

文章描述:如今,在设计,通讯,信息及数据新闻,用户界面多个领域都可以见到数据可视化的身影,引入视觉设计的数据大大提升了说服力,可读性和逻辑性都得到了增强,他带来的不仅仅是颠覆表格那么简单,而是一种思想理念,它不仅把可视化信息作为一种沟通工具:同时也是一种重要的 如今,在设计,通讯,信息及数据新闻,用户界面多个领域都可以见到数据可视化的身影,引入视觉设计的数据大大提升了说服力,可读性和逻辑性都得到了增强,他带来的不仅仅是颠覆表格那么简单,而是一种思想理念,它不仅把可视化信息作为一种沟通工具:同时也

利用 Scikit Learn的Python数据预处理实战指南

简介 本文主要关注在Python中进行数据预处理的技术.学习算法的出众表现与特定的数据类型有密切关系.而对于没有经过缩放或非标准化的特征,学习算法则会给出鲁莽的预测.像XGBoost这样的算法明确要求虚拟编码数据,而决策树算法在有些情况下好像完全不关心这些! 简而言之,预处理是指在你将数据"喂给"算法之前进行的一系列转换操作.在Python中,scikit-learn库在sklearn.preprocessing下有预装的功能.有更多的选择来进行预处理,这将是我们要探索的. 读完本文,

利用Scikit Learn的Python数据预处理实战指南

本文主要关注在Python中进行数据预处理的技术.学习算法的出众表现与特定的数据类型有密切关系.而对于没有经过缩放或非标准化的特征,学习算法则会给出鲁莽的预测.像XGBoost这样的算法明确要求虚拟编码数据,而决策树算法在有些情况下好像完全不关心这些! 简而言之,预处理是指在你将数据"喂给"算法之前进行的一系列转换操作.在Python中,scikit-learn库在sklearn.preprocessing下有预装的功能.有更多的选择来进行预处理,这将是我们要探索的. 读完本文,你将具