繁体   English   中英

keras将Levenberg-Marquardt优化算法实现为自定义优化器

[英]keras implementation of Levenberg-Marquardt optimization algorithm as a custom optimizer

我试图将Levenberg-Marquardt算法实现为Keras优化器,如此处所述但我有几个问题,最大的一个就是这个错误

TypeError: Tensor objects are not iterable when eager execution is not enabled. To iterate over this tensor use tf.map_fn.

快速搜索之后,我发现这与tensorflow如何运行带有图形的程序有关,我不详细了解。我发现这个答案对于SO有用但它关于损失函数,而不是优化器。

所以说到这一点。

我的尝试看起来像这样:

from keras.optimizers import Optimizer
from keras.legacy import interfaces
from keras import backend as K

class Leveberg_Marquardt(Optimizer):
    def __init__(self, tau =1e-2 , lambda_1=1e-5, lambda_2=1e+2, **kwargs):
        super(Leveberg_Marquardt, self).__init__(**kwargs)
        with K.name_scope(self.__class__.__name__):
            self.iterations = K.variable(0, dtype='int64', name='iterations')
            self.tau = K.variable(tau,name ='tau')
            self.lambda_1 = K.variable(lambda_1,name='lambda_1')
            self.lambda_2 = K.variable(lambda_2,name='lambda_2')

    @interfaces.legacy_get_updates_support
    def get_updates(self, loss, params):
        grads = self.get_gradients(loss,params)
        self.updates = [K.update_add(self.iterations,1)]
        error = [K.int_shape(m) for m in loss]
        for p,g,err in zip(params,grads,error):
            H = K.dot(g, K.transpose(g)) + self.tau * K.eye(K.max(g))
            w = p - K.pow(H,-1) * K.dot(K.transpose(g),err) #ended at step 3 from http://mads.lanl.gov/presentations/Leif_LM_presentation_m.pdf
            if self.tau > self.lambda_2:
                w = w - 1/self.tau * err
            if self.tau < self.lambda_1:
                w = w - K.pow(H,-1) * err
            # Apply constraints.
            if getattr(p, 'constraint', None) is not None:
                w = p.constraint(w)
            self.updates.append(K.update_add(err, w))
        return self.updates

    def get_config(self):
        config = {'tau':float(K.get_value(self.tau)),
                  'lambda_1':float(K.get_value(self.lambda_1)),
                  'lambda_2':float(K.get_value(self.lambda_2)),}
        base_config = super(Leveberg_Marquardt, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

Q1我可以在不深入到tensorflow的情况下修复此错误(我希望我可以通过保持Keras级别来实现这一点)

Q2我是否以正确的方式使用keras后端?

我的意思是,在这一行

H = K.dot(g, K.transpose(g)) + self.tau * K.eye(K.max(g))

我应该使用keras后端函数,或numpy或纯python,以便运行此代码没有输入数据是numpy数组的问题?

Q3这个问题更多的是关于算法本身。

我是否正确实施LMA? 我必须说,我不知道如何处理边界条件,我已经猜到的tau / lambda值,也许你知道更好的方法吗?

我试图了解keras中的其他优化器是如何工作的,但即使SGD代码对我来说也不明确。

Q4我是否需要以任何方式更改本地文件optimizers.py?

为了正确运行它,我正在初始化我的优化器:

myOpt = Leveberg_Marquardt()

然后简单地将它传递给complie方法。 然而,在快速查看optimizers.py的源代码后,我发现thera是代码中的位置,具有明确的优化器名称(例如反序列化函数)。 为我的自定义优化器扩展它是否很重要,或者我可以留下它?

我真的很感激未来行动的任何帮助和方向。

Q1我可以在不深入到tensorflow的情况下修复此错误(我希望我可以通过保持Keras级别来实现这一点)

A1我相信即使修复了这个错误,例如keras不支持的算法实现仍然存在问题,文档中的错误项f(x;w_0)-y对keras优化器不可用。

Q2我是否以正确的方式使用keras后端?

A2是的,您必须使用keras后端进行此计算,因为g是张量对象而不是numpy数组。 但是,我认为H的正确计算应该是H = K.dot(K.transpose(g), g)以取Nx1向量g并执行外积以产生NxN矩阵。

Q3这个问题更多的是关于算法本身。

A3如A1中所述,我不确定keras是否支持此算法所需的输入。

Q4我是否需要以任何方式更改本地文件optimizers.py?

A4如果作为keras的模型编译函数的优化器参数提供,则提供的代码行将运行优化器。 为方便起见,keras库支持按名称调用内置类和函数。

暂无
暂无

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

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