经过一段时间的沉淀,楼主终于写出了一份自己比较满意的代码(其实还有很多瑕疵挑战着楼主的强迫症)
这份实现并非只是一个网络,而更像是神经网络库
大家可以使用它对每一层的封装建立自己的神经网络
代码链接:
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
----
template
class OutputLayer : public Layer
继承自 神经元类型是输出层神经元 的Layer
InitExpects(...) 初始化预期输出 提供 Eigen3的接口
(3)function
提供函数的计算以及导数,目前支持 Liner,Sigmog, PRelu
(4)Connector
所有Connector继承自
template
class Connector
{};
通过模板的专用化指定Connector所支持的层的连接,创建不支持的连接,将无法使用
----
template<>
class Connector
Init(...) 用户必须调用Init()
Forward() 前向
BackForward() 反向传播
----
template<>
class Connector
----
template<>
class Connector
----
template<>
class Connector
----
template<>
class Connector
template<>
class Connector
(4)Net
详见demo,形象来讲就是通过connector控制Layer的Forward和BackForward