我目前正在尝试修改我的网络试图预测的某个变量的误差计算方式。我仍然想使用均方误差(MSE),但我想修改方程中的“差异”部分(因为该变量代表角度度数)。
我尝试了一些方法,但到目前为止都没有成功:
我首先尝试了一种简单迭代的方法
def custom_mean_squared_loss(y_true, y_pred): for sample in range(35): for timestep in range(data_shape[1]): error1 = tf.abs(diff[sample][timestep][6]) error2 = 360 - error1 corrected_err = tf.minimum(error1, error2) test = tf.gather_nd(diff, [[sample, timestep, 6]]) test.assign(corrected_err)
但据我所知,TensorFlow需要明确“声明”操作才能评估它们并计算损失函数的梯度,所以我尝试去掉循环,让它来执行任务:
diff = y_true - y_preddata_shape = y_pred.get_shape()error1 = tf.abs(diff[:][:][6])error2 = 360 - error1corrected_err = tf.minimum(error1, error2)diff[:][:][6].assign(corrected_err)return tf.mean(tf.square(diff), axis=-1)
然而,我无法使赋值行编译通过:
ValueError: Sliced assignment is only supported for variables
回答:
有许多方法可以做到。我更倾向于将diff[:, :, 6]
和tf.minimum
的输出连接起来:
def custom_mean_squared_loss(y_true, y_pred): diff = tf.abs(y_true - y_pred) angle_diff = tf.minimum(diff[:, :, 6:], 360 - diff[:, :, 6:]) error = tf.concat([diff[:, :, :6], angle_diff], axis=-1) return tf.mean(error ** 2, axis=-1)
你可以使用tf.while_loop
来通过循环步骤传递修改后的张量。但在你的情况下,不需要循环,可以用张量操作来替代。