上乙個學期一直都在看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 高度的並行性 人工神經網路是由許多相同的簡單處理單元併聯組合而成,雖然每個單元的功能簡單,但大量簡單單元的並...