Tensorflow predice siempre el mismo resultado.

Estoy tratando de hacer que el ejemplo de TensorFlow se ejecute con mis propios datos, pero de alguna manera el clasificador siempre elige la misma clase para cada ejemplo de prueba. Los datos de entrada siempre se barajan antes. Tengo alrededor de 4000 imágenes como conjunto de entrenamiento y 500 imágenes como conjunto de prueba.

El resultado que obtengo se ve como:

Result: [[ 1. 0.]] Actually: [ 1. 0.] Result: [[ 1. 0.]] Actually: [ 0. 1.] Result: [[ 1. 0.]] Actually: [ 1. 0.] Result: [[ 1. 0.]] Actually: [ 1. 0.] Result: [[ 1. 0.]] Actually: [ 0. 1.] Result: [[ 1. 0.]] Actually: [ 0. 1.] ... 

El lado derecho permanece para las 500 imágenes [1. 0.] [1. 0.] . La clasificación es binaria, así que solo tengo dos tags.

Aquí está mi código fuente:

 import tensorflow as tf import input_data as id test_images, test_labels = id.read_images_from_csv( "/home/johnny/Desktop/tensorflow-examples/46-model.csv") train_images = test_images[:4000] train_labels = test_labels[:4000] test_images = test_images[4000:] test_labels = test_labels[4000:] print len(train_images) print len(test_images) pixels = 200 * 200 labels = 2 sess = tf.InteractiveSession() # Create the model x = tf.placeholder(tf.float32, [None, pixels]) W = tf.Variable(tf.zeros([pixels, labels])) b = tf.Variable(tf.zeros([labels])) y_prime = tf.matmul(x, W) + b y = tf.nn.softmax(y_prime) # Define loss and optimizer y_ = tf.placeholder(tf.float32, [None, labels]) cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y_prime, y_) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) # Train tf.initialize_all_variables().run() for i in range(10): res = train_step.run({x: train_images, y_: train_labels}) # Test trained model correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(accuracy.eval({x: test_images, y_: test_labels})) for i in range(0, len(test_images)): res = sess.run(y, {x: [test_images[i]]}) print("Result: " + str(res) + " Actually: " + str(test_labels[i])) 

¿Me estoy perdiendo un punto?

Hay tres problemas potenciales en su código:

  1. Los pesos, W , se inicializan a cero. Esta pregunta de stats.stackexchange.com tiene una buena discusión de por qué esto puede llevar a resultados de capacitación deficientes (como quedarse atascado en un mínimo local). En su lugar, debe inicializarlos aleatoriamente, por ejemplo de la siguiente manera:

     W = tf.Variable(tf.truncated_normal([pixels, labels], stddev=1./math.sqrt(pixels))) 
  2. La cross_entropy debe agregarse a un único valor escalar antes de minimizarlo, utilizando por ejemplo tf.reduce_mean() :

     cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(y_prime, y_)) 
  3. Puede obtener una convergencia más rápida si entrena en mini lotes (o incluso en ejemplos individuales) en lugar de entrenar en todo el conjunto de datos a la vez:

     for i in range(10): for j in range(4000): res = train_step.run({x: train_images[j:j+1], y_: train_labels[j:j+1]}) 

El otro problema que puede tener es un desequilibrio de clase. Si tiene una clase que supera ampliamente a la otra, su función puede estar convergiendo a ese valor. Intente equilibrar las clases en su muestra de entrenamiento, así como usar lotes más pequeños. Por ejemplo, si sus tags son binarias, asegúrese de que haya una cantidad igual de ceros y una etiqueta en su muestra de entrenamiento.