/* * Sample program for CDA5125 * * One neuron neural network, able to learn logic and/or operation */ #include #include #include using namespace std; double X[4][2] = {{0.0, 0.0}, {0.0, 1.0}, {1.0, 0.0}, {1.0, 1.0}}; double Y[4] = {0.0, 0.0, 0.0, 1.0}; double ii1, ii2; double w1=0.0, w2=0.0, b=0; double sum, o; double err; double rate = 0.1; double sigmoid(double x) { return 1/(1+exp(-x)); } double forward(double i1, double i2) { ii1 = i1; ii2 = i2; sum = w1*i1 + w2*i2 + b; o = sigmoid(sum); return o; } double derr_do, do_dsum, dsum_db, dsum_dw1, dsum_dw2; double backward(double O, double Y) { err = (Y-O) * (Y-O)/2; /* err = 1/2*(t-y)^2 */ derr_do = O - Y; do_dsum = sigmoid(sum)*(1 - sigmoid(sum)); dsum_db = 1; dsum_dw1 = ii1; dsum_dw2 = ii2; b = b - rate * derr_do * do_dsum * dsum_db; w1 = w1 - rate * derr_do * do_dsum * dsum_dw1; w2 = w2 - rate * derr_do * do_dsum * dsum_dw2; /* cout << "derr_do= " << derr_do << "do_dsum= " << do_dsum << "dsum_db= " << dsum_db << "dsum_dw1= " << dsum_dw1 << "dsum_dw2= " << dsum_dw2 << "\n"; */ } void train(int iter) { for (int i = 0; i< iter; i++) { int ii = random () % 4; forward(X[ii][0], X[ii][1]); backward(o, Y[ii]); /* cout << "train (" << X[ii][0] << ", " << X[ii][1] << "), o=" << o << ", y=" << Y[ii] << "\n"; cout << "b = " << b << ", w1=" << w1 << ", w2=" << w2 << "\n"; */ if (i % 10000 == 0) cout << "Iter " << i << ": err =" << err << "\n"; } } int main(int argc, char *argv[]) { w1 = 0.45; w2 = 0.1; b = 0.3; if (argc == 2) train(atoi(argv[1])); else train(100000); cout << "w1 = " << w1 << ", w2 = " << w2 << ", b = " << b << "\n"; cout << "0 0 -> " << forward(0, 0) << "\n"; cout << "0 1 -> " << forward(0, 1) << "\n"; cout << "1 0 -> " << forward(1, 0) << "\n"; cout << "1 1 -> " << forward(1, 1) << "\n"; }