Tensorflow предсказывает всегда тот же результат

Я пытаюсь заставить пример TensorFlow работать с моими собственными данными, но так или иначе классификатор всегда выбирает один и тот же класс для каждого тестового примера. Входные данные всегда перетасовываются ранее. У меня около 4000 изображений в качестве набора для обучения и 500 изображений в качестве набора тестов.

Результат, который я получаю, выглядит так:

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

Правая сторона остается для всех 500 изображений [1. 0.] [1. 0.] . Классификация двоичная, поэтому у меня есть только две метки.

Вот мой исходный код:

 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])) 

Я пропустил пункт?

2 Solutions collect form web for “Tensorflow предсказывает всегда тот же результат”

В вашем коде есть три потенциальные проблемы:

  1. Веса, W , инициализируются до нуля. Этот вопрос из stats.stackexchange.com имеет хорошее обсуждение того, почему это может привести к плохим результатам обучения (например, застрять на локальном минимуме). Вместо этого вы должны их инициализировать случайным образом, например, следующим образом:

     W = tf.Variable(tf.truncated_normal([pixels, labels], stddev=1./math.sqrt(pixels))) 
  2. cross_entropy следует агрегировать до одного скалярного значения, прежде чем минимизировать его, используя, например, tf.reduce_mean() :

     cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(y_prime, y_)) 
  3. Вы можете получить более быструю конвергенцию, если вы тренируете мини-партии (или даже отдельные примеры), а не тренируетесь по всему набору данных сразу:

     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]}) 

Другая проблема, с которой вы можете столкнуться, – дисбаланс Класса. Если у вас есть один класс, который значительно перевешивает другой, ваша функция может сходиться к этому значению. Попробуйте сбалансировать классы в своем учебном образце, а также использовать более мелкие партии. Например, если ваши метки являются двоичными, убедитесь, что в вашем учебном образце имеется одинаковое количество нулей и одна метка.

Python - лучший язык программирования в мире.