刚入门,很多东西都是第一次写,望指教。。。
就两部分
double* forward(double *out,int outlength)前向传播。
double* backward(double* e, int elength)后向遍历。
整体以cell为对象处理一个输入输出矩阵。
当然,我也是从不加sigmoid开始的。
直接前向[w1*x+w2*y]反向[w+或-e*out]
[.................]
比较懒。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<iostream>
using namespace std;
double sig(double x)
{
return 1 / (1 + exp(-x));
}
class cell
{
public:
int insig_row, out_columu; double v;
double* out;
double** w;
double* insig;
double* back_e;
cell()
{
int i, j;
printf("矩阵输入输出:");
scanf("%d%d", &this->out_columu, &this->insig_row);
v = 1;
this->out = new double[out_columu];
this->w = new double* [insig_row];
for (i = 0; i < insig_row; i++)
this->w[i] = new double[out_columu];
srand(time(NULL));
for (i = 0; i < insig_row; i++)
for (j = 0; j < out_columu; j++)
this->w[i][j] = ((double)rand() / ((RAND_MAX - 1) / 2)) - 1;
this->insig = new double[insig_row];
this->back_e = new double[out_columu];
}
~cell()
{
delete this->out;
for (int i = 0; i < insig_row; i++)
{
delete (this->w[i]);
}
delete w;
delete this->insig;
delete this->back_e;
printf("delete ok!");
}
double* forward(double *out,int outlength)
{
int i, j; double sum = 0;
for (j = 0; j < insig_row; j++)
{
sum = 0;
for (i = 0; i < out_columu && i < outlength; i++)
{
this->out[i] = out[i];
sum += this->out[i] * w[j][i];
}
insig[j] = sig(sum);
//insig[j] = sum;
}
return insig;
}
double* backward(double* e, int elength)
{
int i, j, k;double sum=0;
for (i = 0; i < out_columu; i++)
{
sum = 0;
for (j = 0; j < insig_row; j++)
sum += insig[j] * (1 - insig[j]) * w[j][i];
back_e[i] = sum;
}
for (j = 0; j < insig_row; j++)
for (i = 0; i < out_columu; i++)
w[j][i] = w[j][i] + e[j] * insig[j] * (1 - insig[j]) * out[i]*v;
//w[j][i] = w[j][i] + e[j] *out[i];
return back_e;
}
void adjust_v(double* e, int elength)
{
double sum=0;
for (int i = 0; i < elength; i++)
sum += e[i];
this->v = 1 * (sum / elength);
}
void print(void)
{
int i, j;
printf("矩阵:\n");
for (i = 0; i < insig_row; i++)
{
for (j = 0; j < out_columu; j++)
printf("%+9.4lf ", this->w[i][j]);
printf("\n");
}
}
};
void printeroror(double* e,int elength )
{
double sum=0;
printf("误差:");
for (int i = 0; i < elength; i++)
{
printf("%-9.6lf ", e[i]);
//sum += e[i];
}
//printf("总误差:%lf", sum);
printf("\n");
}
void printout(double* out, int i)
{
printf("输出:");
for (int i = 0; i < 3; i++)
{
printf("%-9.4lf ", out[i]);
}
printf("\n");
}
int main()
{
cell trainstart, trainend;
double target[3] = { 0.5,0.5,0.5 }, e[3] = { 0 }, in[3] = { 0.985,0.156,0.680 }, *out;
for (int times = 0; times < 1000000; times++) {
out = trainstart.forward(in, 3);
out = trainend.forward(out, 3);
e[0] = target[0] - out[0];
e[1] = target[1] - out[1];
e[2] = target[2] - out[2];
printeroror(e, 3);
out = trainend.backward(e, 3);
out = trainstart.backward(out, 3);
}
trainstart.print();
trainend.print();
printeroror(e, 3);
/*cell t; double target[3] = { 0.5,0.5,0.5 }, e[3] = { 0 }, in[3] = { 0.9,0.4,0.1 }, * out;
for (int i = 0; i < 10000; i++)
{
t.print();
out = t.forward(in, 3);
e[0] = target[0] - out[0];
e[1] = target[1] - out[1];
e[2] = target[2] - out[2];
out = t.backward(e, 3);
printeroror(e, 3);
}*/
return 0;
}