4

У меня было очень странное время с TensorFlow в последние дни, и я не могу думать о том, что происходит не так.Сеть TensorFlow не тренируется?

Я построил эту сеть: link. Это копия примера MNIST от TensorFlow.

В основном, что я сделал, меняет сеть на получение изображений 28x28x1 (оттенки серого MNIST) до 600x800x1 изображений (некоторые изображения я взял самостоятельно, веб-камера с относительно чистым фоном и одним объектом в разных местах).

Что я хотел сделать, так это играть с таким CNN и вывести его на x-местоположение объекта на изображении. Итак, один единственный нейронный выход.

Однако, независимо от того, что я пробовал, сеть всегда выводит 1.0. Даже (когда вы смотрите мой раздел тестирования в конце кода), когда я кормлю все, все нули или все случайные числа в сети.

Конечно, поскольку у меня есть только 21 маркированный тренинг и 7 помеченных тестовых изображений, я ожидал, что производительность будет очень плохой (так как изображения 800x600 пикселей огромны для нейронных сетей и поиск объекта непросто).

... но я понятия не имею, почему сеть всегда выводит 1.0, даже если ее кормят ерундой. Есть идеи?

ответ

5

Глядя на исходном коде, оказывается, что ваш окончательный слой полностью подключен до SoftMax (L.104 в the code you shared) уменьшает каждый пример вплоть до одного выходного класса перед вычислением SoftMax. Поскольку для каждого примера есть только один класс, результатом tf.nn.softmax() op (y_conv) будет матрица batch_size x 1, содержащая 1.0 в каждом элементе, и tf.argmax(), который будет содержать 0 для каждого элемента, поскольку существует только одно значение , Аналогично, применение tf.argmax() к y_train (которое является матрицей batch_size x 1) даст 0 для каждого элемента, поэтому «точность» будет равна 100%.

Чтобы исправить это, вы должны, вероятно, (i) увеличить количество выходных блоков из окончательного полностью подключенного уровня, чтобы быть числом классов, и (ii) кодировать каждую строку y_train как горячий вектор, представляющий истинный класс каждого примера.

+0

Хорошо, я изменил y_train, а выходной слой будет 800-мерным и однострочным. Поэтому, если реальная координата x была, например, 300, чем y_train [300] = 1,0, а все остальные значения - 0,0. К сожалению, сеть отказывается тренироваться: непосредственно в первую эпоху она падает с * Tensor имеет значения NaN *. Есть идеи? – daniel451

+0

Почти наверняка эта строка: 'cross_entropy = -tf.reduce_sum (y_train * tf.log (y_conv))' вычисляет log (0), что является NaN. Вместо использования 'tf.nn.softmax()' и вручную вычисляя кросс-энтропию, попробуйте использовать ['tf.nn.softmax_cross_entropy_with_logits()'] (https://www.tensorflow.org/versions/master/api_docs/ python/nn.html # softmax_cross_entropy_with_logits), который более устойчив к этим проблемам. – mrry

+0

Да, наверное, это была ошибка. Это тренировка сейчас с разными темпами тренировки для оптимизатора :) – daniel451

Смежные вопросы