Функция потери угла сравнения для Tensorflow в Python - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть 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's 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...

1 Ответ

0 голосов
/ 19 сентября 2018

Это происходит в правильном направлении, но идея в том, что вместо 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...