У меня есть 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...
Это происходит в правильном направлении, но идея заключается в том, что вместо того, чтобы 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)))
atan2
(с использованиемout_radians
, в данном случае) не является хорошей идеей, и вместо этого лучше использоватьouts
иoutc
определить потери. Это то, что я делаю здесь, потери вычисляются из предсказанных синусов и косинусов. Однако, если вы хотите получить фактическое значение угла, вам нужно в какой-то момент перейти от синуса и косинуса к радианам, и для этого вам нужноatan2
- но опять же, это не используется в обучении, а только как выход.