代码之家  ›  专栏  ›  技术社区  ›  kmh

360度预测的keras损失函数

  •  7
  • kmh  · 技术社区  · 8 年前

    tf.mod() % ,我得到一个错误。。。

    LookupError: No gradient defined for operation 'FloorMod' (op type: FloorMod)
    

    def mean_squared_error_360(y_true, y_pred):
      delta = K.minimum(K.minimum(K.abs(y_pred - y_true),
                                  K.abs(y_pred - (360+y_true))),
                                  K.abs(y_true - (360+y_pred)))
      return K.mean(K.square(delta), axis=-1)
    
    def rmse_360(y_true, y_pred):
      return K.sqrt(mean_squared_error_360(y_true, y_pred))
    
    
    model.compile(loss=mean_squared_error_360,
                  optimizer=rmsprop(lr=0.0001),
                  metrics=[rmse_360])
    

    这将处理以下边缘情况。。。我没有遇到过预测<0,所以我没有寻址。

    y =   1  y_pred = 361  err = 0
    y = 359  y_pred =   1  err = 2
    y = 359  y_pred = 361  err = 2
    

    问题

    • 直觉上,我认为使用均方误差和均方误差作为损失之间的结果没有差异。。。梯度将不同,但相同的最佳权重将同时解决这两个问题,对吗?有什么理由选择其中一个吗?我想mse比rmse稍微简单一点,但这应该是微不足道的。我两者都试过了,使用rmse“感觉”比mse更有序地下降。。。这些平方误差的大小是否会使它跳得更厉害?

    提前谢谢。

    编辑

    编辑2-在下面添加我的实现@Patwie答案

    啊。。。三角!!当然不幸的是,我使用的是tf v1.0,它似乎没有tf。atan2()。奇怪的是,我在tf存储库中找不到atan2实现,但我认为asos ben在6095期中的建议实现了这一点。请参见此处: https://github.com/tensorflow/tensorflow/issues/6095

    def atan2(x, y, epsilon=1.0e-12):
      x = tf.where(tf.equal(x, 0.0), x+epsilon, x)
      y = tf.where(tf.equal(y, 0.0), y+epsilon, y)    
      angle = tf.where(tf.greater(x,0.0), tf.atan(y/x), tf.zeros_like(x))
      angle = tf.where(tf.logical_and(tf.less(x,0.0),  tf.greater_equal(y,0.0)), tf.atan(y/x) + np.pi, angle)
      angle = tf.where(tf.logical_and(tf.less(x,0.0),  tf.less(y,0.0)), tf.atan(y/x) - np.pi, angle)
      angle = tf.where(tf.logical_and(tf.equal(x,0.0), tf.greater(y,0.0)), 0.5*np.pi * tf.ones_like(x), angle)
      angle = tf.where(tf.logical_and(tf.equal(x,0.0), tf.less(y,0.0)), -0.5*np.pi * tf.ones_like(x), angle)
      angle = tf.where(tf.logical_and(tf.equal(x,0.0), tf.equal(y,0.0)), tf.zeros_like(x), angle)
      return angle
    
    # y in radians
    def rmse_360_2(y_true, y_pred):
      return K.mean(K.abs(atan2(K.sin(y_true - y_pred), K.cos(y_true - y_pred))))
    

    1 回复  |  直到 8 年前
        1
  •  11
  •   apnorton    6 年前

    弧度

    tf.atan2(tf.sin(a - b), tf.cos(a - b))
    

    根据定义 tf.atan2 在闭合区间内自动给出差值 [-pi, +pi] (即, [-180 degrees, +180 degrees]

    因此,您可以使用

    tf.reduce_mean(tf.abs(tf.atan2(tf.sin(a - b), tf.cos(a - b))))