рд╕реА # рдореЗрдВ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдкрд░рдд рдХреЗ рд╕рд╛рде рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ

рдирдорд╕реНрддреЗ, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдпрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдиреНрдпреВрд░реЙрди рдХреЗ рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИред рдЗрди рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдХрдИ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдП рдЧрдП рдереЗ: рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рд╡рд░реНрдЧ рдХрд╛ рдиреНрдпреВрдирддрдордХрд░рдг рдФрд░ рд╕рд┐рдЧреНрдореЛрдЗрдб рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╣рд╛рдЗрдкрд░рдмреЛрд▓рд┐рдХ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдХреЗ рд▓рд┐рдП рд▓рдШреБрдЧрдгрдХреАрдп рд╕рдВрднрд╛рд╡рдирд╛ред рдпрд╣ рдкреЛрд╕реНрдЯ рдЕрддреАрдд рдХреА рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдХреНрд░реЙрд╕-рдПрдВрдЯреНрд░реЛрдкреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЧреИрд░-рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг, рдЕрд░реНрдерд╛рддреН рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ ред рдпрд╣ рдореЙрдбрд▓ рд╡рд░реНрдЧреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЬрдм рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрдирдкреБрдЯ рдЫрд╡рд┐ рдЧреИрд░-рдЕрдВрддрд░-рд╡рд░реНрдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреА рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдЙрдЯрдкреБрдЯ рдкрд░рдд рдХреЗ рд╕рднреА рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рд╛рде рд╣реА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдирдореВрдиреЗ рдХреА рдЖрдЙрдЯрдкреБрдЯ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдмрд╕ рд╕рд┐рдЦрд╛рдПрдВред рд╡реИрд╕реЗ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рдХреЛрд░реНрд╕ coursera.org рдкрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ , рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдиреЗ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдХреА рд╕рдордЭ рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреА, рдЕрдиреНрдпрдерд╛ рдореИрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП


рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╕рдВрдХреЗрддрди, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд▓рд░реНрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдПрдХреНрдЯрд┐рд╡реЗрд╢рди рдлрдВрдХреНрд╢рди


рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдЬреЛ рд╣рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд┐рддрд░рдг рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдВ рдЬреИрд╕реЗ:


рд╕реЙрдлреНрдЯрдореИрдХреНрд╕-рд╕рдореВрд╣ рдХреЗ рдиреНрдпреВрд░реЙрдиреНрд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдХреНрд░рд┐рдпрдг рд╕рдорд╛рд░реЛрд╣ рд╣реЛрдЧрд╛ (рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдореИрдВ рдкрд░рдд рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрди рдиреНрдпреВрд░реЙрдиреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ):



рдпрд╣ рд╕реВрддреНрд░ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдиреНрдпреВрд░реЙрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рд╕рдореВрд╣ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреЗ рдЬреЛрдбрд╝ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреВрд░реЗ рд╕рдореВрд╣ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рдиреЛрдВ рдХрд╛ рдпреЛрдЧ рдПрдХрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕реБрдВрджрд░рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдпреЛрдЬрдХ рдореЗрдВ i-th рдиреНрдпреВрд░реЙрди рдХрд╛ рдЖрдВрд╢рд┐рдХ рд╡реНрдпреБрддреНрдкрдиреНрди рдмрд░рд╛рдмрд░ рд╣реИ:


рд╣рдо рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ IF рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ double Compute(double x) рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдорддреМрд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдкрд░рдд рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдореВрд╣ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╕рд╕реНрддрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рд░рд╣рдиреЗ рджреЛ)
 internal class SoftMaxActivationFunction : IFunction { private ILayer _layer = null; private int _ownPosition = 0; internal SoftMaxActivationFunction(ILayer layer, int ownPosition) { _layer = layer; _ownPosition = ownPosition; } public double Compute(double x) { double numerator = Math.Exp(x); double denominator = numerator; for (int i = 0; i < _layer.Neurons.Length; i++) { if (i == _ownPosition) { continue; } denominator += Math.Exp(_layer.Neurons[i].LastNET); } return numerator/denominator; } public double ComputeFirstDerivative(double x) { double y = Compute(x); return y*(1 - y); } public double ComputeSecondDerivative(double x) { throw new NotImplementedException(); } } 



рддреНрд░реБрдЯрд┐ рд╕рдорд╛рд░реЛрд╣


рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг рдХреЛ рдореЙрдбрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреЛ рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рд╡рд┐рддрд░рдг рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣реА рдорд╛рдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░реЙрд╕ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:



рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:


