如何在mxnet中创建具有多种数据类型的输入?

时间:2017-08-10 17:09:41

标签: mxnet

假设我有一个数据文件,其条目看起来像这样

0.00,2015-10-21,1,Y,798.78,323793701,6684,0.00,Q,H2512,PE0,1,0000

我想将其用作mxnet模型(基本前馈多层Perecptron)的输入。单个输入记录具有数据类型,按上面显示的顺序

float,date,int,categorical,float,int,int,float,categorical,categorical,categorical,int, float

每条记录都是特定实体的有意义的表示。我如何将此类数据表示给mxnet?另外,为了使事情复杂化,假设我想对分类列进行单热编码?如果每个记录在顺序显示中有这些字段,但在某些情况下重复多次,以使每条记录的长度可能不同,该怎么办?

对于基本情况,文档非常适用于输入数据类型相同且可以全部加载到同一输入而不进行任何转换但是如何处理这种情况的基本情况?

更新:添加一些其他详细信息。为了让这个尽可能简单,让我们说我只想将它提供给一个简单的网络。类似的东西:

my $data = mx->symbol->Variable("data");
my $fc = mx->symbol->FullyConnected($data, num_hidden => 1);
my $softmax=mx->symbol->SoftmaxOutput(data => $fc, name => "softmax");
my $module = mx->mod->new(symbol => $softmax);

在简单的情况下,数据都是一种类型,并且在预处理方面不需要太多,那么我可以按照

的方式做一些事情。
$module->fit(
    $train_iter,
    eval_data => $eval_iter,
    optimizer => "adam",
    optimizer_params=>{learning_rate=>0.001},
    eval_metric => "mse",
    num_epoch => 25
);

其中$train_iter是训练数据的简单NDArray迭代器。 (好吧,使用Perl API,它不完全是NDArray,但与该接口完全相同,因此它在概念上是相同的。)

1 个答案:

答案 0 :(得分:2)

NDArrayIter还支持多输入。您可以按如下方式使用它

data = {'data1':np.zeros(shape=(10,2,2)), 'data2':np.zeros(shape=(20,2,2))}
label = {'label1':np.zeros(shape=(10,1)), 'label2':np.zeros(shape=(20,1))}
dataiter = mx.io.NDArrayIter(data, label, 3, True, last_batch_handle='discard')

在此之前,您必须将非数字数据转换为数字数据。这可以是单热矢量或某种其他方式的形式,这取决于该变量的含义。

关于样本长度不同的问题,最简单的方法是用0填充较短的样本,使它们全部达到一个共同的长度。