经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++基于armadillo im2col的实现
来源:cnblogs  作者:c艹用户  时间:2021/5/24 10:58:27  对本文有异议

col2im的实现,这是im2col的逆过程
最近学习CNN,需要用到im2col这个函数,无奈网上没有多少使用armadillo的例子,而且armadillo库中似乎也没有这个函数,因此自己写了。
im2col的原理网上一大把,我懒得写了。

1. field<某类>

field<class oT> 是armadillo库中的类,类似于矩阵, 不过这个“矩阵”的每一个元素都是向量或者矩阵。因此用field可以作为四维输入数据使用。

2. 矩阵展开

这个其实还挺简单,使用reshape函数将矩阵变形。不过,armadillo中变形是按照竖向变形的。比如:

  1. 1 2 3
  2. 4 5 6
  3. 7 8 9

这样的矩阵变形成1×9的向量的话:

  1. 1 4 7 2 5 8 3 6 9

会成这样??。。。
但是也不影响,滤波器也是这么变得,相对位置没变呗。。

3. 排列组合

鄙人才疏学浅,只会用一堆for循环来排列组合。。。貌似没找到更好的办法。

4. 其他细节

像是步数、填充什么的,多注意一下就行了。

5. 实现代码

  1. mat im2col(field<mat> input_data, int filter_h, int filter_w, int stride, int pad)
  2. {
  3. int N, C, H, W;
  4. N = input_data.n_rows;
  5. C = input_data.n_cols;
  6. H = input_data(0, 0).n_rows;
  7. W = input_data(0, 0).n_cols;
  8. int out_h = (H + 2 * pad - filter_h) / stride + 1;
  9. int out_w = (W + 2 * pad - filter_w) / stride + 1;
  10. field<mat> img = input_data;
  11. img.for_each([H, W, pad](mat& X) {X.insert_rows(0, pad); X.insert_rows(H + pad, pad); X.insert_cols(0, pad); X.insert_cols(W + pad, pad); });
  12. mat col(out_h * out_w * N, C * filter_h * filter_w, fill::zeros);
  13. for (int n = 0, z = 0; n < N; n++)
  14. {
  15. for (int i = 0; i < out_h; i++)
  16. {
  17. for (int j = 0; j < out_w; j++, z++)
  18. {
  19. for (int k = 0; k < C; k++)
  20. {
  21. mat filter(filter_h, filter_w, fill::zeros);
  22. filter = img(n, k)(span(i * stride, i * stride + filter_h - 1), span(j * stride, j * stride + filter_w - 1));
  23. filter.reshape(1, filter_h * filter_w);
  24. int x = z;
  25. int y0 = filter_h * filter_w * k;
  26. int y1 = filter_h * filter_w * k + filter_h * filter_w - 1;
  27. col(span(x, x), span(y0, y1)) = filter;
  28. }
  29. }
  30. }
  31. }
  32. return col;
  33. }

头文件就是声明和引用。

原文链接:http://www.cnblogs.com/wyblikeswsf/p/14800895.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号