Тензорный поток - Точность начинается с 1,0 и уменьшается с потерей

aaron ward спросил: 28 марта 2018 в 04:40 в: python

Я тренирую CNN на изображениях в оттенках серого на 10K. В сети есть 6 conv-слоев, 1 полностью подключаемый слой и 1 выходной уровень.

Когда я начинаю тренировать потерю безумно высоко, но неуклонно уменьшается, но моя точность начинается с 1.0 и уменьшается также. и колеблется от 72% до 30% и обратно. Кроме того, когда я запускаю acc.eval({x: test_images, y: test_lables}) на невидимых изображениях, точность составляет около 16%.

Кроме того, у меня есть 6 классов, все из которых разогреваются.

Я думаю, что я могу сравнивать предсказанный вывод неправильно, но не могу увидеть ошибку в моем коде ...

Вот мой код

pred = convolutional_network(x)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels = y, logits = pred))
train_op = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)prediction = tf.nn.softmax(pred)
correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
acc = tf.reduce_mean(tf.cast(correct, 'float'))with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) # Initialize all the variables
    saver = tf.train.Saver()    time_full_start = time.clock()
    print("RUNNING SESSION...")
    for epoch in range(num_epochs):
        train_batch_x = []
        train_batch_y = []
        epoch_loss = 0
        i = 0
        while i < len(images):
            start = i
            end = i+ batch_size
            train_batch_x = images[start:end]
            train_batch_y = labels[start:end]
            op , ac, loss_value = sess.run([train_op, acc, loss], feed_dict={x: train_batch_x, y: train_batch_y})
            epoch_loss += loss_value
            i += batch_size
        print('Epoch : ', epoch+1, ' of ', num_epochs, ' - Loss for epoch: ', epoch_loss, ' Accuracy: ', ac)    time_full_end = time.clock()
    print('Full time elapse:', time_full_end - time_full_start)    print('Accuracy:', acc.eval({x: test_images, y: test_labels}))    save_path = saver.save(sess, MODEL_PATH)
    print("Model saved in file: " , save_path)

И вот выходы

Эпоха: 1 из 100 - Утрата за эпоху: 8.94737603121e + 13 Точность: 1.0

Эпоха: 2 из 100 - Утрата за эпоху: 212052447727.0 Точность: 1.0

Эпоха: 3 из 100 - Урон за эпоху: 75150603462.2 Точность: 1.0

Эпоха: 4 из 100 - Утрата за эпоху: 68164116617.4 Точность: 1.0

Эпоха: 5 из 100 - Утрата за эпоху: 18505190718.8 Точность: 0.99

Эпоха: 6 из 100 - Урон за эпоху: 11373286689.0 Точность: 0.96

Эпоха: 7 из 100 - Утрата за эпоху: 3129798657.75 Точность: 0.07

Эпоха: 8 из 100 - Утрата за эпоху: 374790121.375 Точность: 0.58

Эпоха: 9 из 100 - Утрата за эпоху: 105383792.938 Точность: 0.7 2

Эпоха: 10 из 100 - Урон за эпоху: 49705202.4844 Точность: 0.66

Эпоха: 11 из 100 - Потеря за эпоху: 30214170.7909 Точность: 0.36

Эпоха: 12 из 100 - Потеря за эпоху: 18653020.5084 Точность: 0.82

Эпоха: 13 из 100 - Урон за эпоху: 14793638.35 Точность: 0.39

Эпоха: 14 из 100 - Утрата за эпоха: 10196079.7003 Точность: 0.73

Эпоха: 15 из 100 - Потеря за эпоху: 6727522.37319 Точность: 0.47

Эпоха: 16 из 100 - Утрата за эпоху: 4593769.05838 Точность: 0.68

Эпоха: 17 из 100 - Утрата за эпоху: 3669332.09406 Точность: 0.44

Эпоха: 18 из 100 - Утрата за эпоху: 2850924.81662 Точность: 0.59

Эпоха: 19 из 100 - Утрата за эпоху: 1780678.12892 Точность: 0.51