рдкреВрд░реЗ рдореЙрдбрд▓ рдХреА рднрд╡реНрдпрддрд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреА рдЧрдгрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рдЖрдпрд╛рдореЛрдВ рдпрд╛ рдиреНрдпреВрд░реЙрди рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред "рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдпрд░" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдпрд╣ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп dC / dz_i рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реИ, рд╣рдо рдЕрднреА рд╕реЗ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ:



рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рд╕рдореВрд╣ рдХреЗ рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдЙрдЯрдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдпреЛрдЧ рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА!

рд╣рдо рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:

рдХреНрд░реЙрд╕ рдПрдВрдЯреНрд░реЙрдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 internal class CrossEntropy : IMetrics<double> { internal CrossEntropy() { } /// <summary> /// \sum_i v1_i * ln(v2_i) /// </summary> public override double Calculate(double[] v1, double[] v2) { double d = 0; for (int i = 0; i < v1.Length; i++) { d += v1[i]*Math.Log(v2[i]); } return -d; } public override double CalculatePartialDerivaitveByV2Index(double[] v1, double[] v2, int v2Index) { return v2[v2Index] - v1[v2Index]; } } 



рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдкрд░рдд



рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рдд рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд┐рддрд░рдг рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рдд рдмрдирд╛рдПрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдкрд░рдд рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкрд╛рд╕ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рддрдм рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд░ рдХреА рдЧрдгрдирд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреНрдпреВрд░реЙрди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдХреА рдЬрд╛рдПрдЧреАред рд╕рдХреНрд░рд┐рдпрдг, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ double[] ComputeOutput(double[] inputVector) рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
 public double[] ComputeOutput(double[] inputVector) { double[] outputVector = inputVector; for (int i = 0; i < _layers.Length; i++) { outputVector = _layers[i].Compute(outputVector); } return outputVector; } 


рдлрд┐рд░, рдХреНрдпреЛрдВрдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рд╕реАрдзреЗ рдиреНрдпреВрд░реЙрди рдХреА рдЧрдгрдирд╛ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рдд рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдПрдХ рдмрд╛рд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд░ рдХреЛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдкрд░рдд
 internal class SoftmaxFullConnectedLayer : FullConnectedLayer { internal SoftmaxFullConnectedLayer(int inputDimension, int size) { _neurons = new INeuron[size]; for (int i = 0; i < size; i++) { IFunction smFunction = new SoftMaxActivationFunction(this, i); _neurons[i] = new InLayerFullConnectedNeuron(inputDimension, smFunction); } } public override double[] Compute(double[] inputVector) { double[] numerators = new double[_neurons.Length]; double denominator = 0; for (int i = 0; i < _neurons.Length; i++) { numerators[i] = Math.Exp(_neurons[i].NET(inputVector)); denominator += numerators[i]; } double[] output = new double[_neurons.Length]; for (int i = 0; i < _neurons.Length; i++) { output[i] = numerators[i]/denominator; _neurons[i].LastState = output[i]; } return output; } } 



рдкрд░рд┐рдгрд╛рдо


рддреЛ, рд▓рд╛рдкрддрд╛ рд╣рд┐рд╕реНрд╕реЗ рддреИрдпрд╛рд░ рд╣реИрдВ, рдФрд░ рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╣реА рд╕реАрдзреЗ рд╡рд┐рддрд░рдг рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдмрд╕ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╕рд╛рде ред

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЙрджрд╛рд╣рд░рдг
 /// <summary> /// Creates network with softmax layer at the outlut, and hidden layes with theirs own activation functions /// </summary> internal FcMlFfNetwork(int inputDimension, int outputDimension, int[] hiddenLayerStructure, IFunction[] hiddenLayerFunctions, IWeightInitializer wi, ILearningStrategy<IMultilayerNeuralNetwork> trainingAlgorithm) { _learningStrategy = trainingAlgorithm; _layers = new ILayer[hiddenLayerFunctions.Length + 1]; _layers[0] = new FullConnectedLayer(inputDimension, hiddenLayerStructure[0], hiddenLayerFunctions[0]); for (int i = 1; i < hiddenLayerStructure.Length; i++) { _layers[i] = new FullConnectedLayer(_layers[i - 1].Neurons.Length, hiddenLayerStructure[i], hiddenLayerFunctions[i]); } //create softmax layer _layers[hiddenLayerStructure.Length] = new SoftmaxFullConnectedLayer(hiddenLayerStructure[hiddenLayerStructure.Length - 1], outputDimension); for (int i = 0; i < _layers.Length; i++) { for (int j = 0; j < _layers[i].Neurons.Length; j++) { _layers[i].Neurons[j].Bias = wi.GetWeight(); for (int k = 0; k < _layers[i].Neurons[j].Weights.Length; k++) { _layers[i].Neurons[j].Weights[k] = wi.GetWeight(); } } } } 

Source: https://habr.com/ru/post/In155235/


All Articles