【发布时间】:2018-06-02 13:49:30
【问题描述】:
我正在使用 tf scipy interface,在我在 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()
【问题讨论】:
-
您没有传递函数(根据文档在 scipy 和此包装器中都预期)。您正在传递对函数的评估。我从未使用过 tf 或这个包装器,所以没有代码。删除
()以传递函数。例如。step_callback=self.callback. -
天啊,真是个愚蠢的错误。谢谢! (我对 python 和 tf 很陌生)。如果你把它写成答案,我很乐意接受。
标签: python tensorflow callback scipy minimize