我是优化研究员,我正在尝试编写自定义优化器。我遇到了一个问题。我曾在很多地方问过,到目前为止还没有回应。
获取任何优化器代码,比如只复制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)
为什么呢? 以及如何规避这个问题?这很重要,因为我想为我的算法计算另一个点的渐变。
答案 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包中有没有办法做到这一点?