Эпоха: 20 из 100 - Утрата за эпоху: 1855037.40652 Точность: 0.61

Эпоха: 21 из 100 - Утрата за эпоху: 1012934.52827 Точность: 0.53

Эпоха: 22 из 100 - Утрата за эпоху: 649319.432669 Ac curance: 0.55

Эпоха: 23 из 100 - Утрата за эпоху: 841660.786938 Точность: 0.57

Эпоха: 24 из 100 - Утрата за эпоху: 490148.861691 Точность: 0.55

p> Эпоха: 25 из 100 - Утрата за эпоху: 397315.021568 Точность: 0.5

......................

Эпоха: 99 из 100 - Утрата за эпоху: 4412.61703086 Точность: 0.57

Эпоха: 100 из 100 - Утрата за эпоху: 4530.96991658 Точность: 0.62

Полное время: 794.5787720000001

Точность теста: 0.158095

Я экспериментировал с несколькими уровнями обучения и размерами сети, но, похоже, может заставить его работать. Любая помощь будет оценена

1 ответ

Есть решение
Peter Szoldan ответил: 28 марта 2018 в 12:34

Обратите внимание, что мой ответ также основан на том, что я проверил и отладил полный код (не виден в вопросе). Тем не менее я считаю, что приведенные ниже проблемы являются достаточно общими, чтобы их можно было рассмотреть, если кто-то сталкивается с подобной проблемой - вы может просто найти решение здесь!


Безумно высокие значения потерь могут означать, что вы не конвертировали входные изображения из int8 в маленькие значения float32 правильно (фактически, он сделал), и вы не используете пакетную нормализацию и / или регуляризацию либо (фактически, оба отсутствовали.) Кроме того, в этом коде:
prediction = tf.nn.softmax(pred)
correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))

вычисление значения softmax совершенно не нужно, поскольку softmax является строго монотонной функцией, она только масштабирует прогноз, наибольшее значение в pred будет наибольшим, это prediction, вы получите тот же результат с помощью

correct = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))

Учитывая безумно высокие значения, с которыми работает ваша сеть, возможно, что tf.nn.softmax(), когда возведение в степень и деление на сумму, непреднамеренно уменьшает все g к нулю, а затем tf.argmax() просто выбирает класс 0, пока цифры не уменьшатся. Добавьте к этому то, что вы не накапливаете ac:

op , ac, loss_value = sess.run([train_op, acc, loss], feed_dict={x: train_batch_x, y: train_batch_y})

, так что epoch accuracy, который вы печатаете, не тот, а просто точность из последней партии. Если ваши изображения упорядочены по классам, а пакет не рандомизирован, то вы можете получить изображения нулевого класса в конце каждой эпохи. Это объясняет, почему вы получаете 100% -ную точность в первые несколько эпох , пока сверхвысокие числа не уменьшатся, а softmax больше не обнулит все. (На самом деле так и было.)

Даже после исправления вышеизложенного сеть вообще ничего не изучала. Как оказалось, когда он добавил рандомизацию, изображения и метки были рандомизированы по-разному, что, естественно, привело к постоянной 1/6 точности.

исправив все проблемы, сеть смогла научиться с 98% точностью выполнить эту задачу после 100 эпох.

Эпоха: потеря 100/100: 6.20184610883 общая потеря: 25.4021390676 согласно: 97,976191%

aaron ward ответил: 28 марта 2018 в 07:51
Привет, Питер, спасибо, что вернулся ко мне ... Я сделал случайное изображение и метки, которые действительно снизили невероятно высокие значения потерь и предотвратили 100% точность при начале обучения, и исправили код, чтобы он печатал общую точность для каждой эпохи. (не последняя партия) спасибо за указание на это ... На данный момент я могу уменьшить потери только до ~ 150.00. Смогу ли я выслать вам блокнот jupyter?
Peter Szoldan ответил: 28 марта 2018 в 07:52
Да, пожалуйста. Также данные, которые вы используете.