2015-03-17 4 views
7

Ich habe einige Textdaten mit mehreren Etiketten für jedes Dokument. Ich möchte ein LSTM-Netzwerk mit Theano für diesen Datensatz trainieren. Ich bin auf http://deeplearning.net/tutorial/lstm.html gestoßen, aber es erleichtert nur eine binäre Klassifizierungsaufgabe. Wenn jemand irgendwelche Vorschläge hat, mit welcher Methode man fortfahren kann, wird das großartig. Ich brauche nur eine anfängliche machbare Richtung, an der ich arbeiten kann.Wie führt man Multi-Label-Lernen mit LSTM mit theano durch?

Dank, Amit

Antwort

1

Sie können die letzte Schicht des Modells ändern. Es würde einen Zielvektor haben, bei dem jedes Element 0 oder 1 ist, abhängig davon, ob Sie das Ziel haben oder nicht.

6

1) Ändern Sie die letzte Schicht des Modells. I.e.

pred = tensor.nnet.softmax(tensor.dot(proj, tparams['U']) + tparams['b']) 

sollte durch eine andere Schicht ersetzt werden, z. sigmoid:

pred = tensor.nnet.sigmoid(tensor.dot(proj, tparams['U']) + tparams['b']) 

2) Die Kosten sollten ebenfalls geändert werden.

I.e.

cost = -tensor.log(pred[tensor.arange(n_samples), y] + off).mean() 

sollte durch andere Kosten ersetzt werden, z.B. Quer Entropie:

one = np.float32(1.0) 
pred = T.clip(pred, 0.0001, 0.9999) # don't piss off the log 
cost = -T.sum(y * T.log(pred) + (one - y) * T.log(one - pred), axis=1) # Sum over all labels 
cost = T.mean(cost, axis=0) # Compute mean over samples 

3) In der Funktion build_model(tparams, options), sollten Sie ersetzen:

y = tensor.vector('y', dtype='int64') 

von

y = tensor.matrix('y', dtype='int64') # Each row of y is one sample's label e.g. [1 0 0 1 0]. sklearn.preprocessing.MultiLabelBinarizer() may be handy. 

4) Ändern pred_error() so dass es unterstützt Multilabel (zB einige mit Metriken wie Genauigkeit oder F1-Score von scikit-learn).