输出Ceres自动求导的雅克比

ceres的自动求导是一个非常方便的工具,但为了保证实时性,有时需要自己求雅克比,可以用ceres自动求导求出的雅克比来验证自己求的雅克比对比,验证是否正确。ceres提供了相应的接口,对应的函数为:bool CostFunction::Evaluate(double const *const *parameters, double *residuals, double **jacobians) const。

下面演示一下怎么用,以slam十四讲中的函数为例,相信对这个函数都很熟
y = e x p ( a x 2 + b x + c ) y=exp(ax^2+bx+c) y=exp(ax2+bx+c)
首先构建代价函数的计算模型,代码参考slam十四讲

struct CURVE_FITTING_COST
{CURVE_FITTING_COST(double x, double y) : _x(x), _y(y) {}// 残差的计算template <typename T>bool operator()(const T *const abc, // 模型参数,有3维T *residual) const  // 残差{residual[0] = (T(_y) - ceres::exp(abc[0] * T(_x) * T(_x) + abc[1] * T(_x) + abc[2])); // y-exp(ax^2+bx+c)return true;}const double _x, _y; // x,y数据
};

为了便于演示,对十四讲中的代码做了一些修改,只计算(x_data[10],y_data[10])这个点的雅克比

int main(int argc, char **argv)
{double a = 1.0, b = 2.0, c = 1.0; // 真实参数值int N = 100;                      // 数据点double w_sigma = 1.0;             // 噪声Sigma值cv::RNG rng;                      // OpenCV随机数产生器double abc[3] = {0, 0, 0};        // abc参数的估计值vector<double> x_data, y_data; // 数据N = 100;for (int i = 0; i < N; i++){double x = i / 100.0;x_data.push_back(x);y_data.push_back(exp(a * x * x + b * x + c) + rng.gaussian(w_sigma));}//这里只传入x_data[10],y_data[10]CURVE_FITTING_COST *errfuc = new CURVE_FITTING_COST(x_data[10], y_data[10]);ceres::AutoDiffCostFunction<CURVE_FITTING_COST, 1, 3> errdiff(errfuc);int res_num = 1; //残差的数量int param_num = 3; //参数的数量double **jac = 0;jac = new double *[res_num];jac[0] = new double[param_num];for (int j = 0; j < param_num; ++j){jac[0][j] = 0;}double res[] = {0};const double *const param[] = {abc};errdiff.Evaluate((const double *const *)param, res, (double **)jac);cout << "err: " << res[0] << endl;for (int j = 0; j < param_num; ++j){cout << jac[0][j] << "   ";}cout << endl;return 0;
}

最后输出:err: 3.12333 jac: -0.01 -0.1 -1
err为残差,jac分别为残差关于优化参数在(x_data[10],y_data[10])这个点的雅克比

输出Ceres自动求导的雅克比相关推荐

  1. Ceres求解直接法BA实现自动求导

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 BA,即Bundle Adjustment,通常译为光束法平差,束调整,捆绑调整等.但高翔博士觉得这些 ...

  2. tensorflow with求导_3.4tensorflow2.x自动求导原理函数详解

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: 1.1  tensorflow2.x自动求导 1.1.1         自动求导GradientTape类 GradientT ...

  3. PyTorch的计算图和自动求导机制

    文章目录 PyTorch的计算图和自动求导机制 自动求导机制简介 自动求导机制实例 梯度函数的使用 计算图构建的启用和禁用 总结 PyTorch的计算图和自动求导机制 自动求导机制简介 PyTorch ...

  4. Autograd:自动求导

    2019年年初,ApacheCN组织志愿者翻译了PyTorch1.0版本中文文档(github地址),同时也获得了PyTorch官方授权,我相信已经有许多人在中文文档官网上看到了.不过目前校对还缺人手 ...

  5. PyTorch基础(二)-----自动求导Autograd

    一.前言 上一篇文章中提到PyTorch提供了两个重要的高级功能,分别是: 具有强大的GPU加速的张量计算(如NumPy) 包含自动求导系统的的深度神经网络 第一个特性我们会在之后的学习中用到,这里暂 ...

  6. pytorch如何计算导数_Pytorch的自动求导机制与使用方法(一)

    本文以线性模型为例,讲解线性模型的求解的pytorch梯度实现方法. 要注意几个问题:在PyTorch 0.4.0版本之后,Variable类已经被禁用了,所有的torch.Tensor与torch. ...

  7. Pytorch学习(一)—— 自动求导机制

    现在对 CNN 有了一定的了解,同时在 GitHub 上找了几个 examples 来学习,对网络的搭建有了笼统地认识,但是发现有好多基础 pytorch 的知识需要补习,所以慢慢从官网 API 进行 ...

  8. 深度学习(三十)——Deep Speech, 自动求导

    CTC 推断计算(续) 上图是一个Beam Width为3的Beam Search.Beam Search的细节可参见<机器学习(二十三)>. 由于语音的特殊性,我们实际上用的是Beam ...

  9. 深度学习修炼(三)——自动求导机制

    文章目录 致谢 3 自动求导机制 3.1 传播机制与计算图 3.1.1 前向传播 3.1.2 反向传播 3.2 自动求导 3.3 再来做一次 3.4 线性回归 3.4.1 回归 3.4.2 线性回归的 ...

最新文章

  1. python实现洗牌算法_为什么渔民耶茨最有用的洗牌算法?
  2. c语言中描述y是奇数,4章选择结构程序设计C语言入门习题
  3. Pytorch中CNN入门思想及实现
  4. 【LeetCode笔记】17.电话号码的字母组合(Java、DFS)
  5. Android—修改button属性
  6. idea安装drl插件
  7. 那些“不顾一切”要搞开源的人,现在怎样了?
  8. Android轩辕剑之ActionBar之二
  9. 如何在 Mac 上打开或关闭专注模式?
  10. 打码兔官网 验证码识别 远程答题服务 代答平台 验证码识别软件下载
  11. Excel上传导致系统卡顿的原因分析
  12. 【RT-Thread 开源作品秀】时光空间立方
  13. 奥特曼html代码,和平精英捏脸代码奥特曼
  14. Object不能直接转成int
  15. eval 是做什么的?
  16. 物联网主流技术及其应用场景分析
  17. HTML5期末大作业:餐饮美食网站设计——上海美食介绍(6页) HTML+CSS+JavaScript HTML毕设网页设计 web学生网页设计作业源码
  18. using static简化静态成员的使用
  19. Julia安装与运行
  20. 一个springboot+layui开发模板

热门文章

  1. Python实现链表反转
  2. 闲鱼确认收货后台搭建
  3. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)
  4. CSS | 隐藏滚动条,但保持页面依旧能够滚动
  5. alias无效,source /etc/profile Badly placed ()'s.
  6. 实验室GPU计算资源使用方法
  7. 推荐 7 个 Vue.js 插件,也许你的项目用的上(三)
  8. Android第二课-----Kotlin入门
  9. ClickHouse系列--Too many partitions for single INSERT block (more than 100)
  10. 习语言控制台程序示例