Python SciPy共轭梯度优化在每次迭代后不调用回调方法

Python SciPy共轭梯度优化在每次迭代后不调用回调方法,python,optimization,machine-learning,scipy,theano,Python,Optimization,Machine Learning,Scipy,Theano,为了使用theano实现逻辑回归,我遵循了教程。上述教程使用了SciPy的fmin\u cg优化程序。上述函数的重要参数包括:f要最小化的目标/成本函数,x0用户提供的参数初始猜测,fprime一个函数,它提供函数f在x处的派生函数和callback一个可选的用户提供的函数,在每次迭代后调用 培训功能定义如下: # creates a function that computes the average cost on the training set def train_fn(theta_va

为了使用theano实现逻辑回归,我遵循了教程。上述教程使用了SciPy的
fmin\u cg
优化程序。上述函数的重要参数包括:
f
要最小化的目标/成本函数,
x0
用户提供的参数初始猜测,
fprime
一个函数,它提供函数
f
x
处的派生函数和
callback
一个可选的用户提供的函数,在每次迭代后调用

培训功能定义如下:

# creates a function that computes the average cost on the training set
def train_fn(theta_value):
    classifier.theta.set_value(theta_value, borrow=True)
    train_losses = [batch_cost(i * batch_size)
                    for i in xrange(n_train_batches)]
    return numpy.mean(train_losses)
上面的代码所做的,基本上是遍历训练数据集中的所有小批量,对于每个小批量,计算平均批量成本(即应用于小批量中每个训练样本的成本函数的平均值),并平均所有批次的成本。可能需要指出的是,每个批次的成本是通过
batch\u cost
计算的,这是一个theano函数

在我看来,
回调
函数似乎是被任意调用的,而不是像SciPy中的文档所说的那样在每次迭代之后调用

这是我在分别添加“train”和“callback”打印修改
train\fn
callback
后收到的输出

... training the model
train
train
train
callback
validation error 29.989583 %
train
callback
validation error 24.437500 %
train
callback
validation error 20.760417 %
train
callback
validation error 16.937500 %
train
callback
validation error 14.270833 %
train
callback
validation error 14.156250 %
train
callback
validation error 13.177083 %
train
callback
validation error 12.270833 %
train
train
callback
validation error 11.697917 %
train
callback
validation error 11.531250 %

我的问题是,既然对
train\u fn
的每次调用实际上都是一个训练纪元,我该如何改变行为,以便在
train\u fn
之后调用对
回调的调用?

train\u fn
的每次调用都不一定是一个训练纪元。我不确定快速消费品是如何实现的,但一般来说,每个最小化步骤可能会调用成本或梯度函数不止一次。这是(据我所知)有时需要找到相对于前一步的共轭向量。1

因此,每次
fmin\u cg
采取步骤时都会调用您的回调。如果每次调用cost或gradient函数时都需要调用一个函数,那么只需将调用放在相关函数中即可

1.编辑:至少当它们是非线性方法时是这样。wikipedia页面建议,普通共轭梯度(CG)方法可能不需要多次调用,但我认为它们不适合优化非线性函数。我所看到的CG代码——我想这一定是非线性CG的代码——每一步至少涉及一行搜索。这当然需要对梯度函数进行多次求值