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

简介:

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月前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
125 1
|
4月前
|
Java 前端开发 容器
Struts 2:在技术变革的风暴中航行,探索框架的革命性未来与创新融合之路
【8月更文挑战第31天】Struts 2作为一款成熟的企业级Java Web框架,凭借其稳定性和灵活性自2007年以来广受欢迎。它基于MVC设计模式,支持插件架构和RESTful服务,并能与Spring框架良好集成。然而,面对微服务架构和容器化技术(如Docker和Kubernetes)的兴起,Struts 2需提供更轻量级和支持指南来适应变化。通过深化与现代前端框架(如React和Vue.js)及AI技术的集成,并强化安全性与开发工具,Struts 2有望保持竞争力并迎接未来挑战。
55 0
|
4月前
|
机器学习/深度学习 SQL 数据采集
"解锁机器学习数据预处理新姿势!SQL,你的数据金矿挖掘神器,从清洗到转换,再到特征工程,一网打尽,让数据纯净如金,模型性能飙升!"
【8月更文挑战第31天】在机器学习项目中,数据质量至关重要,而SQL作为数据预处理的强大工具,助力数据科学家高效清洗、转换和分析数据。通过去除重复记录、处理缺失值和异常值,SQL确保数据纯净;利用数据类型转换和字符串操作,SQL重塑数据结构;通过复杂查询生成新特征,SQL提升模型性能。掌握SQL,就如同拥有了开启数据金矿的钥匙,为机器学习项目奠定坚实基础。
45 0
|
5月前
|
机器学习/深度学习 数据采集 存储
在机器学习和数据科学中,数据预处理是一个至关重要的步骤。数据规范化(或称为特征缩放)是预处理的一种常见技术,它可以帮助我们改进模型的性能。`sklearn.preprocessing`模块提供了多种数据规范化的方法,其中`StandardScaler`和`MinMaxScaler`是最常用的两种。
在机器学习和数据科学中,数据预处理是一个至关重要的步骤。数据规范化(或称为特征缩放)是预处理的一种常见技术,它可以帮助我们改进模型的性能。`sklearn.preprocessing`模块提供了多种数据规范化的方法,其中`StandardScaler`和`MinMaxScaler`是最常用的两种。
|
7月前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型:从数据预处理到模型优化
【5月更文挑战第31天】 在当今数据驱动的时代,构建一个高效的机器学习(ML)模型是解决复杂问题的关键。本文将引导读者通过一系列细致的步骤来搭建健壮且精确的ML模型。我们将重点讨论数据预处理的策略、选择合适的算法、模型训练的技巧以及性能优化的方法。通过实例和代码示例,本技术分享旨在为从业者提供实用的指导,帮助他们在面对实际问题时能够灵活应用机器学习技术,并达到提高预测准确率和模型泛化能力的目的。
|
7月前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到模型优化
【5月更文挑战第28天】在机器学习领域,构建一个高效的模型并非易事。它要求我们不仅对算法有深入的理解,还需要掌握数据处理、特征工程以及模型调优等多方面知识。本文将引导读者了解如何从原始数据的收集与清洗开始,逐步进行特征选择和工程,最后通过各种方法对模型进行细致调优。我们将讨论数据预处理的重要性、特征工程的策略以及使用交叉验证、网格搜索等技术来提升模型性能。
|
7月前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到模型优化
【5月更文挑战第30天】 在机器学习项目的实施过程中,数据科学家和工程师们经常面临一个复杂且多变的挑战——如何构建一个既准确又高效的模型。本文将深入探讨构建高效机器学习模型的关键步骤,包括数据预处理的技巧、特征选择的策略、模型训练的细节以及超参数调优的方法。通过实践案例的分析,我们将展示如何克服过拟合、提高模型的泛化能力,并最终实现在保持高准确率的同时,提升模型的运行效率。
|
7月前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到模型优化
【5月更文挑战第28天】 在本文中,我们将探讨构建高效机器学习模型的关键步骤。与传统的摘要不同,我们将重点关注数据预处理、特征选择、模型训练和优化等方面,以提供一个全面的技术性指南。我们将讨论如何通过这些步骤提高模型的性能和准确性,以及如何解决常见的技术挑战。
|
7月前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到性能优化
【5月更文挑战第28天】 在机器学习领域,构建一个高效的模型并非易事。它涉及多个步骤,从数据预处理、特征选择、模型训练、参数调优,直至最终的性能评估与优化。本文将详细探讨如何通过这些关键步骤来打造一个高性能的机器学习模型,并提供实用的技巧和策略以应对常见的挑战。
|
7月前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到性能优化
【5月更文挑战第21天】 在机器学习领域,一个高效且准确的预测模型的构建过程涉及多个关键步骤。本文将深入探讨如何通过恰当的数据预处理、特征工程、模型选择与调参与及最终的性能优化策略,来构建一个鲁棒的机器学习模型。我们的目标是为读者提供一条清晰的路径,以帮助他们理解并实施这些技术,从而提高模型的预测能力与泛化性。

热门文章

最新文章