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
Python Scipy回调只调用一次_Python_Tensorflow_Callback_Scipy_Minimize - Fatal编程技术网

Python Scipy回调只调用一次

Python Scipy回调只调用一次,python,tensorflow,callback,scipy,minimize,Python,Tensorflow,Callback,Scipy,Minimize,我正在使用,在我在tensorflow中定义的自定义函数上使用scipyminimize。我需要调试它,我想使用回调函数来打印一些信息。 然而,尽管迭代次数/函数求值次数/梯度求值次数不止一次,回调函数只调用一次。为什么?我使用scipy(没有tensorflow)也会遇到同样的问题 这是一个带有Rosenbrock函数的MWE(应该说最小值进行23次迭代,53次函数求值,23次梯度求值,但是回调!只打印了两次,一次用于步骤回调,一次用于丢失回调) (补充我的上述评论) 根据报告: 步骤\回调:

我正在使用,在我在tensorflow中定义的自定义函数上使用scipy
minimize
。我需要调试它,我想使用回调函数来打印一些信息。 然而,尽管迭代次数/函数求值次数/梯度求值次数不止一次,回调函数只调用一次。为什么?我使用scipy(没有tensorflow)也会遇到同样的问题

这是一个带有Rosenbrock函数的MWE(应该说最小值进行23次迭代,53次函数求值,23次梯度求值,但是
回调!
只打印了两次,一次用于
步骤回调
,一次用于
丢失回调

(补充我的上述评论)

根据报告:

步骤\回调:在每个优化步骤中调用的函数;参数是所有优化变量的当前值,它们被展平为一个向量

loss_callback:每次计算损失和梯度时都要调用的函数,计算的回迁作为位置参数提供

你必须传递一个函数

一个简单的例子显示了您案例中的问题,没有传递函数;但对函数的评估如下所示

请记住,我将只展示一些纯scipy示例,而不是-argument
self
,我传递的是一个向量(这是回调中的常见情况)。它看起来不同,但它转移到您的案件

代码:

输出:


在您的例子中,您还可以再进行一次调试实验,以显示问题所在。介绍两种不同的回调,一种用于
step\u回调
,另一种用于
loss\u回调
。您将看到,每个函数只被调用一次(在实际开始优化之前进行一次评估!)。

您没有传递函数(根据文档,在scipy和此包装中都是如此)。您正在传递函数的求值。我从未使用过tf或这个包装器,所以没有代码。删除
()
以传递函数。例如,
step\u callback=self.callback
.Omg,这真是个愚蠢的错误。谢谢(我对python和tf非常陌生)。如果你把它写下来作为答复,我很乐意接受。
import tensorflow as tf
import numpy as np

class Solver:
    def __init__(self, session, y, x):
        self.session = session
        self.y = y
        self.x = x
        self.optimizer = tf.contrib.opt.ScipyOptimizerInterface(self.y,
                                              options={'maxiter': 100, 'disp': True},
                                              method='SLSQP',
                                              var_list=[self.x],
                                              var_to_bounds={self.x: (1e-8, np.infty)})

    def optimize(self):
      self.optimizer.minimize(self.session, step_callback=self.callback(), loss_callback=self.callback())

    def callback(self):
        print('CALLBACK!')


def main():
    seed = 0
    np.random.seed(seed)
    tf.set_random_seed(seed)
    session = tf.Session()

    x_size = 10
    x = tf.Variable(np.random.rand(x_size), dtype=tf.float32)
    y = 0.
    for i in range(x_size-1):
        y += 100. * (x[i+1] - x[i]*x[i])**2 + (x[i] - 1)**2

    solver = Solver(session, y, x)

    session.run(tf.global_variables_initializer())

    solver.optimize()


if __name__ == '__main__':
    main()
import numpy as np
from scipy.optimize import minimize, rosen

def callback(xs):
    print('callback')

x0 = np.zeros(5)

print('Wrong passing')
res = minimize(rosen, np.zeros(5), callback=callback(x0))  # need some arg x0 to make it run
                                                           # in your case this is "self"
print('Correct passing')
res = minimize(rosen, np.zeros(5), callback=callback)
Wrong passing
callback
alpha1:  1.0
Correct passing
callback
callback
callback
callback
...
...
alpha1:  1.0