Python 中 Tensorflow 的角度比较损失函数
Angles Comparasion Loss Function for Tensorflow in Python
我有一个 CNN,输入一张图像,输出一个值 - 一个角度。数据集由 (x = image, y = angle) 对组成。
我想要网络为每个图像预测一个角度。
我发现了这个建议:https://stats.stackexchange.com/a/218547但我似乎无法理解如何将它转化为 Python 代码中的工作 Tensorflow。
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...
这是正确的方向,但想法是,不是让 MyCNN
为每个示例生成一个角度值,而是生成两个值。因此,如果 MyCNN
的 return 值当前的形状类似于 (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)))
我有一个 CNN,输入一张图像,输出一个值 - 一个角度。数据集由 (x = image, y = angle) 对组成。
我想要网络为每个图像预测一个角度。
我发现了这个建议:https://stats.stackexchange.com/a/218547但我似乎无法理解如何将它转化为 Python 代码中的工作 Tensorflow。
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...
这是正确的方向,但想法是,不是让 MyCNN
为每个示例生成一个角度值,而是生成两个值。因此,如果 MyCNN
的 return 值当前的形状类似于 (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)))