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).
fonte
2015-12-04 05:02:32