基于C++的简单深度学习ANN(人工神经网络)模型

Posted Kalzn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于C++的简单深度学习ANN(人工神经网络)模型相关的知识,希望对你有一定的参考价值。

使用C++实现的简单ANN(人工神经网络)

github地址
使用C++实现的最简单的人工神经网络,包含梯度下降的反向传播算法(BP)。内有部分注释,适合初学学习。至于为什么不用python?还是觉得从最底层(矩阵运算)写比较能加深印象和对算法的理解。(绝对不是因为我不会写python)
警告,此代码仅为初学学习之用,请勿用作任何工程项目!

一、跑起来

方式一

使用vscode+cmake插件或者Clion打开目录。然后直接编译运行。

方式二

1、确保安装cmake环境,没有请先装cmake。
2、在工程目录下键入:

mkdir build
cd build
cmake ..
make

3、运行build目录下的ANN程序

然后在data目录下生成文件output.csv,这是一个回归函数 f ( x ) = 5 ( x 2 − x + 3.5 ) f(x)=5(x^2-x+3.5) f(x)=5(x2x+3.5)的拟合。
拟合情况如下:

二、用起来

1、使用十分简便,首先新建ANN模型,设置误差函数cost及其对于输出层每一项的偏导,这里使用默认的平方差函数

ANNModel model;
model.cost = Sqrt_Cost_Func::sqrt_cost;
model.d_cost = Sqrt_Cost_Func::d_sqrt_cost;

1、设置学习率(一般0.0001~0.1)

model.learning_rate = 0.01;

2、开始添加层级,从输入层开始,直到输出层,这里请保证输入层的神经元个数与输入向量的维度相同。并设置这些层级的激活函数和其导数。

// 输入层 1个神经元
ANNLayer layer0(1);
layer0.activition = Linear_Func::linear;  // 设置本层激活函数为线性函数f(x)=x
                                          // 根据ANN结构,输入层的激活函数应设置为线性
layer0.d_activition = Linear_Func::linear;// 设置本层激活函数的导数
model.add_layer(layer0);

// 隐藏层 20个神经元
ANNLayer layer1(20);
layer1.activition = Signmod_Func::signmod; // 设置本层激活函数为sigmod
layer1.d_activition = Signmod_Func::d_signmod;
model.add_layer(layer1);

// 输出层1个神经院
ANNLayer layer2(1);
layer2.activition = Linear_Func::linear;
layer2.d_activition = Linear_Func::d_linear;
model.add_layer(layer2);

3、编译模型

Compiled_ANNModel compiled_model = model.compile();

4、训练模型,查看输出

Vector data, expectation;
Vector output = compiled_model.feed(data, expectation);

5、只输出,不训练

Vector output = compiled_model.get_output(data);

三、学起来

这里给出最终公式,公式的推导请见其他教程、参考书。

1、获得神经元的激活值,这里使用 a j ( l ) a^(l)_j aj(l)表示第 l l l层的第 j j j个神经元的激活值大小
a j ( l ) = A ( l ) ( z j ( l ) ) a^(l)_j=A^(l)(z^(l)_j) aj(l)=A(l)(zj(l))
其中
z j ( l ) = ∑ k = 0 n ( l − 1 ) − 1 w j , k ( l ) a k ( l − 1 ) + b j ( l ) z^(l)_j=\\sum_k=0^n^(l-1)-1w_j,k^(l)a^(l-1)_k+b^(l)_j zj(l)=k=0n(l1)1wj,k(l)ak(l1)+bj(l)
其中 A ( l ) A^(l) A(l)为第 l l l层的激活函数, w j , k ( l ) w_j,k^(l) wj,k(l)为从 l − 1 l-1 l1层第 k k k个神经元链接到第 l l l层第 j j j个神经元的边权(注意 w w w下标的顺序!),另外 b j ( l ) b^(l)_j bj(l)是第 l l l层第 j j j个神经元的偏置阈值。 n ( l ) n^(l) n(l)为第 l l l层的神经元个数。

2、反向传播公式(以平方差误差函数为例)

σ C σ w j , k ( l ) = a k ( l − 1 ) A ′ ( l ) ( z j ( l ) ) σ C σ a j ( l ) \\frac\\sigma C\\sigma w_j,k^(l) = a^(l-1)_kA^'(l)(z^(l)_j)\\frac\\sigma C\\sigma a^(l)_j σwj,k(l)σC=ak(l1)A(l)(zj(l))σaj(l)σC

其中

σ C σ a j ( l ) = ∑ j = 0 n ( l + 1 ) − 1 w j , k ( l + 1 ) A ′ ( l + 1 ) ( z j ( l + 1 ) ) σ C σ a j ( l + 1 ) l ≠ L 2 ( a j ( l ) − y j ) l = L \\frac\\sigma C\\sigma a^(l)_j =\\left\\ \\beginaligned \\sum_j=0^n^(l+1)-1 w_j,k^(l+1)A^'(l+1)(z^(l+1)_j)\\frac\\sigma C\\sigma a^(l+1)_j \\quad l \\neq L\\\\ 2(a^(l)_j-y_j) \\quad l = L\\\\ \\endaligned \\right . σaj(l)σC= j=0n(l+1)1wj,k(l+1)A(l+1)(zj(l+1))σaj(l+1)σCl=L2(aj(l)yj)l=L

最终有

Δ w j , k ( l ) = − η σ C σ w j , k ( l ) \\Delta w_j,k^(l)=-\\eta \\frac\\sigma C\\sigma w_j,k^(l) Δwj,k(l)

以上是关于基于C++的简单深度学习ANN(人工神经网络)模型的主要内容,如果未能解决你的问题,请参考以下文章

基于C++的简单深度学习ANN(人工神经网络)模型

深度学习笔记——从多层感知机模型(MLP)到人工神经网络模型(ANN)

Matlab基于人工神经网络ANN实现多分类预测(Excel可直接替换数据)

Matlab基于人工神经网络ANN实现多分类预测(Excel可直接替换数据)

[人工智能-深度学习-7]:神经网络基础 - 人工神经网络ANN

机器学习人工神经网络ANN