我有一个LSTM预测tensorflow中的时间序列值。 该模型使用MSE作为损失函数。 但是,我希望能够创建一个自定义丢失函数,其中一个误差值乘以2(因此产生更高的误差值)。
在我的10号批次中,我希望第一个输入的第3个值乘以2,但由于这是时间序列,这对应于第二个输入中的第二个值和第三个输入中的第一个值。
我得到的错误是: ValueError:没有为任何变量提供渐变,请检查图表中不支持渐变的操作
如何制作渐变色?
def loss_function(y_true, y_pred, peak_value=3, weight=2):
# peak value is where the multiplication happens on the first line
# weight is the how much the error is multiplied by
all_dif = tf.squared_difference(y_true, y_pred) # should be shape=[10,10]
peak = [peak_value] * 10
listy = range(0, 10)
c = [(i - j) % 10 for i, j in zip(peak, listy)]
for i in range(0, 10):
indices = [[i, c[i]]]
values = [1.0]
shape = [10,10]
delta = tf.SparseTensor(indices, values, shape)
all_dif = all_dif + tf.sparse_tensor_to_dense(delta)
return tf.reduce_sum(all_dif)
答案 0 :(得分:1)
我相信伪代码看起来像这样:
@tf.custom_gradient
def loss_function(y_true, y_pred, peak_value=3, weight=2)
## your code
def grad(dy):
return dy * partial_derivative
return loss, grad
其中partial_derivative
是关于损失函数的分析评估偏导数。我相信,如果损失函数是一个以上变量的函数,则将需要对每个变量具有偏导数。
如果您需要更多信息,则文档很好:https://www.tensorflow.org/api_docs/python/tf/custom_gradient
而且我还没有找到嵌入在不是玩具的模型中的此功能的示例。