自定义Keras损失函数中修改张量

我目前正在尝试修改我的网络试图预测的某个变量的误差计算方式。我仍然想使用均方误差(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来通过循环步骤传递修改后的张量。但在你的情况下,不需要循环,可以用张量操作来替代。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注