Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow Keras-编写自定义优化器并尝试在get_更新中计算第二个梯度_Tensorflow_Keras - Fatal编程技术网

Tensorflow Keras-编写自定义优化器并尝试在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]) 这应该以一个新的张量计算梯度,所有值与以前相同 现在试

我是一名优化方面的研究人员,我试图编写一个定制的优化器。我遇到了一个问题。我已经在很多地方问过了,但到目前为止没有任何回应

取任何优化器代码,比如只复制SGD。在get_更新的开头,您会看到

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_损失不是有效函数。我试图寻找一个后端函数来计算它,但没有成功,你知道我应该调用什么来计算损失并执行向前传递吗?非常感谢。