Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <cstdlib>
- #include <ctime>
- #include <conio.h>
- using namespace std;
- float randomFloat(float minimum, float maximum){
- return minimum + static_cast <float> (rand()) /( static_cast <float> (RAND_MAX/(maximum-minimum)));
- }
- float rounded(float number){
- return floor((number * 100) + .5) / 100;
- }
- //Stale
- float c = 0.8f;
- float epsilon = 0.00001f;
- float beta = 1.0f;
- //Zmienne
- float x[3][25] = {};
- float xp[3][25] = {};
- float xpp[3][25] = {};
- float y[3][16] = {};
- float w[16][25] = {};
- float wp[25][16] = {};
- float b[16] = {};
- float bp[25] = {};
- float DE_wp[25][16] = {};
- float DE_bp[25] = {};
- float DE_w[16][25] = {};
- float DE_b[16] = {};
- bool train = true;
- //Funkcje
- float f(float u){
- return 1.0f / (1.0f + exp((-1.0f) * beta * u));
- }
- float Df(float u){
- return beta * f(u) * (1.0f - f(u));
- }
- float f1(float u){
- if(u >= 0) return 1.0f;
- else return 0.0f;
- }
- void randomizeValues(){
- for(int i = 0; i < 25; i++){
- bp[i] = randomFloat(-0.5f, 0.5f);
- for(int j =0; j < 16; j++){
- wp[i][j] = randomFloat(-1.0f, 1.0f);
- }
- }
- for(int i = 0; i < 16; i++){
- b[i] = randomFloat(-0.5f, 0.5f);
- for(int j =0; j < 25; j++){
- w[i][j] = randomFloat(-1.0f, 1.0f);
- }
- }
- }
- void calculateY(){
- float suma = 0;
- for(int a = 0; a < 3; a++){
- for(int i = 0; i < 16; i++){
- suma = 0;
- for(int j = 0; j < 25; j++){
- suma += w[i][j] * x[a][j] + b[i];
- }
- y[a][i] = f(suma);
- }
- }
- }
- void calculateXp(){
- float suma = 0;
- for(int a = 0; a < 3; a++){
- for(int k = 0; k < 25; k++){
- suma = 0;
- for(int i = 0;i < 16; i++){
- suma += wp[k][i] * y[a][i] + bp[k];
- }
- xp[a][k] = f(suma);
- }
- }
- }
- void calculateXpp(){
- float suma = 0;
- for(int a = 0; a < 3; a++){
- for(int k = 0; k < 25; k++){
- suma = 0;
- for(int i = 0; i < 16; i++){
- suma += wp[k][i] * y[a][i] + bp[k];
- }
- xpp[a][k] = f1(suma);
- }
- }
- }
- void calculateA(){ //?
- for(int p = 0; p < 25; p++){
- float sumaB = 0;
- for(int q = 0; q < 16; q++){
- float sumaGlowna = 0;
- for(int a = 0; a < 3; a++){
- float sumaPrim = 0;
- for(int i = 0; i < 16; i++){
- sumaPrim += wp[p][i] * y[a][i] + bp[p];
- }
- sumaGlowna += (xp[a][p] - x[a][p]) * Df(sumaPrim) * y[a][q];
- if(q == 0)
- sumaB += (xp[a][p] - x[a][p]) * Df(sumaPrim);
- }
- DE_wp[p][q] = sumaGlowna;
- }
- DE_bp[p] = sumaB;
- }
- }
- void calculateB(){
- for(int p = 0; p < 16; p++){
- float sumaB = 0;
- for(int q = 0; q < 25; q++){
- float sumaGlowna = 0;
- for(int a = 0; a < 3; a++){
- float sumaSrodek = 0;
- for(int k = 0; k < 25; k++){
- float suma1 = 0;
- for(int i = 0; i < 16; i++){
- suma1 += wp[k][i] * y[a][i] + bp[k];
- }
- float suma2 = 0;
- for(int j = 0; j < 25; j++){
- suma2 += w[p][j] * x[a][j] + b[p];
- }
- sumaSrodek += (xp[a][k] - x[a][k]) * Df(suma1) * wp[k][p] * Df(suma2) * x[a][q];
- if(q == 0)
- sumaB += (xp[a][k] - x[a][k]) * Df(suma1) * wp[k][p] * Df(suma2);
- }
- sumaGlowna += sumaSrodek;
- }
- DE_w[p][q] = sumaGlowna;
- }
- DE_b[p] = sumaB;
- }
- }
- int main()
- {
- srand (static_cast <unsigned> (time(0)));
- randomizeValues();
- //Obrazki
- x[0][6] = 1; x[0][7] = 1; x[0][12] = 1; x[0][17] = 1; x[0][22] = 1;
- x[1][2] = 1; x[1][3] = 1; x[1][8] = 1; x[1][13] = 1;
- x[2][5] = 1; x[2][6] = 1; x[2][11] = 1; x[2][16] = 1; x[2][21] = 1;
- int counter = 0;
- while(train){
- calculateY();
- calculateXp();
- calculateA();
- calculateB();
- float _bp[25] = {};
- float _b[16]= {};
- float _w[16][25]= {};
- float _wp[25][16]= {};
- //Do we have maksimum?
- float max1 = 0.0f;
- float max2 = 0.0f;
- //New weights
- for(int i = 0; i < 25; i++){
- _bp[i] = bp[i] - c * DE_bp[i];
- if(abs(_bp[i] - bp[i]) >= max1){
- max2 = _bp[i] - bp[i];
- }
- bp[i] = _bp[i];
- for(int j = 0; j < 16; j++){
- _wp[i][j] = wp[i][j] - c * DE_wp[i][j];
- if(abs(_wp[i][j] - wp[i][j]) >= max1){
- max1 = abs(_wp[i][j] - wp[i][j]);
- }
- wp[i][j] = _wp[i][j];
- }
- }
- for(int i = 0; i < 16; i++){
- _b[i] = b[i] - c * DE_b[i];
- if(abs(_b[i] - b[i]) >= max2){
- max2 = _b[i] - b[i];
- }
- b[i] = _b[i];
- for(int j = 0; j < 25; j++){
- _w[i][j] = w[i][j] - c * DE_w[i][j];
- if(abs(_w[i][j] - w[i][j]) >= max2){
- max2 = abs(_w[i][j] - w[i][j]);
- }
- w[i][j] = _w[i][j];
- }
- }
- if(counter % 500 == 0)
- cout << max1 << " " << max2 << endl;
- if(max1 <= epsilon || max2 <= epsilon){
- train = false;
- }
- counter++;
- }
- cout << "Liczba iteracji: " << counter << endl << endl;
- calculateXpp();
- for(int a = 0; a < 3; a++){
- for(int i = 0; i < 25; i++){
- if(i % 5 == 0 && i != 0){
- cout << endl;
- }
- if(xpp[a][i] >= 0.5f){
- cout << "*";
- } else {
- cout << "#";
- }
- }
- cout << endl << endl;
- }
- getch();
- return 0;
- }
Add Comment
Please, Sign In to add comment