繁体   English   中英

Scipy回调仅被调用一次

[英]Scipy callback is called only once

我正在使用tf scipy接口 ,在我在tensorflow中定义的自定义函数上使用scipy minimize 我需要调试它,并且我想使用回调函数来打印一些信息。 但是,尽管迭代次数/函数求值/梯度求值不止一个,但回调函数仅被调用一次。 为什么? 我只用scipy(没有tensorflow)遇到了同样的问题。

这是一个具有Rosenbrock函数的MWE(应该说最小化器执行23次迭代,53个函数求值,23个梯度求值,但CALLBACK!仅打印两次,一次用于step_callback ,一次用于loss_callback )。

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()

(添加到我上面的评论中)

根据文档

step_callback:每个优化步骤要调用的函数; 参数是将所有优化变量的当前值展平为单个向量。

loss_callback:每次计算损失和梯度时都要调用的函数,并提供评估的取值作为位置参数。

您必须传递一个函数。

一个简单的示例,显示您未传递函数的情况下的问题 但是对函数的评估如下。

请记住,我只会显示一些简单的scipy-example,而不是-argument self ,而是传递一个vector(这是回调中的常见情况)。 看起来不一样,但是可以转移到您的案例中!

码:

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

在您的情况下,您还可以再执行一次调试实验来显示问题。 引入两种不同的回调,一种用于step_callback ,一种用于loss_callback 您将看到每个函数仅被调用一次 (在真正开始优化之前只有一次评估!)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM