所有由杨清风发布的文章

一个C++14模板元实现的深度学习神经网络模板类,支持任意层数

构造编译期矩阵以及数据传递代码,headonly
搜遍了github,在模板元这块机器学习还是空白,正好是个填补,我接下来会逐渐丰富这个库(倒是有几个模板元数学运算库,都很简陋)
大量的矩阵运算用模板元进行有几个让人非常惬意的优势,也发觉模板元其实很适合这种编程
(不知道是否唯有C++才有的优势,数学专用语言不算在内,比如m、r这些):
1、永远不用担心数组越界,也不用写检查数组越界的代码
2、矩阵运算不用检查行列是否匹配,行列的要求通过模板函数参数就能限定了
3、快,只有cpper才懂的快
代码在这里 https://github.com/bowdar/DeepLearning

先看使用方法,过程极其简单

模板类的申明,开头是用来迭代整形模板参数的UnpackInts,根据Index取值,没有使用TypeList
代码使用到的矩阵模板类和数学公式就没贴了

模板类的实现

用C++11实现C++14的std::get,并且增加默认值功能

需求:

tupel 的 std::get<TYPE> 如果取了不存在的类型就返回一个默认的

首先来看get的实现:

这一段不用多解释,变参模板递归展开,用枚举value的值来指明C++11中std::get<N>的N值,此时get非tuple包含类型会编译错误,这是合理的,现在就要动点手脚让它满足需求

为了满足需求,对get的改动如下(感谢社区mogu提供的方法):

在参数末尾构造了一个T的临时对象,每次get的时候会预先把这个T对象添加到临时创建的一个新tuple里面,很巧妙的,如果是原tuple内的类型会正确返回,如果不是就会匹配到新添加进去的这个从而返回。

不过,需要注意的是新添加进去的这个仅仅是临时对象,它只能保证编译通过,返回的默认类型对象依然析构,所以不要尝试去使用它,当然如果传了生命期足够参数进去就没有问题。

Copy Protected by Chetan's WP-Copyprotect.