2015-03-17 14 views
7

Ho alcuni dati di testo con più etichette per ogni documento. Voglio addestrare una rete LSTM usando Theano per questo set di dati. Mi sono imbattuto in http://deeplearning.net/tutorial/lstm.html ma facilita solo un'attività di classificazione binaria. Se qualcuno ha qualche suggerimento su quale metodo procedere, sarà grandioso. Ho solo bisogno di una direzione iniziale fattibile, su cui posso lavorare.Come eseguire l'apprendimento multi-label con LSTM usando theano?

grazie, Amit

risposta

1

È possibile modificare l'ultimo livello del modello. Avrebbe un vettore di target in cui ogni elemento è 0 o 1, a seconda che tu abbia o meno l'obiettivo.

6

1) Modificare l'ultimo livello del modello. Cioè

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

deve essere sostituito da qualche altro strato, ad es. sigma:

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

2) Il costo deve essere modificato.

I.e.

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

deve essere sostituito da un altro costo, ad es. cross-entropia:

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) Nella funzione build_model(tparams, options), è necessario sostituire:

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

da

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) Modificare pred_error() in modo che supporti multietichetta (ad esempio utilizzando alcuni metriche come accuratezza o punteggio F1 da scikit-learn).