package Ġorg . n ield . num ky Ċ Ċ import Ġorg . n ield . num ky . linear .* Ċ import Ġorg . oj algo . random . Normal Ċ import Ġsc ient ifik . k math . linear . Real Matrix Ċ import Ġsc ient ifik . k math . linear . dot Ċ import Ġsc ient ifik . k math . structures . Matrix Ċ import Ġjava . net . URL Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util . concurrent . Thread Local Random Ċ import Ġkotlin . math . exp ĊĊ Ċ fun Ġmain () Ġ{ ĊĊĠĠĠ Ġval Ġinput Data Ġ= ĠURL (" https :// tiny url . com / y 2 q mh fs r ") ĊĠĠĠĠĠĠĠ Ġ. read Text (). split ( Regex ("\\ r ? \\ n ")) ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split ("," ). map Ġ{ Ġit . toDouble () Ġ}. toDouble Array () Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Matrix () ĊĊĠĠĠ Ġval Ġn Ġ= Ġinput Data . row Num ĊĊĠĠĠ Ġval Ġinput Colors Ġ= Ġinput Data . extract Columns ( 0 .. 2 ) ĊĠĠĠ Ġval Ġexpected Outputs Ġ= Ġinput Data . extract Column ( 3 ). append Column Ġ{ Ġif Ġ( it [ 0 ] Ġ== Ġ 0 . 0 ) Ġ 1 . 0 Ġelse Ġ 0 . 0 Ġ} ĊĊĠĠĠ Ġval Ġnn Ġ= ĠNeural Network ( 3 , Ġ 3 , Ġ 2 ) ĊĊĠĠĠ Ġnn . train ( input Colors , Ġexpected Outputs ) Ċ } ĊĊ Ċ class ĠNeural Network ( ĊĠĠĠ Ġval Ġinput Nodes : ĠInt , ĊĠĠĠ Ġval Ġmiddle Nodes : ĠInt , ĊĠĠĠ Ġval Ġouter Nodes : ĠInt Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġclass ĠNeural Network State ( ĊĠĠĠĠĠĠĠ Ġinput Nodes : ĠInt , ĊĠĠĠĠĠĠĠ Ġmiddle Nodes : ĠInt , ĊĠĠĠĠĠĠĠ Ġouter Nodes : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmiddle Layer Weights : ĠReal Matrix Ġ= Ġreal Matrix ( input Nodes , Ġmiddle Nodes ) Ġ{ Ġ_, Ġ_ Ġ-> Ġrandom Double (- 1 . 0 .. 1 . 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġmiddle Layer Bi ases : ĠReal Matrix Ġ= Ġreal Matrix ( 1 , Ġmiddle Nodes ) Ġ{ Ġ_, Ġ_ Ġ-> Ġrandom Double (- 1 . 0 .. 1 . 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġouter Layer Weights : ĠReal Matrix Ġ= Ġreal Matrix ( middle Nodes , Ġouter Nodes ) Ġ{ Ġ_, Ġ_ Ġ-> Ġrandom Double (- 1 . 0 .. 1 . 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġouter Layer Bi ases : ĠReal Matrix Ġ= Ġreal Matrix ( 1 , Ġouter Nodes ) Ġ{ Ġ_, Ġ_ Ġ-> Ġrandom Double (- 1 . 0 .. 1 . 0 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠNeural Network State . evaluate ( input Colors : ĠMatrix < Double >): ĠMatrix < Double > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġinput Colors . row Num ĊĊĠĠĠĠĠĠĠ Ġval Ġmiddle Layer Op Ġ= Ġ(( input Colors Ġdot Ġmiddle Layer Weights ) Ġ+ Ġmiddle Layer Bi ases . repeat Stack Vertical ( n )). tanh () ĊĠĠĠĠĠĠĠ Ġval Ġouter Layer Op Ġ= Ġ(( middle Layer Op Ġdot Ġouter Layer Weights ) Ġ+ Ġouter Layer Bi ases . repeat Stack Vertical ( n )). sigmoid () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġouter Layer Op ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrain ( input Colors : ĠMatrix < Double >, Ġactual s : ĠMatrix < Double >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġbest Loss Ġ= ĠDouble . MAX _ VALUE ĊĊĠĠĠĠĠĠĠ ĠNeural Network State ( input Nodes , Ġmiddle Nodes , Ġouter Nodes ). run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmiddle Layer Weight Count Ġ= Ġmiddle Layer Weights . let Ġ{ Ġit . row Num Ġ* Ġit . col Num Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmiddle Layer Bias Count Ġ= Ġmiddle Layer Bi ases . let Ġ{ Ġit . row Num Ġ* Ġit . col Num Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Layer Weight Count Ġ= Ġouter Layer Weights . let Ġ{ Ġit . row Num Ġ* Ġit . col Num Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Layer Bias Count Ġ= Ġouter Layer Bi ases . let Ġ{ Ġit . row Num Ġ* Ġit . col Num Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Variable Count Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmiddle Layer Weight Count Ġ+ Ġmiddle Layer Bias Count Ġ+ Ġouter Layer Weight Count Ġ+ Ġouter Layer Bias Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 0 _ 0 0 0 ) Ġ{ Ġstep Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Ġ!= Ġ 0 Ġ&& Ġstep Ġ% Ġ 1 0 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ step Ġcycles Ġdone Ġin Ġ${ Duration . between ( start , Ġnow )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweighted Random Ġ= Ġ( 0 Ġuntil Ġtotal Variable Count ). random () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Matrix Index Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweighted Random Ġ< Ġmiddle Layer Weight Count Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweighted Random Ġ< Ġmiddle Layer Weight Count Ġ+ Ġmiddle Layer Bias Count Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweighted Random Ġ< Ġmiddle Layer Weight Count Ġ+ Ġmiddle Layer Bias Count Ġ+ Ġouter Layer Weight Count Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweighted Random Ġ< Ġmiddle Layer Weight Count Ġ+ Ġmiddle Layer Bias Count Ġ+ Ġouter Layer Weight Count Ġ+ Ġouter Layer Bias Count Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Adjust Ġ= Ġwhen Ġ( random Matrix Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġmiddle Layer Weights . template Random Adjust (- 1 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġmiddle Layer Bi ases . template Random Adjust ( 0 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġouter Layer Weights . template Random Adjust (- 1 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġouter Layer Bi ases . template Random Adjust ( 0 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( random Matrix Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġmiddle Layer Weights Ġ+= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġmiddle Layer Bi ases Ġ+= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġouter Layer Weights Ġ+= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġouter Layer Bi ases Ġ+= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpredictions Ġ= Ġevaluate ( input Colors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloss Ġ= Ġ( predictions Ġ- Ġactual s ). pow ( 2 ). sum () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loss Ġ< Ġbest Loss ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" [$ step ] ĠLOSS : Ġ$ best Loss Ġ-> Ġ$ loss ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Loss Ġ= Ġloss ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( random Matrix Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġmiddle Layer Weights Ġ-= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġmiddle Layer Bi ases Ġ-= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġouter Layer Weights Ġ-= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġouter Layer Bi ases Ġ-= Ġrandom Adjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠMatrix < Double >. template Random Adjust ( min : ĠDouble , Ġmax : ĠDouble ): ĠMatrix < Double > Ġ{ ĊĠĠĠ Ġval Ġrandom Row Ġ= Ġrandom Int ( 0 .. row Num ) ĊĠĠĠ Ġval Ġrandom Col Ġ= Ġrandom Int ( 0 .. col Num ) ĊĊĠĠĠ Ġreturn Ġreal Matrix ( row Num , Ġcol Num ) Ġ{ Ġrow , Ġcol Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( row Ġ== Ġrandom Row Ġ&& Ġcol Ġ== Ġrandom Col ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( random Normal () Ġ* Ġ. 1 ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Value Ġ= Ġthis @ template Random Adjust [ row , Ġcol ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ+ Ġit Ġ< Ġmin Ġ-> Ġmin Ġ- Ġcurrent Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ+ Ġit Ġ> Ġmax Ġ-> Ġmax Ġ- Ġcurrent Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠMatrix < Double >. tanh () Ġ= Ġreal Matrix ( row Num , Ġcol Num ) Ġ{ Ġrow , Ġcol Ġ-> Ġkotlin . math . tanh ( this [ row , Ġcol ]) Ġ} Ċ fun ĠMatrix < Double >. sigmoid () Ġ= ĊĠĠĠ Ġreal Matrix ( row Num , Ġcol Num ) Ġ{ Ġrow , Ġcol Ġ-> Ġ 1 . 0 Ġ/ Ġ( 1 . 0 Ġ+ Ġexp (- 1 . 0 Ġ/ Ġ 1 . 0 Ġ+ Ġexp (- this [ row , Ġcol ]))) Ġ} Ċ Ċ fun ĠMatrix < Double >. relu () Ġ= Ġreal Matrix ( row Num , Ġcol Num ) Ġ{ Ġrow , Ġcol Ġ-> Ġif Ġ( this [ row , Ġcol ] Ġ< Ġ 0 . 0 ) Ġ 0 . 0 Ġelse Ġthis [ row , Ġcol ] Ġ} Ċ Ċ fun ĠMatrix < Double >. softmax () Ġ= Ġreal Matrix ( row Num , Ġcol Num ) Ġ{ Ġrow , Ġcol Ġ-> ĊĠĠĠ Ġvar Ġsum Values Ġ= Ġ 0 . 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrow Num ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsum Values Ġ+= Ġexp ( get ( i , Ġcol )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// val Ġsum Values Ġ= Ġcolumns [ col ]. as Sequence (). map Ġ{ Ġexp ( it ) Ġ}. sum () ĊĠĠĠ Ġexp ( this [ row , Ġcol ]) Ġ/ Ġsum Values Ċ } Ċ Ċ val Ġnormal Ġ= ĠNormal ( 0 . 0 , Ġ 1 . 0 ) Ċ fun Ġrandom Normal () Ġ= Ġnormal . get () Ċ fun Ġrandom Int ( int Range : ĠInt Range ) Ġ= ĠThread Local Random . current (). nextInt ( int Range . start , Ġint Range . end Inclusive ) Ċ fun Ġrandom Double ( double Range : ĠClosed Range < Double >) Ġ= ĊĠĠĠ ĠThread Local Random . current (). next Double ( double Range . start , Ġdouble Range . end Inclusive )