Multilabel Text Klassifizierung mit TensorFlow
Den text-Daten ist organisiert als Vektor mit 20.000 Elementen, wie [2, 1, 0, 0, 5, ...., 0].
i-te element gibt die Häufigkeit der i-te Wort in einem text.
Den ground truth Daten für die Etikettierung ist auch dargestellt als Vektor mit 4.000 Elemente, wie [0, 0, 1, 0, 1, ...., 0].
i-te element gibt an, ob der i-te label ist eine positive Bezeichnung für einen text.
Die Anzahl der Etiketten, die für ein text unterscheidet sich je auf die Texte.
Ich habe einen code für single-label text classification.
Wie kann ich die Bearbeiten Sie den folgenden code für multilabel-text-Klassifikation?
Besonders, ich würde gerne wissen, folgenden Punkte.
- Wie die Berechnung der Genauigkeit mit TensorFlow.
- Wie eine Schwelle setzen, die Richter, ob ein label positiv oder negativ ist. Zum Beispiel, wenn der Ausgang [0.80, 0.43, 0.21, 0.01, 0.32] und der Boden der Wahrheit ist [1, 1, 0, 0, 1], die Etiketten mit Werten über 0,25 beurteilt werden soll, als positiv.
Danke.
import tensorflow as tf
# hidden Layer
class HiddenLayer(object):
def __init__(self, input, n_in, n_out):
self.input = input
w_h = tf.Variable(tf.random_normal([n_in, n_out],mean = 0.0,stddev = 0.05))
b_h = tf.Variable(tf.zeros([n_out]))
self.w = w_h
self.b = b_h
self.params = [self.w, self.b]
def output(self):
linarg = tf.matmul(self.input, self.w) + self.b
self.output = tf.nn.relu(linarg)
return self.output
# output Layer
class OutputLayer(object):
def __init__(self, input, n_in, n_out):
self.input = input
w_o = tf.Variable(tf.random_normal([n_in, n_out], mean = 0.0, stddev = 0.05))
b_o = tf.Variable(tf.zeros([n_out]))
self.w = w_o
self.b = b_o
self.params = [self.w, self.b]
def output(self):
linarg = tf.matmul(self.input, self.w) + self.b
self.output = tf.nn.relu(linarg)
return self.output
# model
def model():
h_layer = HiddenLayer(input = x, n_in = 20000, n_out = 1000)
o_layer = OutputLayer(input = h_layer.output(), n_in = 1000, n_out = 4000)
# loss function
out = o_layer.output()
cross_entropy = -tf.reduce_sum(y_*tf.log(out + 1e-9), name='xentropy')
# regularization
l2 = (tf.nn.l2_loss(h_layer.w) + tf.nn.l2_loss(o_layer.w))
lambda_2 = 0.01
# compute loss
loss = cross_entropy + lambda_2 * l2
# compute accuracy for single label classification task
correct_pred = tf.equal(tf.argmax(out, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, "float"))
return loss, accuracy
InformationsquelleAutor der Frage Benben | 2016-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern aufgrund der Kr zu sigmoid output-Schicht.
Ändern der Kreuz-Entropie-Verlust, explizite mathematische Formel von Sigma-Kreuz-Entropie-Verlust (explicit loss arbeiten war in meinem Fall/version tensorflow )
InformationsquelleAutor der Antwort Alok Nayak
Verwenden Sie die Varianten der cross-Entropie-Funktion in andere zu unterstützen multilabel-Klassifizierung. In Fall haben Sie weniger als tausend-Ausgänge Sie verwenden sollten,sigmoid_cross_entropy_with_logitsin Ihrem Fall, dass Sie 4000 Ausgaben, die Sie betrachten Kandidat samplingda er schneller ist als die Vorherige.
Dies hängt davon ab, Ihr problem und was Sie erreichen wollen. Wenn Sie nicht wollen, zu verpassen Objekt in einem Bild dann, wenn der Klassifikator bekommen alle Recht, aber, dann sollten Sie das ganze Bild ist ein Fehler. Sie können auch erwägen, dass ein Objekt übersehen oder missclassiffied ist ein Fehler. Letztere finde ich es, unterstützt durch sigmoid_cross_entropy_with_logits.
Schwelle ist ein Weg zu gehen, müssen Sie entscheiden, welche. Aber das ist eine Art hack, nicht real multilable Klassifizierung. Dafür benötigen Sie den vorherigen Funktionen, die ich sagte bevor.
InformationsquelleAutor der Antwort jorgemf