Модель не будет тренироваться (потеря не движется)

TL; DR: я не могу найти свою ошибку при использовании оптимизатора Tensorflow для обучения чрезвычайно маленькой нейронной сети. Потеря либо не движется, либо движется один раз, затем застревает (кажется, что ей действительно нравится значение 0.693147, которое равно ln(2)...).

Проблема и код: я пытаюсь реализовать 12-сетевую часть каскадного классификатора в Li и др. ( Здесь) в Tensorflow. Это очень простая сеть, но, похоже, ничто из того, что я пытаюсь сделать, не дает этому тренироваться

import tensorflow as tf
import tensorflow.contrib.slim as slim
import cv2
import numpy as np


input_tensor = tf.placeholder(tf.float32, shape=[1, 12, 12, 3])
input_label = tf.placeholder(tf.float16, shape=[1, 2])
conv_1 = slim.conv2d(input_tensor, 16, (3, 3), scope='conv1')
pool_1 = slim.max_pool2d(conv_1, (3, 3), 2, scope='pool1')
flatten = slim.flatten(pool_1)
fully_con = slim.fully_connected(flatten, 16, scope='full_con')
fully_con_2 = slim.fully_connected(fully_con, 2, scope='output')
probs = tf.nn.softmax(fully_con_2)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=input_label, logits=fully_con_2))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=.001).minimize(loss)

Это определяет сеть. Он принимает (пока что одно) изображение и метку 12x12, выполняет одну свертку 3x3 с фильтрами шага 1 и 16, максимальный пул 3x3 с шагом 2, затем полностью соединяется с 16 объектами и, наконец, выполняет двоичную классификацию. Я могу выполнить прямой проход через код, поэтому я не думаю, что проблема здесь. Это мой тренировочный цикл - у меня есть 3 изображения 12x12 (2 лица, 1 дерево), и я просто поочередно передаю их оптимизатору (очевидно, это не лучшая практика обучения, но я просто пытаюсь заставить ее работать):

if __name__ == '__main__':
    im = cv2.imread('resized.jpg').reshape(1, 12, 12, 3).astype('float16')
    im2 = cv2.imread('resized2.jpg').reshape(1, 12, 12, 3).astype('float16')
    im3 = cv2.imread('resize3.jpg').reshape(1, 12, 12, 3).astype('float16')
    im_lab_1 = np.array([[0, 1]], dtype='float16')
    im_lab_2 = np.array([[0, 1]], dtype='float16')
    im_lab_3 = np.array([[1, 0]], dtype='float16')

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run(loss, feed_dict={input_tensor: im3, input_label: im_lab_3}))
        for i in range(50000):
            if i % 3 == 0:
                # _, l = sess.run([optimizer, loss], feed_dict=feed1)
                # print(l)
                optimizer.run(feed_dict={input_tensor: im, input_label: im_lab_1})
            elif i % 4 == 0:
                # _, l = sess.run([optimizer, loss], feed_dict=feed2)
                # print(l)
                optimizer.run(feed_dict={input_tensor: im2, input_label: im_lab_2})
            elif i % 5 == 0:
                optimizer.run(feed_dict={input_tensor: im3, input_label: im_lab_3})
        print(sess.run(loss, feed_dict={input_tensor: im3, input_label: im_lab_3}))

Я пробовал оба optimizer.run(...) и закомментированный sess.run([optimizer, loss]...), Первый sess.run(loss...) кажется, выплевывает что-то правильное, но после этого потеря застревает и больше не движется. Очевидно, что я делаю что-то не так, и любая помощь будет оценена!

0 ответов

Другие вопросы по тегам