2017-08-10 4 views
0

Supposons que je dispose d'un fichier de données qui contient des entrées qui ressemblent à ceComment créer une entrée avec plusieurs types de données dans mxnet?

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

Je voudrais l'utiliser comme une entrée à un modèle mxnet (alimentation de base avant multicouche Perecptron). Un seul enregistrement d'entrée a des types de données, dans l'ordre indiqué ci-dessus

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

chaque enregistrement est une représentation significative d'une entité spécifique. Comment puis-je représenter ce type de données sur mxnet? aussi, pour compliquer un peu les choses, supposons que je veuille coder à chaud les colonnes catégoriques? Et que se passe-t-il si chaque enregistrement a ces champs, dans l'ordre d'affichage, mais répété plusieurs fois dans certains cas, de sorte que chaque enregistrement peut avoir une longueur différente?

Les documents sont parfaits pour les cas de base où vous avez des données d'entrée qui sont tous du même type et peuvent tous être chargés dans la même entrée sans aucune transformation mais comment gérer ce cas?

Mise à jour: ajout de quelques détails supplémentaires. Pour que cela reste aussi simple que possible, disons que je veux juste en faire un réseau simple. quelque chose comme:

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); 

dans le cas simple des données étant tous un type et ne nécessitant pas beaucoup de la manière de pré-traitement, je puis pouvais faire quelque chose le long des lignes de

$module->fit(
    $train_iter, 
    eval_data => $eval_iter, 
    optimizer => "adam", 
    optimizer_params=>{learning_rate=>0.001}, 
    eval_metric => "mse", 
    num_epoch => 25 
); 

$train_iter est un simple itérateur NDArray sur les données d'entraînement. (Eh bien, avec l'API Perl, ce n'est pas exactement un NDArray, mais il a une parité complète avec cette interface, donc c'est conceptuellement identique).

+0

Une approche consiste à définir une variable pour chaque colonne. Mais veuillez d'abord préciser quelle structure de réseau vous avez en tête. Vous avez besoin d'une structure réseau qui fusionne les différentes Variables dans une couche, ou vous devez prendre en charge la fusion des données dès le début, c'est-à-dire créer un seul vecteur d'entrée. – leezu

+0

@leezu J'ai édité mon article original avec quelques détails. Est-ce ce que vous vouliez dire par «structure de réseau»? Je commence juste et je le garde vraiment simple pour le moment. – sail0r

Répondre

2

NDArrayIter prend également en charge les entrées multiples. Vous pouvez l'utiliser comme suit

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') 

Avant que vous devrez convertir vos données non numériques en données numériques. Cela pourrait prendre la forme d'un vecteur à une seule source ou d'un autre mode qui dépend de la signification de cette variable. Comme pour la question concernant les échantillons ont une longueur différente, le plus simple serait de tous les ramener à une longueur commune en remplissant les plus courts avec des 0.