C++基于armadillo im2col的实现
最近学习CNN,需要用到im2col这个函数,无奈网上没有多少使用armadillo的例子,而且armadillo库中似乎也没有这个函数,因此自己写了。
im2col的原理网上一大把,我懒得写了。
1. field<某类>
field<class oT> 是armadillo库中的类,类似于矩阵, 不过这个“矩阵”的每一个元素都是向量或者矩阵。因此用field可以作为四维输入数据使用。
2. 矩阵展开
这个其实还挺简单,使用reshape函数将矩阵变形。不过,armadillo中变形是按照竖向变形的。比如:
1 2 3
4 5 6
7 8 9
这样的矩阵变形成1×9的向量的话:
1 4 7 2 5 8 3 6 9
会成这样。。。
但是也不影响,滤波器也是这么变得,相对位置没变呗。。
3. 排列组合
鄙人才疏学浅,只会用一堆for循环来排列组合。。。貌似没找到更好的办法。
4. 其他细节
像是步数、填充什么的,多注意一下就行了。
5. 实现代码
mat im2col(field<mat> input_data, int filter_h, int filter_w, int stride, int pad)
{
int N, C, H, W;
N = input_data.n_rows;
C = input_data.n_cols;
H = input_data(0, 0).n_rows;
W = input_data(0, 0).n_cols;
int out_h = (H + 2 * pad - filter_h) / stride + 1;
int out_w = (W + 2 * pad - filter_w) / stride + 1;
field<mat> img = input_data;
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); });
mat col(out_h * out_w * N, C * filter_h * filter_w, fill::zeros);
for (int n = 0, z = 0; n < N; n++)
{
for (int i = 0; i < out_h; i++)
{
for (int j = 0; j < out_w; j++, z++)
{
for (int k = 0; k < C; k++)
{
mat filter(filter_h, filter_w, fill::zeros);
filter = input_data(n, k)(span(i * stride, i * stride + filter_h - 1), span(j * stride, j * stride + filter_w - 1));
filter.reshape(1, filter_h * filter_w);
int x = z;
int y0 = filter_h * filter_w * k;
int y1 = filter_h * filter_w * k + filter_h * filter_w - 1;
col(span(x, x), span(y0, y1)) = filter;
}
}
}
}
return col;
}
头文件就是声明和引用。
C++基于armadillo im2col的实现的更多相关文章
- C++基于文件流和armadillo读取mnist
发现网上大把都是用python读取mnist的,用C++大都是用opencv读取的,但我不怎么用opencv,因此自己摸索了个使用文件流读取mnist的方法,armadillo仅作为储存矩阵的一种方式 ...
- 算法库:blas, lapack, cblas, clapack, armadillo, openblas, mkl关系
关于blas的介绍介绍见:http://www.cnblogs.com/dzyBK/p/4983953.html blas:提供向量和矩阵的基本运算,用fortran编写. lapack:提供向量和矩 ...
- 基于CPU版本的Caffe推理框架
最近一段时间,认真研究了一下caffe.但是,里面内容过多,集合了CPU版本和GPU版本的代码,导致阅读起来有些复杂.因此,特意对caffe代码进行了重构,搭建一个基于CPU版本的Caffe推理框架. ...
- 深度学习基础-基于Numpy的卷积神经网络(CNN)实现
本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及动手学深度学习的读书笔记.本文将介绍基于Numpy的卷积神经网络(Convolutional Networks,CNN) ...
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- 自定义基于 VLC 的视频播放器
前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
随机推荐
- io流(文件字符流(FileReader,FileWriter文件的复制))
文件字符流(FileReader,FileWriter文件的复制) 文件的复制 效率低的方法 注意:字符流需要刷新操作,字节流不需要,只有刷新后才可以将程序中的内容导入到目标文件中 package c ...
- 使用oracle序列+oracle定时任务获取每月从1开始的流水码
--创建序列 --入库create sequence rk_seq;--出库create sequence ck_seq;--移库create sequence yk_seq; --创建存储过程 cr ...
- Web安全(更新中)
sql注入 创建一个数据库 create database admin1; 查询数据库 查看所有数据库 show databases; 使用该数据库 use admin1; 创建一个表 创建一个 ...
- 201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三-软件工程结对项目 这个课程学习目标 掌握软件开发流程,提高自身能力 这个作业在哪些方面帮助我实现了学习目标 本次实验让我对软件工程 ...
- canvas判断点是否在路径内
应用场景 我们的项目中有个功能是,canvas上的某个图片选中后可以再这个图片上用鼠标拖拽绘制画笔线条. 当然绘制的边界要控制在图片大小范围内的,那么鼠标是可以随意动的,怎么能控制只在图片上的时候才绘 ...
- Spring Boot 2.4 配置文件将加载机制大变化
Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构.如果应用程序仅使用单个 applic ...
- Kubernetes 查看node
// 查看所有节点及labelskubectl get nodes --show-labels 删除节点的labels # 语法 kubectl label nodes <node-name&g ...
- day15.继承
1.什么是继承 继承是一种新建子类的方式,新建的类称之为子类/派生类,被继承的称之为父类/基类 子类会遗传父类的属性 2.为何要用继承 类是解决对象之间冗余问题的 ...
- C#通过rabbitmq实现定时任务(延时队列)
本文主要讲解如何通过RabbitMQ实现定时任务(延时队列) 环境准备 需要在MQ中进行安装插件 地址链接 插件介绍地址:https://www.rabbitmq.com/blog/2015/04/1 ...
- Java基础常用类深度解析(包含常见排序算法)
目录 一.工具类 1.1.工具类的设计 1.1.1.公共静态方法 1.2.单例模式 二.包装类 2.1.基本类型的包装类 2.1.1.Integer 2.1.1.1.Integer >> ...