Multilabel de la Classification de textes à l'aide de TensorFlow
Les données de texte est organisé comme vecteur avec 20 000 éléments, comme [2, 1, 0, 0, 5, ...., 0].
i-ème élément indique la fréquence de la i-ème mot dans un texte.
La vérité du terrain les données de l'étiquette est également représenté comme un vecteur de 4 000 éléments, comme [0, 0, 1, 0, 1, ...., 0].
i-ème élément indique si la i-ème de l'étiquette est un positif de l'étiquette de texte.
Le nombre d'étiquettes pour un texte qui diffère selon les textes.
J'ai un code pour un seul texte de l'étiquette de classement.
Comment puis-je modifier le code suivant pour multilabel de la classification de textes?
Surtout, je voudrais savoir points suivants.
- Comment faire pour calculer la précision à l'aide de TensorFlow.
- Comment définir un seuil au-delà duquel les juges que l'étiquette soit positif ou négatif. Par exemple, si la sortie est [0.80, 0.43, 0.21, 0.01, 0.32] et la vérité du terrain est [1, 1, 0, 0, 1], les étiquettes avec des scores de plus de 0.25 devrait être jugé comme positif.
Merci.
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
- Je pense qu'il y a peut-être une meilleure perte de fonction à utiliser en plus d'entropie croisée.
- Il ya beaucoup de différentes mesures de précision pour un multilabel classification problème: une erreur de précision, grade, la perte, la moyenne de la précision, etc. Je suis encore à apprendre TensorFlow moi-même et je n'ai pas réussi à mettre correctement en œuvre l'un d'eux encore. Mais peut-être que ce livre vous aidera à: arxiv.org/pdf/1312.5419v3.pdf Laissez-moi savoir si vous faites des progrès!
- Pour avoir une meilleure idée de la précision envisager de calculer la précision et le rappel.
- qu'est-ce que
y_
je ne vois pas défini
Vous devez vous connecter pour publier un commentaire.
Changement relu à sigmoïde de la couche de sortie.
Modifier la croix entropie explicite à la formule mathématique de la croix entropie (explicite, la perte a été de travailler dans mon cas, la version de tensorflow )
Vous devez utiliser les variations de la croix de l'entropie de la fonction dans d'autres à l'appui de multilabel de classification. Dans le cas où vous avez moins d'un millier de ouputs vous devez utiliser sigmoid_cross_entropy_with_logits, dans votre cas, vous avez 4000 sorties, vous pouvez envisager de candidat échantillonnage car il est plus rapide que la précédente.
Cela dépend de votre problème et ce que vous voulez atteindre. Si vous ne voulez pas manquer n'importe quel objet dans une image puis si le classificateur obtenir tout droit, mais un seul, alors vous devriez considérer l'ensemble de l'image une erreur. Vous pouvez également envisager qu'un objet oublié ou missclassiffied est une erreur. La dernière, je pense que c'pris en charge par sigmoid_cross_entropy_with_logits.
Seuil est une façon d'aller, vous avez à décider lequel. Mais c'est une sorte de hack, pas de réel multilable de classification. Pour cela vous devez les fonctions précédentes je l'ai dit avant.