Edge-Engine

 

Edge : 一个开源的科学计算引擎

README for English_version

声明:本项目禁止闭源商用,如有需要请和作者取得联系

email: zk@likedge.top

GitHub license


 

项目开始日期 : 2019/10/01

测试 : main.cpp | nerual_network.cpp |

2022年11月19日12:28:29:实现卷积神经网络单元前向传播

2019年10月01日12:28:56:新增全连接神经网络架构(新增全连接网络正向传播和反向传播的测试demo)

测试环境:

MacBook Pro、ubuntu

编译器环境:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1 Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.7.0 Thread model: posix

image-20200418210521131

 


这是什么?

path

快速开始

进入install_diff目录:

执行

编译demo入口程序

或者BP测试程序

运行

算子系列

卷积:

测试:

模型定义方法:

作为序列模型api

edge_network作为一个类型存在,位于matrix_grad.h中结构体类型的数据

定义了前向传播函数,前向传播无激活版,反向传播,末层反向传播,四大最常用的函数主体.

完整的序列模型:

image-20200128154352842

实现5层全连接层,可自定义神经元和激活函数,损失函数

全连接层使用方法:

第一层的权重自定义,而后调用forward函数前向传播一层,自动求出激活以后的值,激活函数可自定义.

首先定义一个权重矩阵和偏置矩阵,第一个矩阵的维度大小使用数据列去定义:

之后可以输出第一层前向传播的值,同时可以定义下一层的bias的维度, row使用第一层的权重矩阵的行,第二层的权重矩阵的行使用了第一层的输出的行, 而列自行定义即可, 这一点体现了前向传播算法的维度相容. 也就是:

同时第二层的输出也可以求出来,以此类推 .

最终输出代码见nerual_test.cpp nerual_test1

代码:

Bp反向传播的demo程序基于Pytorch官方代码模拟实现测试

迭代结果 :

W1: 0.6944 1.52368 -1.46644 -0.154097 W2: 1.10079 0.462984 loss: 0.559269

epoch:100 , 可自行测试.

输出最终损失和参数迭代结果.

-----------split-line----------- 2.79955 0.36431 -0.451694 epoch: 100 error: 6.05895 -----------split-line----------- 0.009167(sum of loss)

目前实现的程序接口

API:

反向传播测试demo:

 

演示:矩阵乘法

Matrix A

第1列第2列第3列第4列第5列
72.00000.00000.00000.00000.0000
0.000064.00000.00000.00000.0000
16.00008.00000.00000.00000.0000
0.00000.000056.000016.000032.0000
0.00000.00000.00000.00000.0000
0.00000.00000.00000.00000.0000

MAtrix B

第1列第2列第3列第4列第5列第6列
72.00000.000016.00000.00000.00000.0000
0.000064.00008.00000.00000.00000.0000
0.00000.00000.000056.00000.00000.0000
0.00000.00000.000016.00000.00000.0000
0.00000.00000.000032.00000.00000.0000

To

第1列第2列第3列第4列第5列第6列
5184.00000.00001152.00000.00000.00000.0000
0.00004096.0000512.00000.00000.00000.0000
1152.0000512.0000320.00000.00000.00000.0000
0.00000.00000.00004416.00000.00000.0000
0.00000.00000.00000.00000.00000.0000
0.00000.00000.00000.00000.00000.0000

演示: 矩阵展开(flatten).

double* flatten(Matrix mid1)

123
246
789

To

123246789
        Like numpy.flatten

function:

演示: 邻接矩阵的参数定义:

Matrix appply(Matrix mid1,Matrix mid2,int axis = 0)

参数 axis=0 :

072
031
000
0011
072
031
000
0011

axis = 1:

072072
031031
000000
00110011

更新2019/11/18/00:12

Something :

  1. 矩阵元素默认为1
  2. 使用位运算加速防止填充过大的数值,但是会损失一定精度,慎用.
  3. 记得delete(matrix)在你使用完一个矩阵计算单元以后.
  4. api接口更多的接近于pandas和numpy的使用习惯.
  5. 更多的细节参见目前最新的代码
  6. 欢迎star和关注.
  7. autodiff部分感谢国外博主Omar的思路提醒.

 

个人小站:极度空间

作者邮箱:zk@likedge.top | edge@ibooker.org.cn

QQ:2533524298