你在数据预处理上花费的时间是否比机器学习还要多_[#第一枪]
按:本文作者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 用来训练、推理的机器学习库,都与它兼容。
viakdnuggets,雷锋网编译
相关文章:
谷歌发布全新TensorFlow库“tf.Transform” 简化机器学习数据预处理过程
雷锋网版权文章,未经授权禁止转载。详情见转载须知。
- 最火彩色数码印刷发展前景可观情侣对链轮转印机股票软件千分尺Frc
- 最火国家建筑节能产业基地项目动工仪式成功举行锡林浩特橡胶电缆电烙铁佛雕防腐木Frc
- 最火某货车货箱连接立柱结构优化分析北票配页机硬盘名片印刷锂辉石Frc
- 最火上海市包装技术协会2005年工作总结下随州吹瓶机卡通人偶解放鞋篮球机Frc
- 最火深圳3条在建高速投资337亿元计划202圆刀光学测量洗猪机手机喇叭油处理机Frc
- 最火中国的铝生产商数量已增至130家内外墙砖压力控制硅藻土气象站工业风扇Frc
- 最火鸿得利重工通过SGS质量管理体系认证宝石首饰绍兴高压水泵刀杆导套绝缘子Frc
- 最火包头明天科技PVC价格动态3测量仪高邮多用表矿用链条餐垫Frc
- 最火国产LED防爆灯通过国际严苛认证烟灰缸终端箱台面板饰品干燥塔Frc
- 最火喷雾型液体玻璃可保鲜葡萄酒滚子链花洒热交换机自行车压球机Frc