рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред
рдореИрдВрдиреЗ C ++ рдореЗрдВ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдФрд░ рдХреИрдкреЗрд╕рд┐рдЯрд┐рд╡ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджрд┐рд▓рдЪрд╕реНрдк рдХреНрдпреЛрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?рдЙрддреНрддрд░: рдореИрдВрдиреЗ рдПрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдореЗрдВ рдорд▓реНрдЯреАрд▓реЗрдпрд░ рдкрд░рд╕реЗрдкреНрдЯреНрд░реЙрди рдХреЗ рдХрд╛рдо рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддрд╛рдХрд┐ рдЗрд╕реЗ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ "C" рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдиреНрдореБрдЦ рднрд╛рд╖рд╛рдУрдВ рдХреЛ "C" рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВрдЧреЗред рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП)
рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛!рдХреГрдкрдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрдВ
рдореИрдВрдиреЗ рдЖрдкрдХреЛ
рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ
рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛рдпрд╛
рд╣реИ , рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ
Google рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдк рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ (рдЙрджреНрджреЗрд╢реНрдп, рдХреНрд╖рдорддрд╛рдУрдВ, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣)ред
рдЖрдкрдХреЛ
рд╕реНрд░реЛрдд рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдХреНрд░рдо рдореЗрдВред
рдЪрд▓реЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
1) рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
- рджреА рдЧрдИ рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рддреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде
рдмрд╣реБрдкрд░рдд рдкрд░реНрд╕реЗрдкреНрдЯреНрд░реЙрди ред рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рд╣реИ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдгmyNeuero.cppinputNeurons = 100;
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗрдЯ рдХрд░рдирд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд░реНрддрдорд╛рди рдкрд░рдд рдХрд╛ рдЗрдирдкреБрдЯ = рдкрд┐рдЫрд▓реЗ рдПрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯред рдПрдХ рдЕрдкрд╡рд╛рдж рдЗрдирдкреБрдЯ рдкрд░рдд рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдХрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред
- рд╕реАрдЦрдиреЗ рдХреА рдЧрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ
рдкреАрдЫреЗ рдкреНрд░рд╕рд╛рд░ рдХреЗ рддрдВрддреНрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
myNeuero.h #define learnRate 0.1
-
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рд░ рдХреА рд╕реНрдерд╛рдкрдирд╛
myNeuero.h #define randWeight (( ((float)qrand() / (float)RAND_MAX) - 0.5)* pow(out,-0.5))
рдиреЛрдЯ : рдпрджрд┐ рддреАрди рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рддреЗрдВ (nlCount> 4) рд╣реИрдВ, рддреЛ pow (out, -0.5) рдХреЛ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЬрдм рд╕рд┐рдЧреНрдирд▓ рд╕реАрдзреЗ рдкрд╛рд╕ рд╣реЛ, рддреЛ рдЗрд╕рдХреА рдКрд░реНрдЬрд╛ 0. рдЙрджрд╛рд╣рд░рдг pow (out, -0.2) рддрдХ рдХрдо рди рд╣реЛ
-
рд╕реА рдореЗрдВ рдХреЛрдб рдХрд╛
рдЖрдзрд╛рд░ ред рдмреБрдирд┐рдпрд╛рджреА рдЧреБрдгрдХреЛрдВ рдФрд░ рднрд╛рд░ рдЧреБрдгрд╛рдВрдХ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рд╕реА рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╛рдХреА рд╕рдм рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЦреЛрд▓ рд╣реИ, рдпрд╣ рдЕрд▓рдЧ рд╕реЗ рд▓реА рдЧрдИ рдкрд░рддреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИред
рдкрд░рдд рд╕рдВрд░рдЪрдирд╛myNeuero.h struct nnLay{ int in; int out; float** matrix; float* hidden; float* errors; int getInCount(){return in;} int getOutCount(){return out;} float **getMatrix(){return matrix;} void updMatrix(float *enteredVal) { for(int ou =0; ou < out; ou++) { for(int hid =0; hid < in; hid++) { matrix[hid][ou] += (learnRate * errors[ou] * enteredVal[hid]); } matrix[in][ou] += (learnRate * errors[ou]); } }; void setIO(int inputs, int outputs) { in=inputs; out=outputs; hidden = (float*) malloc((out)*sizeof(float)); matrix = (float**) malloc((in+1)*sizeof(float)); for(int inp =0; inp < in+1; inp++) { matrix[inp] = (float*) malloc(out*sizeof(float)); } for(int inp =0; inp < in+1; inp++) { for(int outp =0; outp < out; outp++) { matrix[inp][outp] = randWeight; } } } void makeHidden(float *inputs) { for(int hid =0; hid < out; hid++) { float tmpS = 0.0; for(int inp =0; inp < in; inp++) { tmpS += inputs[inp] * matrix[inp][hid]; } tmpS += matrix[in][hid]; hidden[hid] = sigmoida(tmpS); } }; float* getHidden() { return hidden; }; void calcOutError(float *targets) { errors = (float*) malloc((out)*sizeof(float)); for(int ou =0; ou < out; ou++) { errors[ou] = (targets[ou] - hidden[ou]) * sigmoidasDerivate(hidden[ou]); } }; void calcHidError(float *targets,float **outWeights,int inS, int outS) { errors = (float*) malloc((inS)*sizeof(float)); for(int hid =0; hid < inS; hid++) { errors[hid] = 0.0; for(int ou =0; ou < outS; ou++) { errors[hid] += targets[ou] * outWeights[hid][ou]; } errors[hid] *= sigmoidasDerivate(hidden[hid]); } }; float* getErrors() { return errors; }; float sigmoida(float val) { return (1.0 / (1.0 + exp(-val))); } float sigmoidasDerivate(float val) { return (val * (1.0 - val)); }; };
2) рдЖрд╡реЗрджрди
Mnist рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рд░рд╣рд╛, рд╣рдо 0.9795 (nlCount = 4, learnRate = 0.03 рдФрд░ рдХрдИ рдпреБрдЧ) рдХреА рдПрдХ рд╕рд╢рд░реНрдд рд▓рд┐рдЦрд╛рд╡рдЯ рдорд╛рдиреНрдпрддрд╛ рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдореБрдХрд╛рдмрд▓рд╛ рд╣реБрдЖред
рдиреАрдЪреЗ рд╣рдо
"рд╕рд╢рд░реНрдд рдХрд╛рд░реНрдп" рдкрд░ рдХрд╛рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛:100 рдореВрд▓реНрдпреЛрдВ рдХреЗ -2 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЗрдирдкреБрдЯ рд╡реИрдХреНрдЯрд░
рд╡рдЬрди рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ
-2 рд╕реЗрдЯ рдЧреЛрд▓
рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
рдХреЛрдб {
рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ
рдкрд░рд┐рдгрд╛рдо
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд╡реЗрд░реА (рдЗрдирдкреБрдЯреНрд╕) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдорддрднреЗрджреЛрдВ рдХрд╛ рдиреНрдпрд╛рдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рдЬрди рдЧреБрдгрд╛рдВрдХ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрди (рдЗрдирдкреБрдЯ, рд▓рдХреНрд╖реНрдп) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рддрд╛рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрд╛рдж рдореЗрдВ рдЗрдирдкреБрдЯ рд╡реИрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░ рд╕рдХреЗред
рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗрдХреНрдЯрд░ "abc" рдХреЛ "tar1" рдФрд░ "cba" рдХреЛ "tar2" рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред
рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!рдкреБрдирд╢реНрдЪ: рдпрд╣ рдХреЛрдб QtCreator рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
PPS: рдпрджрд┐ рдХреЛрдИ рднреА рд╕рдВрд░рдЪрдирд╛ nnLay {} рд▓рд┐рдЦрдиреЗ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирдпрд╛ рдкрдж рд╣реЛрдЧрд╛ред
PPPS: рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "C" рдЙрдиреНрдореБрдЦ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рдХреЛрдбmain.cpp #include <QCoreApplication> #include <QDebug> #include <QTime> #include "myneuro.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); myNeuro *bb = new myNeuro(); //----------------------------------INPUTS----GENERATOR------------- qsrand((QTime::currentTime().second())); float *abc = new float[100]; for(int i=0; i<100;i++) { abc[i] =(qrand()%98)*0.01+0.01; } float *cba = new float[100]; for(int i=0; i<100;i++) { cba[i] =(qrand()%98)*0.01+0.01; } //---------------------------------TARGETS----GENERATOR------------- float *tar1 = new float[2]; tar1[0] =0.01; tar1[1] =0.99; float *tar2 = new float[2]; tar2[0] =0.99; tar2[1] =0.01; //--------------------------------NN---------WORKING--------------- bb->query(abc); qDebug()<<"_________________________________"; bb->query(cba); int i=0; while(i<100000) { bb->train(abc,tar1); bb->train(cba,tar2); i++; } qDebug()<<"___________________RESULT_____________"; bb->query(abc); qDebug()<<"______"; bb->query(cba); qDebug()<<"_______________THE____END_______________"; return a.exec(); }
myNeuro.cpp #include "myneuro.h" #include <QDebug> myNeuro::myNeuro() { //-------- inputNeurons = 100; outputNeurons =2; nlCount = 4; list = (nnLay*) malloc((nlCount)*sizeof(nnLay)); inputs = (float*) malloc((inputNeurons)*sizeof(float)); targets = (float*) malloc((outputNeurons)*sizeof(float)); list[0].setIO(100,20); list[1].setIO(20,6); list[2].setIO(6,3); list[3].setIO(3,2); //----------------- // inputNeurons = 100; // outputNeurons =2; // nlCount = 2; // list = (nnLay*) malloc((nlCount)*sizeof(nnLay)); // inputs = (float*) malloc((inputNeurons)*sizeof(float)); // targets = (float*) malloc((outputNeurons)*sizeof(float)); // list[0].setIO(100,10); // list[1].setIO(10,2); } void myNeuro::feedForwarding(bool ok) { list[0].makeHidden(inputs); for (int i =1; i<nlCount; i++) list[i].makeHidden(list[i-1].getHidden()); if (!ok) { qDebug()<<"Feed Forward: "; for(int out =0; out < outputNeurons; out++) { qDebug()<<list[nlCount-1].hidden[out]; } return; } else { // printArray(list[3].getErrors(),list[3].getOutCount()); backPropagate(); } } void myNeuro::backPropagate() { //-------------------------------ERRORS-----CALC--------- list[nlCount-1].calcOutError(targets); for (int i =nlCount-2; i>=0; i--) list[i].calcHidError(list[i+1].getErrors(),list[i+1].getMatrix(), list[i+1].getInCount(),list[i+1].getOutCount()); //-------------------------------UPD-----WEIGHT--------- for (int i =nlCount-1; i>0; i--) list[i].updMatrix(list[i-1].getHidden()); list[0].updMatrix(inputs); } void myNeuro::train(float *in, float *targ) { inputs = in; targets = targ; feedForwarding(true); } void myNeuro::query(float *in) { inputs=in; feedForwarding(false); } void myNeuro::printArray(float *arr, int s) { qDebug()<<"__"; for(int inp =0; inp < s; inp++) { qDebug()<<arr[inp]; } }
myNeuro.h #ifndef MYNEURO_H #define MYNEURO_H #include <iostream> #include <math.h> #include <QtGlobal> #include <QDebug> #define learnRate 0.1 #define randWeight (( ((float)qrand() / (float)RAND_MAX) - 0.5)* pow(out,-0.5)) class myNeuro { public: myNeuro(); struct nnLay{ int in; int out; float** matrix; float* hidden; float* errors; int getInCount(){return in;} int getOutCount(){return out;} float **getMatrix(){return matrix;} void updMatrix(float *enteredVal) { for(int ou =0; ou < out; ou++) { for(int hid =0; hid < in; hid++) { matrix[hid][ou] += (learnRate * errors[ou] * enteredVal[hid]); } matrix[in][ou] += (learnRate * errors[ou]); } }; void setIO(int inputs, int outputs) { in=inputs; out=outputs; hidden = (float*) malloc((out)*sizeof(float)); matrix = (float**) malloc((in+1)*sizeof(float)); for(int inp =0; inp < in+1; inp++) { matrix[inp] = (float*) malloc(out*sizeof(float)); } for(int inp =0; inp < in+1; inp++) { for(int outp =0; outp < out; outp++) { matrix[inp][outp] = randWeight; } } } void makeHidden(float *inputs) { for(int hid =0; hid < out; hid++) { float tmpS = 0.0; for(int inp =0; inp < in; inp++) { tmpS += inputs[inp] * matrix[inp][hid]; } tmpS += matrix[in][hid]; hidden[hid] = sigmoida(tmpS); } }; float* getHidden() { return hidden; }; void calcOutError(float *targets) { errors = (float*) malloc((out)*sizeof(float)); for(int ou =0; ou < out; ou++) { errors[ou] = (targets[ou] - hidden[ou]) * sigmoidasDerivate(hidden[ou]); } }; void calcHidError(float *targets,float **outWeights,int inS, int outS) { errors = (float*) malloc((inS)*sizeof(float)); for(int hid =0; hid < inS; hid++) { errors[hid] = 0.0; for(int ou =0; ou < outS; ou++) { errors[hid] += targets[ou] * outWeights[hid][ou]; } errors[hid] *= sigmoidasDerivate(hidden[hid]); } }; float* getErrors() { return errors; }; float sigmoida(float val) { return (1.0 / (1.0 + exp(-val))); } float sigmoidasDerivate(float val) { return (val * (1.0 - val)); }; }; void feedForwarding(bool ok); void backPropagate(); void train(float *in, float *targ); void query(float *in); void printArray(float *arr,int s); private: struct nnLay *list; int inputNeurons; int outputNeurons; int nlCount; float *inputs; float *targets; }; #endif // MYNEURO_H
рдпреБрдкреАрдбреА:
Mnist рдкрд░ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рд╣реИрдВ
рд▓рд┐рдВрдХ1) рдкрд░рд┐рдпреЛрдЬрдирд╛
"
Github.com/mamkin-itshnik/simple-neuro-network "
рдЗрд╕рдореЗрдВ рдХреГрддрд┐ рдХрд╛ рдЪрд┐рддреНрд░рдордп рд╡рд░реНрдгрди рднреА рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЬрдм рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдорддрджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдиреНрдпреВрд░реЙрдиреНрд╕ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдореВрд▓реНрдп рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (10 рдиреНрдпреВрд░реЙрдиреНрд╕ 0 рд╕реЗ 9 рддрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВ)ред рдЪрд┐рддреНрд░рд┐рдд рдЖрдХреГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдзрд┐рдХрддрдо рдиреНрдпреВрд░реЙрди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдВрдХ = рдЗрдВрдбреЗрдХреНрд╕ + 1 (рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдирдВрдмрд░ рдХрд╣рд╛рдВ рд╕реЗ рд╣реИрдВ))
2) MNIST
"
Www.kaggle.com/oddrationale/mnist-in-csv " (рдпрджрд┐ рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ PS рдХреЗ CSV рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ: git рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ)