當今Deep-Learning已經是火到一定境界了,深度學習神經網絡(DNN)在計算機視覺領域的表現可謂見效非凡。當然,工程上運用了卷積神經網絡來減少計算量而不是全連結的神經網絡-這樣計算量實在太大了。但是,對於神經網絡來說計算量真的不是問題,因為它的結構能夠確保它能夠並行計算,一旦網絡的每一個單元都能夠獨立的進行計算,每一層再多的連結也是同時進行計算的。期待硬件神經網絡的發展。
下面手寫了一套任意隱層數神經網絡構建的C語言函數,能夠方便移植到嵌入式設備中。該程序只是一個基於矩陣全連結形式的基礎深度學習網絡。運用的學習算法為隨機梯度下降法,采用sigmoid函數作為激活函數。在少量樣本擬合中表現不錯。
/* 深度學習神經網絡V1.0 made by xyt 2015/7/23 使用語言:C 本程序構建多層矩陣形神經網絡多輸入單輸出 學習策略:隨機梯度下降 激活函數:sigmoid 使用前必須用srand((unsigned)time(NULL))取隨機映射初始值 */ #ifndef _DNN_H #define _DNN_H #include#include #include #include #define DNN_VEC 8 //輸入訓練組組數 #define DNN_INUM 5 //輸入維度 double dnn_sig(double in){ //sigmoid函數,此處不可變 return 1.0/(1.0+exp(-1.0*in)); } struct dnn_cell{ //神經元結構體 double w[DNN_INUM]; double wb; double in[DNN_INUM]; double out; double error; double v; void SetCell_Default(){ //默認初始化,權值初始化很小 int i; for(i=0;i 0;j--){ l=0; for(i=(j-1)*DNN_INUM;i 具體調用示范如下:
#include#includednn.h using namespace std; int main() { srand( (unsigned)time(NULL) ); double expect[8]={0.23,0.23,0.23,0.23,0.83,0.83,0.83,0.83}; double in[8][5]={1,2,3,4,5, 1.1,2.1,3,3.9,5, 0.8,2.2,3,4.2,5, 0.9,2.1,3,4,5, 5,4,3,2,1, 4.9,4.1,2.9,2,1, 5,4,3.1,2,1, 5,4,2.9,2.1,1 }; dnn_cell a[16]; int i; for(i=0;i<16;i++) a[i].SetCell_InitAll(rand()*2.0/RAND_MAX-1,0.001); DNN_Train(a,4,in,expect,100000); double pp[5]; while(1){ for(i=0;i<5;i++) cin>>pp[i]; cout< 注意期望必須在0~1之間