神经网络与深度学习(三)CPP神经网络库

经过一段时间的沉淀,楼主终于写出了一份自己比较满意的代码(其实还有很多瑕疵挑战着楼主的强迫症)
这份实现并非只是一个网络,而更像是神经网络库
大家可以使用它对每一层的封装建立自己的神经网络
代码链接:

https://github.com/Wchenguang/ShadowNet


简单的介绍:


1.总体上的架构是,将全连接层,输出层进行封装,同时引入了connector的数据结构,用于连接两层,使用了模板的专用化技术,可以连接特定类型的两层,其中,在BP神经网络中,后一层要向connector提交阈值的修改权(指针),在反向传播时还要提交反响传播因子,前一层通过connector获取传播因子以及修改下一层的阈值


环境依赖:Eigen3


下面细说一下

(1)神经元

所有神经元继承于Neutron

Neutron的直接继承者有三个,分别是UnupdatableNWNeutron(无权不可更新神经元)UnupdatableWNeutron(有权不可更新神经元)UpdatableWNeutron(有权可更新神经元)

FullConectedNeutron(全连接层神经元)

        继承自UpdatableWNeutron(全连接层神经元)

        GetPThresold() 返回自身阈值指针

        GetBackForwardFactor() 返回反向传播因子

        Update() 根据连接的connector的数据更新自身权值,修改下一层阈值

OutputNeutron(输出层神经元)

        继承自UnupdatableNWNeutron(无权不可更新神经元)

        InitExpect(需要设置期望输出)

(2)层

所有Layer继承自

template
class Layer
{};


----

template
class FullConectedLayher : public Layer> 全连接层

        继承自 神经元类型是全连接神经元的 Layer

        每个connector必须调用_Init(...)

        使用者必须调用Init(...)

        通过数组管理神经元FullConectedNeutron *Neutrons;


----

template
class OutputLayer : public Layer>  输出层

        继承自 神经元类型是输出层神经元 的Layer

        InitExpects(...) 初始化预期输出 提供 Eigen3的接口

(3)function

提供函数的计算以及导数,目前支持 Liner,Sigmog, PRelu

(4)Connector

所有Connector继承自

template
class Connector
{};

通过模板的专用化指定Connector所支持的层的连接,创建不支持的连接,将无法使用

----

template<>
class Connector, OutputLayer> (连接全连接层以及输出层Sigmod)

        Init(...) 用户必须调用Init()

        Forward() 前向

        BackForward() 反向传播

----

template<>
class Connector, OutputLayer>(连接全连接层以及输出层PRelu)


----

template<>
class Connector, FullConectedLayher>(连接全连接层以及全链接层Sigmod)


----

template<>
class Connector, FullConectedLayher>(连接全连接层以及全链接层PRelu)


----

template<>
class Connector, FullConectedLayher>(用于充当输入层的全连接层 与 全连接层连接)

template<>
class Connector, FullConectedLayher>

(4)Net

详见demo,形象来讲就是通过connector控制Layer的Forward和BackForward




你可能感兴趣的:(学习笔记)