Функция потери угла сравнения для Tensorflow в Python

1

У меня есть CNN, занимает изображение, выдает одно значение - угол. Набор данных выполнен из пары (x = изображение, y = угол).

Я хочу сеть для каждого изображения, чтобы предсказать угол.

Я нашел это предложение: https://stats.stackexchange.com/a/218547 Но я не могу понять, как перевести его в рабочий Tensorflow в коде Python.

x_CNN = tf.placeholder(tf.float32, (None, 14, 14, 3))
y_CNN = tf.placeholder(tf.int32, (None))
keep_prob_CNN = tf.placeholder(tf.float32)
one_hot_y_CNN = tf.one_hot(y_CNN, 1)
def MyCNN(x):
    # Network architecture: In: Image, Out: Angle.
logits_CNN = MyCNN(x)

# Loss Function attempt <------------------------------
outs = tf.tanh(logits_CNN)
outc = tf.tanh(logits_CNN)
loss_operation_CNN = tf.reduce_mean(0.5 * (tf.square(tf.sin(one_hot_y_CNN) - outs) + tf.square(tf.cos(one_hot_y_CNN) - outc)))

learning_rate_placeholder_CNN = tf.placeholder(tf.float32, shape=[])
optimizer_CNN = tf.train.AdamOptimizer(learning_rate = learning_rate_placeholder_CNN)
training_operation_CNN = optimizer_CNN.minimize(loss_operation_CNN)
correct_prediction_CNN = tf.equal(tf.argmax(logits_CNN, 1), tf.argmax(one_hot_y_CNN, 1))
accuracy_operation_CNN = tf.reduce_mean(tf.cast(correct_prediction_CNN, tf.float32))

# And a working Training and testing code...
Теги:
tensorflow
conv-neural-network
loss-function
angle

1 ответ

1
Лучший ответ

Это происходит в правильном направлении, но идея заключается в том, что вместо того, чтобы MyCNN одно значение угла для каждого примера, MyCNN два значения. Поэтому, если возвращаемое значение MyCNN в настоящее время является чем-то вроде формы (None,) или (None, 1), вы должны изменить его на (None, 2) - то есть последний слой должен иметь еще один вывод. Если у вас есть сомнения относительно того, как это сделать, предоставьте более подробную информацию о теле MyCNN.

Тогда у вас просто будет:

outs = tf.tanh(logits_CNN[:, 0])
outc = tf.tanh(logits_CNN[:, 1])
out_radians = tf.atan2(outs, outc)  # This is the final angle output in radians

Про потерю, я не уверен, что понимаю ваш вход Y. Если вы пытаетесь предсказать угол, не должно ли оно быть значением с плавающей точкой, а не целочисленным? В этом случае у вас будет:

# Example angle in radians
y_CNN = tf.placeholder(tf.float32, (None,))

# ... 

loss_operation_CNN = tf.reduce_mean(0.5 * (tf.square(tf.sin(y_CNN) - outs) +
                                           tf.square(tf.cos(y_CNN) - outc)))
  • 0
    О втором окне кода в вашем комментарии, изменившемся на float32, а также изменив 0.5 * THINGS на tf.scalar_mul (0.5, THINGS). Что касается первого окна кода, ссылка, которую я дал, говорит, что использование Atan2 не рекомендуется по сравнению с другим методом использования Tanh. Что ты об этом думаешь ? ауты = tanh (ylogit), outc = tanh (xlogit)) с функцией потерь 0.5 ((sin (pred) - ауты) ^ 2 + (cos (pred) - outc) ^ 2
  • 0
    @MikoDiko Насколько я понимаю, ссылка на этот пост предполагает, что попытка определить потерю в терминах результата atan2 (с использованием out_radians , в данном случае) не является хорошей идеей, и вместо этого лучше использовать outs и outc определить потери. Это то, что я делаю здесь, потери вычисляются из предсказанных синусов и косинусов. Однако, если вы хотите получить фактическое значение угла, вам нужно в какой-то момент перейти от синуса и косинуса к радианам, и для этого вам нужно atan2 - но опять же, это не используется в обучении, а только как выход.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню