元编程学习实践
腾昵猫
致力于实用技术的研究,同时对哲学也感兴趣。
展开
-
C++元编程与内联性能对比测试
这个图中可以看出,模板元编程实现同样的10*10矩阵点积运算竟然需要516ns,而内联的函数只需要0.747ns。模板函数,作用是计算两个函数的行列对应元素相乘之和,这个也是在编译期能够确定对应关系的,缺点是调用了递归以实现循环,但是增加了inline关键字,以期望其能内联。,因此循环需要依靠递归来实现,这种递归如果不能进行内联,那么函数入栈和退栈都是比较消耗时间的。函数,由于都是编译期确定的值,如果编译器不进行优化,那么应该是模板的。模板函数,这个函数的作用是针对指定的行列,调用。函数,可以看到模板的。原创 2024-01-03 10:51:40 · 424 阅读 · 0 评论 -
C++元编程——CNN进行Minist手写数字识别
【代码】C++元编程——CNN进行Minist手写数字识别。原创 2023-04-10 09:46:35 · 828 阅读 · 0 评论 -
C++元编程——双向RNN
可以看到,训练只要训练6000次结果就稳定了,但是问题在于出来的结果和期望结果有一定的差距。可以看出输出结果是各个输入数据的均值,这个就非常尴尬了。我觉得这和我的训练方式不当可能有关系,下次可以试验每个输入都进行多次训练,直到结果稳定再进行下一个输入的训练。这个试验代码定义了一个3层的DRNN,输入输出分别是3->8->16->2。第二层输入是8*1矩阵;一层包含两个方向的横向节点,最终输出是根据两个节点的输出加权得到。搞了一个双向的RNN,按照网上介绍的双向RNN实现出来的,但是试验结果确非常奇葩。原创 2022-12-08 17:30:23 · 198 阅读 · 0 评论 -
C++元编程——单向深度RNN实现
书接上文,话说两端。通过节点建立RNN有点麻烦,现在又搞了一个深度RNN。就是把单个RNN堆叠起来。废话不多,直接搞代码:最后运算结果显示,这个多层的RNN也是有学习能力的。由于没有足够多的有关联数据(也比较懒,不想搞),所以就没正经试验过。有兴趣的小朋友们可以用自己的数据试一试。原创 2022-12-07 17:54:53 · 683 阅读 · 0 评论 -
C++元编程——计算链和RNN
反向传播时候有个计算链,误差传播时也是反向走过各个计算链,所以这个计算链的概念很重要。下面是这个计算链的实现cal_chain.hpp:下面看一看用这个计算链实现RNN:这个用法当然不是RNN的常规用法。真正的RNN训练应该用一段固定长度的序列进行计算。最好有层内正反向两个传播节点。原创 2022-12-06 11:43:50 · 594 阅读 · 0 评论 -
C++元编程——多通道CNN实现(2)
之前设计的CNN有点问题,与传统的CNN有较大的差距。传统CNN不需要权重层的输出,下面就展示详细的实现。卷积网络cnn.hpp。原创 2022-11-24 09:13:35 · 575 阅读 · 0 评论 -
C++元编程——多通道CNN实现
之前实现的CNN是多层卷积池化最后加上一个判别层形成的,但是只有一个通道一个核。对于三个通道的图像这样显然是不够好的,不能利用颜色信息。所以就大改了一波,形成一个多通道的CNN。上面实现的是一个32*32三通道图像作为输入;一个以sigmoid为激活函数的BP神经网络作为判别层。可看出1000次训练结果已经很不错了;3000次训练已经几乎完全符合。接下来是重点了,我们来展示一下新进的修改。这些就是基本全部的实现了。原创 2022-11-23 15:36:08 · 622 阅读 · 0 评论 -
C++元编程——四维矩阵简单运算实现
四维矩阵是一个二维矩阵,其每个元素都是一个二维矩阵。点积运算规则和二维一致,只是每个元素的运算换做了矩阵对应元素的对乘,对加,仅此而已。但是这却完全体现出了C++元编程的牛X之处。如果是运行时,你就要重新定义一个类型,然后定义这个类型的加减乘除。但是元编程不用,如果推导合理,但是你必须把普通标量运算实现出矩阵版本。基于原来的矩阵,进行了魔改,形成了四维矩阵的点积运算,效果拔群,对于矩阵的运算有效。结果也是NICE的,正确算出了这两个四维矩阵的点积。原创 2022-11-19 23:57:21 · 1128 阅读 · 0 评论 -
C++元编程——CNN实现
就现在来讲,CNN应该就是C++元编程的极限了,再往前也没有什么实际意义了。所以这里也就打个结,算是给自己这段时间的研究一个交代。接下来也没有必要再用C++元编程对机器学习进行艰苦的探索啦。还是专心于自己的专业,干好分内的事。再见,C++元编程!再见,机器学习!原创 2022-11-18 09:17:35 · 850 阅读 · 0 评论 -
C++元编程——池化层实现
池化层正向都是求区域最大值,反向有两种方法:1、记住最大值位置,将回传值赋值到该位置;2、平均值平均分配到区域中。原创 2022-11-17 09:33:35 · 277 阅读 · 0 评论 -
C++元编程——CNN卷积层使用ReLu激活和NAdam更新
CNN的卷积层在出来时候需要经过ReLu激活函数。基于之前对BP神经网络的研究,于是就想能不能采用NAdam对卷积层进行加速,结果是惊人的,原来训练万次可得结果的卷积层仅需500次更新就可以得到完全精确的结果!以下是输入[1-7]*7的7*7矩阵,输出是[1-9]的3*3矩阵。500次训练后,结果可见是完全一致的!原创 2022-11-16 15:53:23 · 588 阅读 · 0 评论 -
C++元编程——CNN卷积层实现
矩阵运算增加了一些东西,比如矩阵间隔填充函数span,以及周围扩充函数pad,这些函数没有使用元编程,因为实在是太耗费编译时间了,而且还可能导致编译器内存太大导致编译不起来。激活函数中增加了方便的计算sigmoid结果的函数sigmoidm。CNN包括RELU层,池化层,卷积层,全连接层。原创 2022-11-16 14:37:35 · 516 阅读 · 0 评论 -
C++元编程——DBN实现
1、多层RBM堆叠,最后采用罗杰斯特回归进行分类选择;2、采用RBM堆叠,然后采用BP神经网络进行梯度下降训练,得到最终的权重;3、多层堆叠RBM,在最后一层加上标志位输入;4、多层堆叠RBM,采用睡醒方式训练;5、多层堆叠RBM,每层RBM上行和下行的权重不同,非首尾层RBM的上行权重为下行权重2倍。由于说法太多,又没有时间一一证明,就用1实现了一个。但是第5种实现方法好像理论依据比较充足,后期有时间再实现吧。下面是多层RBM堆叠,最后采用softmax激活函数的BP神经网络进行模式判别。原创 2022-11-15 13:59:46 · 407 阅读 · 0 评论 -
C++元编程——RBM实现
懒的写什么了,直接上代码吧。受限玻尔兹曼机(RBM),用的是CD更新方法。在实验中发现RBM不能输入全样本集,不然会不收敛。比如v层有3个,你就不能把8种组合都拿进去训练,否则就训练不出个结果,你只选3个它效果会很好,也不知道是为什么。原创 2022-11-11 10:35:48 · 379 阅读 · 0 评论 -
C++元编程——BP神经网络编译期优化
之前的BP神经网络中,矩阵的get函数要用乘法和加法计算出数据所处位置,而实际上,大多数情况下程序获取的是固定位置的数据,所以可以想到使用编译期的计算方法,这样在进行矩阵运算时候可以稍微加快运算速度,而且还可以进行编译期越界检测。运行速度经过测试大概能提升40%。原创 2022-11-10 13:42:01 · 447 阅读 · 0 评论 -
C++元编程——BP神经网络初始化
初始化对于神经网络还比较重要,为了实现可扩展的初始化方法,在原有的神经网络上进行了一些小修改,增加了可扩展的方法来对网络进行初始化。一元三次方程的求解只需要100次不到的训练即可完成。下面展示一下详细的修改。原创 2022-11-09 19:24:11 · 323 阅读 · 0 评论 -
C++元编程——ReLu激活函数的BP神经网络
之前的BP神经网络都使用了sigmoid函数作为激活函数,经过试验,其对于三次方程求解的训练次数一般是3000-4000次。本文对之前的神经网络进行了功能增强,使其能够自定义激活函数。经过试验,使用ReLu函数作为激活函数的程序运行600次左右即可求得结果。激活函数模板,目前只实现了sigmoid和ReLu(要记得将原来base_function.hpp中对应的代码去掉,否则会出现编译问题)。原创 2022-11-07 13:26:41 · 695 阅读 · 0 评论 -
C++元编程——nadam优化的bp神经网络
使用C++元编程实现了矩阵运算,并在此基础上在之前的bp神经网络程序中做了一些优化,同时实现了nadam,并进行了测试,发现nadam确实会比adam快一些。原创 2022-11-07 10:47:50 · 367 阅读 · 0 评论 -
C++元编程——Adam优化BP神经网络
用C++模板实现了Adam优化的BP神经网络。原创 2022-11-03 16:40:16 · 587 阅读 · 0 评论 -
C++元编程——BP神经网络实现
使用元编程的方法实现了一个bp神经网络,代码足够简洁,原理上将效率也比较高。原创 2022-11-02 09:49:25 · 376 阅读 · 0 评论 -
C++元编程实现数组全排列
通过元编程的方法,实现了元数组的全排列,为行列式求和作技术准备。原创 2022-10-31 17:51:11 · 511 阅读 · 0 评论 -
C++元编程——模板容器类
元编程中有时候会需要容器已容纳暂时的数据。以下实现了一种支持插入、连接的类模板。原创 2022-10-27 13:12:19 · 595 阅读 · 0 评论 -
C++元编程实现简单矩阵运算
使用C++模板元编程的方法实现了矩阵的加、乘、数值乘、sigmoid运算。该模板支持各种算法的扩展。不过细节尚未完备,所以只作为训练学习。原创 2022-10-26 11:29:32 · 337 阅读 · 0 评论