不用写代码,就能训练测试深度学习模型!Uber开源AI工具箱Ludwig

2 月 12 日 量子位

乾明 发自 凹非寺 
量子位 报道 | 公众号 QbitAI

让代码的归代码,让AI的归AI。

在不写代码就能进行AI开发的道路上,Uber今日又往前踏了一步。

刚刚,Uber宣布开源Ludwig,一个基于TensorFlow的工具箱。

有了它,不用写代码就能够训练和测试深度学习模型。

Uber表示,对于AI开发者来说,Ludwig可以帮助他们更好地理解深度学习方面的能力,并能够推进模型快速迭代。

对于AI专家来说,Ludwig可以简化原型设计和数据处理过程,从而让他们能够专注于开发深度学习模型架构。

训练只需数据文件和配置文件

Ludwig提供了一套AI架构,可以组合起来,为给定的用例创建端到端的模型。

开始模型训练,只需要一个表格数据文件(如CSV)和一个YAML配置文件——用于指定数据文件中哪些列是输入特征,哪些列是输出目标变量。

如果指定了多个输出变量,Ludwig将学会同时预测所有输出。

使用Ludwig训练模型,在模型定义中可以包含附加信息,比如数据集中每个特征的预处理数据和模型训练参数, 也能够保存下来,可以在日后加载,对新数据进行预测。

灵活组合,适用多种任务

对于Ludwig支持的数据类型(文本、图像、类别等),其提供了一个将原始数据映射到张量的编码器,以及将张量映射到原始数据的解码器。张量是线性代数中使用的数据结构。

内置的组合器,能够自动将所有输入编码器的张量组合在一起,对它们进行处理,并将其返回给输入解码器。

Uber表示,通过组合这些特定于数据类型的组件,用户可以将Ludwig用于各种任务。比如,组合文本编码器和类别解码器,就可以获得一个文本分类器。

每种数据类型有多个编码器和解码器。例如,文本可以用卷积神经网络(CNN),循环神经网络(RNN)或其他编码器编码。

用户可以直接在模型定义文件中指定要使用的参数和超参数,而无需编写单行代码。

基于这种灵活的编码器-解码器架构,即使是经验较少的深度学习开发者,也能够轻松地为不同的任务训练模型。

比如文本分类、目标分类、图像字幕、序列标签、回归、语言建模、机器翻译、时间序列预测和问答等等。

多种功能,不断拓展

为了让工具变得更好用,Ludwig还提供了各种工具:

  • 用于训练、测试模型和获得预测的命令行程序;

  • 用于评估模型并通过可视化比较预测结果的工具;

  • 用于用户训练或加载模型,并获得对新数据预测的Python编程API。

此外,Ludwig还能够使用开源分布式培训框架Horovod,在多个GPU上训练模型,并快速迭代。

目前,Ludwig有用于二进制值,浮点数,类别,离散序列,集合,袋(bag),图像,文本和时间序列的编码器和解码器,并且支持选定的预训练模型。

Uber表示,未来将为每种数据类型添加几个新的编码器,比如用于文本的Transformer,ELMo和BERT,以及用于图像的DenseNet和FractalNet。

还将添加其他的数据类型,比如音频、点云和图形,同时集成更多可扩展的解决方案来管理大数据集,如Petastorm。

来个例子,上手看看

在这个例子中, 训练的是一个根据书名、作者、描述和封面来预测一本书的类型和价格的模型。数据集的形式如下所示:

模型使用书名、作者、描述和封面来作为输入,类型和价格作为输出,模型的配置文件是这样的:

input_features:
 –
   name: title
   type: text
 –
   name: author
   type: category
 –
   name: description
   type: text
 –
   name: cover
   type: image
output_features:
 –
   name: genre
   type: category
 –
   name: price
   type: numerical
training:
 epochs: 10


然后输入在控制台中,输入下列命令,开始训练。

ludwig train –data_csv path/to/file.csv –model_definition_file model_definition.yaml

然后,Ludwig会在训练、验证和测试集中对数据进行随机分割,进行预处理,并为四个输入建立四个不同的编码器,为两个输出目标建立一个组合器和两个解码器。

并在训练集上训练模型,直到验证集的精确度停止提高或者达到十个训练周期。

默认情况下,文本特征由CNN编码器编码,但是也可以使用RNN编码器,使用状态大小为200的双向LSTM来编码书名。

我们只需要将书名编码器的定义更改为下面这样:

name: title
type: text
encoder: rnn
cell_type: lstm
bidirectional: true


如果想改变训练参数,如周期数、学习率和批尺寸(batch size),可以这样改变模型配置:

input_features:
 – …
output_features:
 – …
training:
 epochs: 100
 learning_rate: 0.001
 batch_size: 64

训练结束之后,可以将训练的结果可视化,比如下图这样,显示训练周期中函数的损失和准确性。

也能够使用模型去预测新数据的结果,如果数据集中有ground truth信息,还能够进行对比,结果如下图所示:

此外,Ludwig还会提供一个简单的Python编程API,用户可以用它来训练或加载一个模型,并使用它来获得对新数据的预测,在这个例子中,代码如下所示:

from ludwig import LudwigModel

# train a model
model_definition = {…}
model = LudwigModel(model_definition)
train_stats = model.train(training_dataframe)
# or load a model
model = LudwigModel.load(model_path)

# obtain predictions
predictions = model.predict(test_dataframe)

model.close()

各种操作指南,在Uber提供的Ludwig用户指南中都有详细介绍,请收好传送门:

用户指南:

https://uber.github.io/ludwig/user_guide/

GitHub项目地址:

https://github.com/uber/ludwig

加入社群

量子位现开放「AI+行业」社群,面向AI行业相关从业者,技术、产品等人员,根据所在行业可选择相应行业社群,在量子位公众号(QbitAI)对话界面回复关键词“行业群”,获取入群方式。行业群会有审核,敬请谅解。


此外,量子位AI社群正在招募,欢迎对AI感兴趣的同学,在量子位公众号(QbitAI)对话界面回复关键字“交流群”,获取入群方式。

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点「好看」吧 !



登录查看更多
点赞 0
Top