首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Levenberg-Marquardt优化算法作为自定义优化器的keras实现

Levenberg-Marquardt优化算法作为自定义优化器的keras实现
EN

Stack Overflow用户
提问于 2018-06-17 19:17:33
回答 1查看 5.6K关注 0票数 4

我正在尝试将Levenberg-Marquardt算法实现为Keras优化器,就像这里描述的那样,但是我有几个问题,最大的问题就是这个错误。

代码语言:javascript
运行
复制
TypeError: Tensor objects are not iterable when eager execution is not enabled. To iterate over this tensor use tf.map_fn.

快速搜索后,我发现这与tensorflow是如何用图运行程序有关的,我对此不太了解。我发现这个答案很有用从此以后,但它是关于丢失函数的,而不是优化器。

所以说重点。

我的尝试是这样的:

代码语言:javascript
运行
复制
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后端?

我是说,在这一行里

代码语言:javascript
运行
复制
H = K.dot(g, K.transpose(g)) + self.tau * K.eye(K.max(g))

我应该使用keras后端函数,或者numpy或纯python来运行这段代码,而不会出现输入数据是numpy数组的问题吗?

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

我是否正确地实现了LMA?我不得不说,我不知道如何处理边界条件,τ/lambda值我已经猜到了,也许你知道更好的方法?

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

Q4,我需要以任何方式改变本地文件optimizers.py吗?

为了正确运行它,我用以下方法初始化优化器:

代码语言:javascript
运行
复制
myOpt = Leveberg_Marquardt()

然后简单地把它传递给complie方法。然而,在快速查看了optimizers.py的源代码之后,我发现thera是代码中具有明确性、写好的优化器名称(例如反序列化函数)的地方。对我的自定义优化器进行扩展是很重要的,还是我可以保留它呢?

我非常感谢对未来行动的任何帮助和指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-29 14:43:52

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库支持按名称调用内置类和函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50899741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档