2017-08-10 52 views
0

假设我有有看起来像这样的如何在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,但与该接口完全等价,所以它在概念上是相同的)。

+0

一种方法是定义一个变量为每个列。但请首先澄清你想要的网络结构。您需要一个网络结构来合并不同的变量,或者您需要先合并数据,即创建一个输入向量。 – leezu

+0

@leezu我编辑了我的原始文章的一些细节。这就是你所说的“网络结构”吗?我刚刚开始,现在真的很简单。 – sail0r

回答

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填充短的那些带给他们都一个共同的长度。

相关问题