多層神經網路的c 實現

2021-06-16 18:56:36 字數 3823 閱讀 8015

上乙個學期一直都在看deep learning的一些理論知識,著重看了一些關於卷積神經網路(convolutional neural network)。趁現在暑假,時間比較充裕寫點程式完善一下之前看的知識。

先給大家上點開胃菜,這兩天寫了個可擴充套件的多層神經網路,裡面沒什麼新東西,沒rbm也沒卷積,就是乙個普普通通的神經網路,寫完這個再打算寫卷積神經網路。

這個程式是基於反向傳播演算法寫的,不熟悉的同學可以看下

ufldl

裡面關於bp的那一部分,我是基於那一部分講解寫得程式 ,當然這個程式寫得還是比較簡陋的,只把bp的大概框架搭了起來,應該比較容易各位初學者的理解。

程式一共可以分為三個部分:neuralnetwork主要用來確定整個網路的結構,以及訓練的測試;hiddenlayer部分顧名思義就是中間層,每個物件是一層,所以可以堆疊起來構建乙個深層的網路;最後乙個部分是logisticregressionlayer,是整個網路的最後一層,我採用了比較常用的softmax來進行誤差計算。

neuralnetwork.h

#include "hiddenlayer.h"

#include "logisticregressionlayer.h"

class neuralnetwork

表示有兩個隱層,第乙個有三個節點,第二個有4個節點

hiddenlayer **sigmoid_layers;

logisticregressionlayer *log_layer;

};

neuralnetwork.cpp

#include #include "neuralnetwork.h"

using namespace std;

neuralnetwork::neuralnetwork(int n, int n_i, int n_o, int nhl, int *hls)

else

}log_layer = new logisticregressionlayer(hidden_layer_size[n_hidden_layer-1], n_out);//最後的softmax層

}neuralnetwork::~neuralnetwork()

void neuralnetwork::train(double** in_data, double** in_label, double lr, int epochs)

else //其他隱層用前一層的輸出作為輸入資料

}//softmax層使用最後乙個隱層的輸出作為輸入資料

log_layer->forward_propagation(sigmoid_layers[n_hidden_layer-1]->output_data);

e += log_layer->cal_error(label[i]);

//反向傳播階段

log_layer->back_propagation(sigmoid_layers[n_hidden_layer-1]->output_data, label[i], lr, n);

for(int n = n_hidden_layer-1; n >= 1; --n)

else

}} cout << "epochs number is " << epoch << " cost function is " << e / (double)n << endl;

} for(int i = 0; i < n; ++i)delete data[i];

delete data;

for(int i = 0; i < n; ++i)delete label[i];

delete label;

}void neuralnetwork::predict(double** data, int n)

else //其他隱層用前一層的輸出作為輸入資料

}//softmax層使用最後乙個隱層的輸出作為輸入資料

log_layer->forward_propagation(sigmoid_layers[n_hidden_layer-1]->output_data);

for(int j = 0; j < n_out; ++j)

cout << endl;

} for(int i = 0; i < n; ++i)delete d[i];

delete d;

}

hiddenlayer.h

#ifndef hiddenlayer

#define hiddenlayer

class hiddenlayer;

#endif

hiddenlayer.cpp

#include #include #include #include "hiddenlayer.h"

using namespace std;

double sigmoid(double x)

double uniform(double _min, double _max)

hiddenlayer::hiddenlayer(int n_i, int n_o)

b = new double [n_out];

double a = 1.0 / n_in;

srand((unsigned)time(null));

for(int i = 0; i < n_out; ++i)

output_data = new double [n_out];

}hiddenlayer::~hiddenlayer()

;#endif

logisticregressionlayer.cpp

#include #include #include #include "logisticregressionlayer.h"

using namespace std;

double uniform_2(double _min, double _max)

logisticregressionlayer::logisticregressionlayer(int n_i, int n_o)

b = new double [n_out];

double a = 1.0 / n_in;

srand((unsigned)time(null));

for(int i = 0; i < n_out; ++i)

output_data = new double [n_out];

}logisticregressionlayer::~logisticregressionlayer()

void logisticregressionlayer::softmax(double* x)

for(int i = 0; i < n_out; ++i)

for(int i = 0; i < n_out; ++i) }

void logisticregressionlayer::forward_propagation(double* input_data)

output_data[i] += b[i];

} softmax(output_data);

}void logisticregressionlayer::back_propagation(double* input_data, double* label, double lr, int n)

b[i] += lr * delta[i] / n; }}

double logisticregressionlayer::cal_error(double* label)

delete l;

return error;

}

神經網路簡介 多層神經網路

如上圖所示,該神經網路有三層。我們標記第一層 也就是輸入層 為a 1 第一層與第二層連線權重為w 1 然後第一層輸入與第一層權重的線性和為z 1 第一層神經元個數為n 1 並依次標記剩餘網路層。可以看出,存在 z l j i 1 n l a l i w l i,j a l w l j a l 1 f...

人工神經網路 多層神經網路

模型原型 sklearn.neural network.mlpclassifier hidden layer sizes 100,activation relu algorithm adam alpha 0.0001,batch size auto learning rate constant le...

MLP 多層神經網路 介紹

接觸神經網路 ann 的時間很長了,以前也只是學了學原理,做過乙個bpn的練習,沒有系統的總結過,最近看torch的原始碼,對mlp有了更多的了解,寫寫自己學到的東西吧,算是做了一次總結!1 高度的並行性 人工神經網路是由許多相同的簡單處理單元併聯組合而成,雖然每個單元的功能簡單,但大量簡單單元的並...