J'ai écrit le programme de classification binaire suivant dans tensorflow qui est buggé. Le coût revient à zéro tout le temps, peu importe ce que l'entrée est. J'essaye de déboguer un plus grand programme qui n'apprend rien des données. J'ai réduit au moins un bug à la fonction de coût retournant toujours zéro. Le programme donné utilise des entrées aléatoires et rencontre le même problème. self.X_train
et self.y_train
est à l'origine censé lire des fichiers et la fonction self.predict()
a plus de couches formant un réseau neuronal feedforward.Fonction de coût retournant toujours zéro pour une classification binaire en tensorflow
import numpy as np
import tensorflow as tf
class annClassifier():
def __init__(self):
with tf.variable_scope("Input"):
self.X = tf.placeholder(tf.float32, shape=(100, 11))
with tf.variable_scope("Output"):
self.y = tf.placeholder(tf.float32, shape=(100, 1))
self.X_train = np.random.rand(100, 11)
self.y_train = np.random.randint(0,2, size=(100, 1))
def predict(self):
with tf.variable_scope('OutputLayer'):
weights = tf.get_variable(name='weights',
shape=[11, 1],
initializer=tf.contrib.layers.xavier_initializer())
bases = tf.get_variable(name='bases',
shape=[1],
initializer=tf.zeros_initializer())
final_output = tf.matmul(self.X, weights) + bases
return final_output
def train(self):
prediction = self.predict()
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=self.y))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(cost, feed_dict={self.X:self.X_train, self.y:self.y_train}))
with tf.Graph().as_default():
classifier = annClassifier()
classifier.train()
Si quelqu'un pourrait s'il vous plaît comprendre ce que je fais mal dans ce domaine, je peux essayer de faire le même changement dans mon programme original. Merci beaucoup!
La perte sigmoïde mesure l'erreur de probabilité dans les tâches de classification discrètes dans lesquelles chaque classe est indépendante et non mutuellement exclusive. Cette perte ne sera pas efficace pour un problème de classification binaire. –
@Ishant, vous semblez être des termes confus - pour une ** classification binaire ** il n'y a que deux options, soit vous êtes un membre de classe 1 ou 2, c'est pourquoi vous pouvez modéliser ** une ** probabilité avec sigmoïde . P (y = 1 | x) = sigmoïde (f (x)), comme par la définition même de la probabilité P (y = 2 | x) = 1 - P (y = 1 | x). Il n'y a pas de problème ici avec l'exclusivité mutuelle. Cependant, si vous avez plus de 2 classes alors vous avez raison, sigmoïde ne peut pas être appliqué. C'est exactement comme cela (entre autres modèles) que la régression logistique est dérivée. – lejlot
Le mal n'est pas grand, mais ce n'est pas "pas de mal" - vous allouez plus de mémoire (peu importe si la dernière couche est petite, mais cela pourrait être important), vous gaspillez des calculs (car il n'y a rien l'apprentissage peut en bénéficier, mais nous devons calculer un gradient supplémentaire), enfin pour les réseaux neuronaux, il n'est pas clair si cette redondance n'affectera pas la dynamique d'apprentissage (puisque nous avons encore très peu de compréhension des surfaces de perte des réseaux profonds). une meilleure stratégie pour éviter toute complexité inutile. – lejlot