- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Tensorflow 2.0 tf.keras.Sequential
模型。现在,我的技术规范规定使用 Levenberg-Marquardt 优化器来拟合模型。 Tensorflow 2.0 没有将其作为开箱即用的优化器提供,但它在 Tensorflow Graphics 中可用模块。tfg.math.optimizer.levenberg_marquardt.minimize
函数接受 residuals
(残差是 Python callable
返回张量)和 variables
(对应于我的模型权重的张量列表)作为参数。
将我的模型转换为残差和变量的最佳方法是什么?
如果我理解正确 minimize
函数有效,我必须提供两个残差。第一个残差必须为每个学习案例调用我的模型,并将所有结果聚合到一个张量中。第二个残差必须将所有标签作为单个常数张量返回。问题是tf.keras.Sequential.predict
函数返回一个 numpy 数组而不是张量。我相信,如果我将其转换为张量,则最小化器将无法计算关于变量的雅可比。
变量也有同样的问题。似乎没有办法将模型中的所有权重提取到张量列表中。
最佳答案
tfg.math.optimizer.levenberg_marquardt.minimize
之间有很大区别和 Keras 优化器从实现/API 的角度来看。
Keras 优化器,例如 tf.keras.optimizers.Adam
使用梯度作为输入和更新 tf.Variable
s。
相比之下,tfg.math.optimizer.levenberg_marquardt.minimize
本质上以图形模式展开优化循环(使用 tf.while_loop
构造)。它采用初始参数值并生成更新的参数值,这与 Adam & co 不同,后者仅应用一次迭代并实际更改 tf.Variable
的值。 s 通过 assign_add
.
稍微回到理论大局,Levenberg-Marquardt 不是任何非线性优化问题(例如 Adam)的通用梯度下降式求解器。它专门解决非线性最小二乘优化问题,因此它不是像 Adam 这样的优化器的直接替代品。在梯度下降中,我们计算损失相对于参数的梯度。在 Levenberg-Marquardt 中,我们计算与参数相关的残差的雅可比行列式。具体来说,它反复求解线性化问题Jacobian @ delta_params = residuals
为 delta_params
使用 tf.linalg.lstsq
(内部对从雅可比矩阵计算的 Gram 矩阵使用 Cholesky 分解)并应用 delta_params
作为更新。
注意这个lstsq
操作在参数数量上具有三次复杂性,因此在神经网络的情况下,它只能应用于相当小的网络。
另请注意,Levenberg-Marquardt 通常用作批处理算法,而不是像 SGD 那样的小批处理算法,尽管没有什么能阻止您在每次迭代中对不同小批处理应用 LM 迭代。
我认为你可能只能从 tfg 的 LM 算法中获得一次迭代,通过类似的方法
from tensorflow_graphics.math.optimizer.levenberg_marquardt import minimize as lm_minimize
for input_batch, target_batch in dataset:
def residual_fn(trainable_params):
# do not use trainable params, it will still be at its initial value, since we only do one iteration of Levenberg Marquardt each time.
return model(input_batch) - target_batch
new_objective_value, new_params = lm_minimize(residual_fn, model.trainable_variables, max_iter=1)
for var, new_param in zip(model.trainable_variables, new_params):
var.assign(new_param)
相比之下,我相信以下幼稚的方法
不能用 我们在计算残差之前分配模型参数:
from tensorflow_graphics.math.optimizer.levenberg_marquardt import minimize as lm_minimize
dataset_iterator = ...
def residual_fn(params):
input_batch, target_batch = next(dataset_iterator)
for var, param in zip(model.trainable_variables, params):
var.assign(param)
return model(input_batch) - target_batch
final_objective, final_params = lm_minimize(residual_fn, model.trainable_variables, max_iter=10000)
for var, final_param in zip(model.trainable_variables, final_params):
var.assign(final_param)
主要的概念问题是
residual_fn
的输出相对于其输入没有梯度
params
,因为这个依赖通过
tf.assign
.但由于使用了图形模式中不允许的构造,它甚至可能在此之前失败。
tf.Variables
的 LM 优化器。 , 自
tfg.math.optimizer.levenberg_marquardt.minimize
有一个非常不同的 API,它并不真正适合优化 Keras 模型参数,因为您无法直接计算
model(input, parameters) - target_value
没有
tf.assign
.
关于tensorflow2.0 - 是否可以将 Tensorflow Graphics 的 Levenberg-Marquardt 优化器与 Tensorflow 2.0 模型集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58564821/
我正在使用 Levenberg-Marquardt algorithm最小化 6 个参数的非线性函数。每次最小化我有大约 50 个数据点,但我没有得到足够准确的结果。我的参数彼此相差几个数量级这一事实
我有一些代码可以使理论预测与实验数据相吻合,我想运行 LMA(Levenberg-Marquardt 算法)以使理论与实验相吻合。然而,计算是非常重要的,每个模型在单个处理器上需要大约 10-30 分
我是一名程序员,想了解 Levenberg–Marquardt 曲线拟合算法的工作原理,以便自己实现。是否有任何好的教程可以详细解释它是如何与作为程序员而不是数学家的读者一起工作的。 我的目标是在 o
问题:我最近的任务是设计一个非线性求解器,但我的求解器没有收敛到正确的解。 **预期**:“最小化(x)”方法应该将我的参数 vector x 减少到最小值。 观察到:在我调用“最小化(x)”之后,我
我尝试基于 Numerical Optimization using the Levenberg-Marquardt Algorithm 在 Julia 上实现用于求解非线性方程的 levenberg
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我通常使用 MATLAB 编写代码,但出于某些原因我决定改用 JAVA 方法。 问题很简单:我想了解如何将以下 MATLAB 代码转换为有效的 JAVA 代码。 在 MATLAB 中,我有一个名为 f
我能够使用 peak-o-mat 将曲线拟合到 x/y 数据集, 如下所示。那是线性背景和 10 条洛伦兹曲线。 因为我需要拟合许多相似的曲线,所以我使用 mpfit.py 编写了一个脚本化的拟合例程
我正在将 Matlab 中使用 Levenberg-Marquardt 训练算法的神经网络代码移植到 Python。我正在使用 Neurolab,我相信 Levenberg-Marquardt 训练算
我正在尝试使用 Matlab 中的 levenberg-Marquardt 最小二乘法将具有四个未知参数的巨大函数拟合到我的数据中。我使用了这个命令: [x, resnorm]=lsqcurvefit
我有一个关于如何在 Python 中使用 Levenberg-Marquardt 优化方法的问题。 SCIPY库里有很多optimization methods . 我尝试了两种方法(Nelder-M
我正在尝试将 Levenberg-Marquardt 算法实现为 Keras 优化器,如所述 here但我有几个问题,最大的一个是这个错误 TypeError: Tensor objects are
我正在尝试用 Java 编写 levenberg marquardt,这是我的代码: while (iter <= 10 || mse < 0.0001) { call.cal
我成功地使用了 Eigen 的 Levenberg-Marquart 类,示例来自:http://techblog.rga.com/determining-indoor-position-using-
我正在尝试最小化以下示例函数: F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1]) 最小化这种函数的一般方法是 Leven
在相机校准中,我使用 calibrateCamera() 从校准图案的多个 View 中查找相机参数。它恰恰做了两件事: 1) 假设镜头畸变为零,估计封闭形式的初始相机参数。 2) 运行全局 Leve
我正在尝试根据 Manolis Lourakis ( Available here) ) 用 C 语言编写的 Levenberg-Marquardt 算法构建 mex 文件。我已经做了很多搜索,但还没
我在最小化 python 中的复杂非线性函数时遇到了麻烦。该函数实际上是用于拟合实验数据的拟合模型的卡方。为了获得全局最小值,我使用 scipy 中的 basshopping 函数。该函数是 mini
我正在使用 Matlab 中的 lsqcurvefit 函数对一些实验数据进行建模。数据采用特定形状,因此算法只是调整该形状的系数以改变其振幅等。 该模型运行良好并且拟合良好(我计算了卡方)。 Lev
我是一名优秀的程序员,十分优秀!