tensorflow:自定义丢失函数的渐变

时间:2017-10-06 13:16:13

标签: python tensorflow neural-network

我有一个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)

1 个答案:

答案 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

而且我还没有找到嵌入在不是玩具的模型中的此功能的示例。