Keras - 编写自定义优化器并尝试计算get_updates中的第二个渐变

时间:2017-04-12 08:44:17

标签: tensorflow keras

我是优化研究员,我正在尝试编写自定义优化器。我遇到了一个问题。我曾在很多地方问过,到目前为止还没有回应。

获取任何优化器代码,比如只复制SGD。在get_updates的开头,你看到

grads = self.get_gradients(loss, params)

现在在此之后添加以下行:

gradsb = self.get_gradients(loss, [tf.Variable(a) for a in params])

这应计算新张量的渐变,所有值与之前相同

现在试着看看你得到了什么:

for a in gradsb:
   print(a)

你得到一份Nones列表(但是如果你打印列表grads,你会发现它们仍然是Tensors)

为什么呢? 以及如何规避这个问题?这很重要,因为我想为我的算法计算另一个点的渐变。

2 个答案:

答案 0 :(得分:0)

当您撰写gradsb = self.get_gradients(loss, [tf.Variable(a) for a in params])时,您正在为参数中的每个tf.Variable定义新的a。由于损失不依赖于这些新变量,因此您的渐变为None

如果你想计算第二个渐变,你需要确保你根据目标所依赖的Tensors来计算它。

答案 1 :(得分:0)

显然即使更换当前参数矢量也不行!如果我在代码中输入:

    grads = self.get_gradients(loss, params)
    tempparam = [tf.Variable(a) for a in params]
    params = [tf.add(a,a) for a in params]

    gradsn = self.get_gradients(loss, params)
    for a in gradsn:
        print(a)
    params = [tf.Variable(a) for a in tempparam]

结果仍然是没有打印!!

我知道你理解我要做的事情,在get_updates的每次迭代中,我想计算参数张量的(稍微)不同的值的渐变,并使用它来构造参数的更新优化和培训。在keras包中有没有办法做到这一点?