Я пытаюсь построить CNN (в Керасе), который может оценить вращение изображения (или 2-го объекта). Таким образом, в основном, вход является изображением, а выход должен быть его вращением.
Мой первый эксперимент - оценить вращение цифр MŃIST (начиная только с одной цифры «класс», скажем, «3»). Поэтому я извлек все 3 с из набора MNIST, а затем построил набор данных «повернутые 3 с», несколько раз произвольно поворачивая эти изображения и сохраняя повернутые изображения вместе с их углами поворота в качестве наземных меток истинности.
Итак, моей первой проблемой было то, что двумерное вращение является циклическим, и я не знал, как смоделировать это поведение. Поэтому я закодировал угол как y = sin (ang), x = cos (ang). Это дает мне мой набор данных (повернутые изображения 3s) и соответствующие метки (значения x и y).
Для CNN, в качестве начала, я просто взял пример CNN keras MNIST (https://keras.io/examples/mnist_cnn/)) и заменил последний плотный слой (который имел 10 выходов и активацию softmax) на плотный слой, который имеет 2 выхода (x и y) и активация tanh (поскольку y = sin (ang), x = cos (ang) находятся в пределах [-1,1]).
Последнее, что я должен был решить, - это функция потерь, где я в основном хочу измерять расстояние для углов. Поэтому я подумал, что "cosine_proximity" - это путь.
При обучении сети я вижу, что потери уменьшаются и сходятся к определенной точке. Однако когда я проверяю прогнозы и основную истину, я наблюдаю (для меня) довольно удивительное поведение. Почти все прогнозы x и y имеют тенденцию к 0 или +/- 1. А так как «декодирование» моего поворота - ang = atan2 (y, x), прогнозы обычно составляют +/- 0 °, 45 °, 90, 135 ° или 180 °.
Тем не менее, мои данные тренировок и испытаний имеют только углы 0 °, 20 °, 40 °, ... 360 °.
Это действительно не изменится, если я изменю сложность сети. Я также безуспешно поиграл с параметрами оптимизатора.
Что-то не так с предположениями:
- x, y кодировка для угла
- активация tanh должна иметь значения в [-1,1]
- cosine_proximity как функция потерь
Заранее спасибо за любые советы, советы или указание на возможную ошибку, которую я совершил!