1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | #include <iostream> #include <math.h> #include <conio.h> using namespace std; int main() { double InputValue[2]; double InputWeight[2][5]; double InputError[2][5]; double HiddenOutput[5]; double HiddenWeight[5]; double HiddenError[5]; double Output; double LearningRate = 1; int trainingSet[4][3] = { {1, 1, 0}, {0, 0, 0}, {1, 0, 1}, {0, 1, 1} }; for (int i = 0; i < 2; i++){ for (int j = 0; j < 5; j++) { //Set input weight InputWeight[i][j] = rand()/(double)RAND_MAX; // 0 - 1 } } for (int i = 0; i < 5; i++) { //Set hidden weight HiddenWeight[i] = rand()/(double)RAND_MAX; } double totalError = 0; do { //TRAIN totalError = 0; //train eachSet for (int tSet = 0; tSet < 4; tSet++) { //Set the input for (int i = 0; i < 2; i++) InputValue[i] = trainingSet[tSet][i]; //Set output to 0 for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) { HiddenOutput[j] = 0; } } //calculate activation of hidden for (int j = 0; j < 5; j++) { for (int i = 0; i < 2; i++) { HiddenOutput[j] += InputWeight[i][j]*InputValue[i]; } //Sigmoid HiddenOutput[j] = 1 / (1 + exp(-HiddenOutput[j])); } //set the output layer to 0 Output = 0; for (int i = 0;i < 5; i++) { Output += HiddenOutput[i] * HiddenWeight[i]; } //Sigmoid Output = 1 / (1 + exp(-Output)); double OutputError = (trainingSet[tSet][2] - Output) * Output * (1-Output); //Set Hidden Error to 0 for (int i = 0; i < 5; i++) { HiddenError[i] = 0; } for (int i = 0; i < 5; i++) { HiddenError[i] += HiddenWeight[i] * OutputError; } for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) { InputError[i][j] = 0; } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) { InputError[i][j] += InputWeight[i][j] * HiddenError[j]; } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) { InputWeight[i][j] += LearningRate * HiddenError[j] * InputValue[i]; } } for (int i = 0; i < 5; i++) { HiddenWeight[i] = LearningRate * OutputError * HiddenOutput[i]; } totalError += pow((trainingSet[tSet][3] - Output), 2) / 2; } cout << totalError << endl; //getch(); } while (totalError > 0.01); //Test for (int tSet = 0; tSet < 4; tSet++) { //Set the input for (int i = 0; i < 2; i++) InputValue[i] = trainingSet[tSet][i]; //Set output to 0 for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) { HiddenOutput[j] = 0; } } //calculate activation of hidden for (int j = 0; j < 5; j++) { for (int i = 0; i < 2; i++) { HiddenOutput[j] += InputWeight[i][j]*InputValue[i]; } //Sigmoid HiddenOutput[j] = 1 / (1 + exp(-HiddenOutput[j])); } //set the output layer to 0 Output = 0; for (int i = 0;i < 5; i++) { Output += HiddenOutput[i] * HiddenWeight[i]; } //Sigmoid Output = 1 / (1 + exp(-Output)); cout << Output << endl; } getch(); return 0; } |
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8Y29uaW8uaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKICAgICAgICBkb3VibGUgSW5wdXRWYWx1ZVsyXTsKICAgICAgICBkb3VibGUgSW5wdXRXZWlnaHRbMl1bNV07CiAgICAgICAgZG91YmxlIElucHV0RXJyb3JbMl1bNV07CiAgICAgICAgZG91YmxlIEhpZGRlbk91dHB1dFs1XTsKICAgICAgICBkb3VibGUgSGlkZGVuV2VpZ2h0WzVdOwogICAgICAgIGRvdWJsZSBIaWRkZW5FcnJvcls1XTsKICAgICAgICBkb3VibGUgT3V0cHV0OwogICAgICAgIGRvdWJsZSBMZWFybmluZ1JhdGUgPSAxOwogICAgICAgIAogICAgICAgIGludCB0cmFpbmluZ1NldFs0XVszXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMSwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCAwLCAxfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspewogICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKICAgICAgICAgICAgICAvL1NldCBpbnB1dCB3ZWlnaHQKICAgICAgICAgICAgICBJbnB1dFdlaWdodFtpXVtqXSA9IHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYOyAvLyAgMCAgLSAgMQogICAgICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICAgICAgIC8vU2V0IGhpZGRlbiB3ZWlnaHQKICAgICAgICAgIEhpZGRlbldlaWdodFtpXSA9IHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYOyAgICAKICAgICAgfQogICAgICAKICAgICAgCiAgICAgIGRvdWJsZSB0b3RhbEVycm9yID0gMDsKICAgICAgZG8geyAvL1RSQUlOCiAgICAgICAgICB0b3RhbEVycm9yID0gMDsKICAgICAgLy90cmFpbiBlYWNoU2V0CiAgICAgIGZvciAoaW50IHRTZXQgPSAwOyB0U2V0IDwgNDsgdFNldCsrKSB7CiAgICAgICAgICAvL1NldCB0aGUgaW5wdXQKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQogICAgICAgICAgICAgIElucHV0VmFsdWVbaV0gPSB0cmFpbmluZ1NldFt0U2V0XVtpXTsKICAgICAgICAgIAogICAgICAgICAgLy9TZXQgb3V0cHV0IHRvIDAKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKICAgICAgICAgICAgICAgICAgSGlkZGVuT3V0cHV0W2pdID0gMDsgICAgCiAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgLy9jYWxjdWxhdGUgYWN0aXZhdGlvbiBvZiBoaWRkZW4KICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgICBIaWRkZW5PdXRwdXRbal0gKz0gSW5wdXRXZWlnaHRbaV1bal0qSW5wdXRWYWx1ZVtpXTsKICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vU2lnbW9pZAogICAgICAgICAgICAgIEhpZGRlbk91dHB1dFtqXSA9IDEgLyAoMSArIGV4cCgtSGlkZGVuT3V0cHV0W2pdKSk7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIC8vc2V0IHRoZSBvdXRwdXQgbGF5ZXIgdG8gMAogICAgICAgICAgT3V0cHV0ID0gMDsKICAgICAgICAgIAogICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSA8IDU7IGkrKykgewogICAgICAgICAgICAgIE91dHB1dCArPSBIaWRkZW5PdXRwdXRbaV0gKiBIaWRkZW5XZWlnaHRbaV07CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIC8vU2lnbW9pZAogICAgICAgICAgT3V0cHV0ID0gMSAvICgxICsgZXhwKC1PdXRwdXQpKTsKICAgICAgICAgIAogICAgICAgICAgZG91YmxlIE91dHB1dEVycm9yID0gKHRyYWluaW5nU2V0W3RTZXRdWzJdIC0gT3V0cHV0KSAqIE91dHB1dCAqICgxLU91dHB1dCk7CiAgICAgICAgICAKICAgICAgICAgIC8vU2V0IEhpZGRlbiBFcnJvciB0byAwCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewogICAgICAgICAgICAgIEhpZGRlbkVycm9yW2ldID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICAgICAgICAgICBIaWRkZW5FcnJvcltpXSArPSBIaWRkZW5XZWlnaHRbaV0gKiBPdXRwdXRFcnJvcjsKICAgICAgICAgIH0gICAgICAgICAgCiAgICAgICAgICAgICAgCiAgICAgICAgICAKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKICAgICAgICAgICAgICAgICAgSW5wdXRFcnJvcltpXVtqXSA9IDA7ICAgIAogICAgICAgICAgICAgIH0gICAgCiAgICAgICAgICB9ICAgIAogICAgICAgICAgCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7CiAgICAgICAgICAgICAgICAgIElucHV0RXJyb3JbaV1bal0gKz0gSW5wdXRXZWlnaHRbaV1bal0gKiBIaWRkZW5FcnJvcltqXTsKICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgfSAgICAKICAgICAgICAgIAogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykgewogICAgICAgICAgICAgICAgICBJbnB1dFdlaWdodFtpXVtqXSArPSBMZWFybmluZ1JhdGUgKiBIaWRkZW5FcnJvcltqXSAqIElucHV0VmFsdWVbaV07CiAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgIH0gIAogICAgICAgICAgICAgIAogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICAgICAgICAgICBIaWRkZW5XZWlnaHRbaV0gPSBMZWFybmluZ1JhdGUgKiBPdXRwdXRFcnJvciAqIEhpZGRlbk91dHB1dFtpXTsgICAgCiAgICAgICAgICB9ICAgIAogICAgICAgICAgICAgIAogICAgICAgICAgdG90YWxFcnJvciArPSBwb3coKHRyYWluaW5nU2V0W3RTZXRdWzNdIC0gT3V0cHV0KSwgMikgLyAyOyAgICAKICAgICAgfQogICAgICAgICAgY291dCA8PCB0b3RhbEVycm9yIDw8IGVuZGw7CiAgICAgICAgICAvL2dldGNoKCk7CiAgICAgIH0gd2hpbGUgKHRvdGFsRXJyb3IgPiAwLjAxKTsKCiAgICAgIC8vVGVzdAogICAgICAKICAgICAgIGZvciAoaW50IHRTZXQgPSAwOyB0U2V0IDwgNDsgdFNldCsrKSB7CiAgICAgICAgICAvL1NldCB0aGUgaW5wdXQKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQogICAgICAgICAgICAgIElucHV0VmFsdWVbaV0gPSB0cmFpbmluZ1NldFt0U2V0XVtpXTsKICAgICAgICAgIAogICAgICAgICAgLy9TZXQgb3V0cHV0IHRvIDAKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKICAgICAgICAgICAgICAgICAgSGlkZGVuT3V0cHV0W2pdID0gMDsgICAgCiAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgLy9jYWxjdWxhdGUgYWN0aXZhdGlvbiBvZiBoaWRkZW4KICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgICBIaWRkZW5PdXRwdXRbal0gKz0gSW5wdXRXZWlnaHRbaV1bal0qSW5wdXRWYWx1ZVtpXTsKICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vU2lnbW9pZAogICAgICAgICAgICAgIEhpZGRlbk91dHB1dFtqXSA9IDEgLyAoMSArIGV4cCgtSGlkZGVuT3V0cHV0W2pdKSk7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIC8vc2V0IHRoZSBvdXRwdXQgbGF5ZXIgdG8gMAogICAgICAgICAgT3V0cHV0ID0gMDsKICAgICAgICAgIAogICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSA8IDU7IGkrKykgewogICAgICAgICAgICAgIE91dHB1dCArPSBIaWRkZW5PdXRwdXRbaV0gKiBIaWRkZW5XZWlnaHRbaV07CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIC8vU2lnbW9pZAogICAgICAgICAgT3V0cHV0ID0gMSAvICgxICsgZXhwKC1PdXRwdXQpKTsKICAgICAgICAgIAogICAgICAgICAgY291dCA8PCBPdXRwdXQgPDwgZW5kbDsKICAgICAgICAgIAogICAgICAgfQogICAgICAgCiAgICAgICBnZXRjaCgpOwogICAgICAKICAgICAgcmV0dXJuIDA7Cn0K


