Python中Tensorflow的角度比较损失函数

时间:2018-09-19 15:01:20

标签: python tensorflow conv-neural-network angle loss-function

我有一个CNN,拍摄一张图像,输出一个值-一个角度。数据集由(x =图像,y =角度)对组成。

我希望每个图像的网络都能预测角度。

我发现了以下建议: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...

1 个答案:

答案 0 :(得分:1)

这朝着正确的方向发展,但是其思想是,不是让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)))