2017-08-10 56 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填充短的那些帶給他們都一個共同的長度。

相關問題