web-dev-qa-db-fra.com

Classification de texte à étiquettes multiples à l'aide de TensorFlow

Les données de texte sont organisées en vecteur avec 20 000 éléments, comme [2, 1, 0, 0, 5, ...., 0]. i-ème élément indique la fréquence du i-ème mot dans un texte.

Les données d'étiquette de vérité au sol sont également représentées comme un vecteur avec 4 000 éléments, comme [0, 0, 1, 0, 1, ...., 0]. i-ème élément indique si la i-ème étiquette est une étiquette positive pour un texte. Le nombre d'étiquettes d'un texte varie en fonction des textes.

J'ai un code pour la classification de texte en une seule étiquette.

Comment puis-je modifier le code suivant pour la classification de texte multi-étiquettes?

Surtout, je voudrais savoir les points suivants.

  • Comment calculer la précision à l'aide de TensorFlow.
  • Comment définir un seuil qui juge si une étiquette est positive ou négative. Par exemple, si la sortie est [0,80, 0,43, 0,21, 0,01, 0,32] et la vérité fondamentale est [1, 1, 0, 0, 1], les étiquettes avec des scores supérieurs à 0,25 doivent être jugées positives.

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
34
Benben

Changez relu en sigmoïde de la couche de sortie. Modifier la perte d'entropie croisée en une formule mathématique explicite de perte d'entropie croisée sigmoïde (la perte explicite fonctionnait dans mon cas/version de tensorflow)

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
        #changed relu to sigmoid
        self.output = tf.nn.sigmoid(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()
    # modified cross entropy to explicit mathematical formula of sigmoid cross entropy loss
    cross_entropy = -tf.reduce_sum( (  (y_*tf.log(out + 1e-9)) + ((1-y_) * tf.log(1 - 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
13
Alok Nayak

Vous devez utiliser des variations de la fonction d'entropie croisée dans d'autres pour prendre en charge la classification multi-étiquettes. Dans le cas où vous avez moins de mille sorties, vous devez utiliser sigmoid_cross_entropy_with_logits , dans votre cas où vous avez 4000 sorties, vous pouvez considérer échantillonnage candidat car il est plus rapide que le précédent.

Comment calculer la précision à l'aide de TensorFlow.

Cela dépend de votre problème et de ce que vous souhaitez réaliser. Si vous ne voulez manquer aucun objet dans une image, alors si le classificateur va bien sauf un, alors vous devriez considérer l'image entière comme une erreur. Vous pouvez également considérer qu'un objet manqué ou mal classé est une erreur. Ce dernier je pense qu'il a pris en charge par sigmoid_cross_entropy_with_logits.

Comment définir un seuil qui juge si une étiquette est positive ou négative. Par exemple, si la sortie est [0,80, 0,43, 0,21, 0,01, 0,32] et la vérité fondamentale est [1, 1, 0, 0, 1], les étiquettes avec des scores supérieurs à 0,25 doivent être jugées positives.

Le seuil est un chemin à parcourir, vous devez décider lequel. Mais c'est une sorte de piratage, pas une véritable classification multilable. Pour cela, vous avez besoin des fonctions précédentes que j'ai déjà dites.

14
jorgemf