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.
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
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
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.