phoenix_peak吧 关注:89贴子:13,737
  • 4回复贴,共1

【C++】多层人工神经网络反向学习算法代码

只看楼主收藏回复

#include <fstream>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <ctime>
using namespace std;
double yvRand(double a,double b) {return rand()/double(RAND_MAX)*(b-a)+a;}
void yvNNinit() {
srand(time(0));
}
class yvBPANN {
private:
double a,b;
struct yvPerceptron {
vector<double>x,w,D;
double t,y,d,Dt;
yvPerceptron(int num) {
x.resize(num);
w.resize(num);
for (int i=0;i<num;++i) {
w[i]=yvRand(-2.4/num,2.4/num);
D.push_back(0);
}
t=yvRand(-2.4/num,2.4/num);
Dt=0;
}
double calcy() {
y=0;
for (int i=0;i<x.size();++i)
y+=x[i]*w[i];
return y=1/(1+exp(t-y));
}
double calcd(double standard) {return d=y*(1-y)*(standard-y);}
double calcd(int self,vector<yvPerceptron>nextlayer) {
d=0;
for (int i=0;i<nextlayer.size();++i)
d+=nextlayer[i].w[self]*nextlayer[i].d;
return d*=y*(1-y);
}
void modify(double alpha,double beta) {
for (int i=0;i<w.size();++i)
w[i]+=(D[i]=beta*D[i]+alpha*x[i]*d);
t+=(Dt=beta*Dt-alpha*d);
}
};
vector<vector<yvPerceptron> >network;
public:
yvBPANN(vector<int>amount) {
a=0.1;
b=0.95;
if (amount.size()<2)
return;
network.resize(amount.size()-1);
for (int i=1;i<amount.size();++i)
for (int j=0;j<amount[i];++j)
network[i-1].push_back(yvPerceptron(amount[i-1]));
}
yvBPANN(double alpha,double beta,vector<int>amount) {
a=alpha;
b=beta;
if (amount.size()<2)
return;
network.resize(amount.size()-1);
for (int i=1;i<amount.size();++i)
for (int j=0;j<amount[i];++j)
network[i-1].push_back(yvPerceptron(amount[i-1]));
}
vector<double>calcy(vector<double>x) {
vector<double>t;
for (int i=0;i<network.size();++i) {
t.clear();
for (int j=0;j<network[i].size();++j) {
network[i][j].x=x;
t.push_back(network[i][j].calcy());
}
x=t;
}
return x;
}
void learn(vector<double>x,vector<double>y) {
calcy(x);
for (int i=0;i<network[network.size()-1].size();++i) {
network[network.size()-1][i].calcd(y[i]);
network[network.size()-1][i].modify(a,b);
}
for (int i=network.size()-2;i>=0;--i)
for (int j=0;j<network[i].size();++j) {
network[i][j].calcd(j,network[i+1]);
network[i][j].modify(a,b);
}
}
void save(const char *filename) {
ofstream f(filename,std::fstream::binary);
f.write((char*)(&a),sizeof(double));
f.write((char*)(&b),sizeof(double));
for (int i=0;i<network.size();++i)
for (int j=0;j<network[i].size();++j) {
for (int k=0;k<network[i][j].x.size();++k)
f.write((char*)(&network[i][j].x[k]),sizeof(double));
for (int k=0;k<network[i][j].w.size();++k)
f.write((char*)(&network[i][j].w[k]),sizeof(double));
for (int k=0;k<network[i][j].D.size();++k)
f.write((char*)(&network[i][j].D[k]),sizeof(double));
f.write((char*)(&network[i][j].t),sizeof(double));
f.write((char*)(&network[i][j].y),sizeof(double));
f.write((char*)(&network[i][j].d),sizeof(double));
f.write((char*)(&network[i][j].Dt),sizeof(double));
}
f.close();
}
bool load(const char *filename) {
ifstream f(filename,std::fstream::binary);
if (f) {
f.read((char*)(&a),sizeof(double));
f.read((char*)(&b),sizeof(double));
for (int i=0;i<network.size();++i)
for (int j=0;j<network[i].size();++j) {
for (int k=0;k<network[i][j].x.size();++k)
f.read((char*)(&network[i][j].x[k]),sizeof(double));
for (int k=0;k<network[i][j].w.size();++k)
f.read((char*)(&network[i][j].w[k]),sizeof(double));
for (int k=0;k<network[i][j].D.size();++k)
f.read((char*)(&network[i][j].D[k]),sizeof(double));
f.read((char*)(&network[i][j].t),sizeof(double));
f.read((char*)(&network[i][j].y),sizeof(double));
f.read((char*)(&network[i][j].d),sizeof(double));
f.read((char*)(&network[i][j].Dt),sizeof(double));
}
f.close();
return 1;
} else
return 0;
}
};


IP属地:美国1楼2015-02-12 17:36回复


    2楼2016-04-18 15:45
    收起回复


      来自iPhone客户端3楼2016-05-20 17:37
      回复
        不明觉厉


        IP属地:江苏4楼2016-05-21 18:18
        回复