Tensorflow Keras-编写自定义优化器并尝试在get_更新中计算第二个梯度
我是一名优化方面的研究人员,我试图编写一个定制的优化器。我遇到了一个问题。我已经在很多地方问过了,但到目前为止没有任何回应 取任何优化器代码,比如只复制SGD。在get_更新的开头,您会看到Tensorflow Keras-编写自定义优化器并尝试在get_更新中计算第二个梯度,tensorflow,keras,Tensorflow,Keras,我是一名优化方面的研究人员,我试图编写一个定制的优化器。我遇到了一个问题。我已经在很多地方问过了,但到目前为止没有任何回应 取任何优化器代码,比如只复制SGD。在get_更新的开头,您会看到 grads = self.get_gradients(loss, params) 现在,在这一行之后添加以下行: gradsb = self.get_gradients(loss, [tf.Variable(a) for a in params]) 这应该以一个新的张量计算梯度,所有值与以前相同 现在试
grads = self.get_gradients(loss, params)
现在,在这一行之后添加以下行:
gradsb = self.get_gradients(loss, [tf.Variable(a) for a in params])
这应该以一个新的张量计算梯度,所有值与以前相同
现在试着看看你得到了什么:
for a in gradsb:
print(a)
你会得到一个非的列表(但是如果你打印列表梯度,你会发现它们仍然是张量)
为什么??
如何规避这个问题?这一点很重要,因为我想在我的算法的另一个点上计算梯度。当您编写
gradsb=self.get_梯度(损失,[tf.Variable(a)for a in params])
时,您正在为每个a
in params定义一个新的tf.Variable
。由于损失不依赖于这些新变量,因此梯度为None
如果你想计算第二个梯度,你需要确保你是根据目标所依赖的
张量来计算的。显然,即使替换当前的参数向量也不行!!如果我在代码中键入此项:
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_更新的迭代中,我想计算参数张量(稍微)不同值的梯度,并使用它来构造参数更新,以进行优化和训练。在keras软件包中有什么方法可以做到这一点吗?非常感谢,因此在实践中,如何以模块化的方式处理损失函数?如果在函数结束之前我不想更改当前变量,但我想计算损失函数相对于一组新变量张量的梯度,我该怎么做?tf.gradients
允许您计算任何张量相对于任何其他张量的梯度。是的,当然。但在这种情况下,我需要计算损失函数相对于它所依赖的张量的梯度,但是在一个不同于“params”中张量当前值的点进行计算,好的,我可以将params的当前值保存在另一个张量中,然后将params更改为等于我希望计算梯度的新点,计算新的梯度,然后将参数分配到其原始的张量值列表中……但这似乎很奇怪/低效,肯定有更合适的方法吗?不是更有效的方法,因为要计算梯度,需要计算前向传递。你可以在一次会话中获得它。如果你构建了两个图表,请运行调用。请查看上面的我的答案,因为它不适合放在评论框中。谢谢@alexandre Passos当我说“重建图形”时,我的意思是“重新计算损失”,所以用新的参数集再次调用get_gradients。这就是我试图对gradsn=self的线所做的。get_gradients(损失,参数)不应该做向前和向后传递吗?或者我需要先调用另一个函数来计算损失吗?或者具体地说,我需要在get_gradients语句之前添加什么才能实现我在这里需要添加的内容?您需要重新计算损失,例如other_loss=self.compute_loss(params);gradsn=self.get_梯度(其他损失,参数)
self.compute_损失不是有效函数。我试图寻找一个后端函数来计算它,但没有成功,你知道我应该调用什么来计算损失并执行向前传递吗?非常感谢。