package Ġcom . on eli ang . k tx . frame . ai . cnn . layer . impl Ċ Ċ import Ġcom . on eli ang . k tx . frame . ai . cnn . layer . Fully Connected Layer Ċ import Ġcom . on eli ang . k tx . frame . ai . loss . ord inary Least S quares Derived Ċ import Ġcom . on eli ang . k tx . util . common . to Brief String Ċ import Ġcom . on eli ang . k tx . util . common . to New Array Ċ import Ġcom . on eli ang . k tx . util . concurrent . atomic . Atomic Map Ċ import Ġcom . on eli ang . k tx . util . json . json ToMap Ċ import Ġcom . on eli ang . k tx . util . json . json ToObject List Ċ import Ġcom . on eli ang . k tx . util . json . toJson Ċ import Ġcom . on eli ang . k tx . util . logging . Logger Manager Ċ import Ġcom . on eli ang . k tx . util . math . matrix . multiply Ċ import Ġcom . on eli ang . k tx . util . math . matrix . transpose Ċ Ċ open Ġclass ĠFull y Connected Layer Impl ( ĊĠĠĠ Ġne uron Count : ĠInt // 3 2 Ċ ) Ġ: ĠFull y Connected Layer < Array < Float >, ĠArray < Float >, ĠArray < Float >>( ne uron Count ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger Manager . getLogger ( Fully Connected Layer Impl :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠD ER IVED _ WEIGHT S _ KEY Ġ= Ġ" derived Weights " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠWE IGHT S _ KEY Ġ= Ġ" weights " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// coroutine Ġconcurrent , Ġuse Ġfor Ġall Ġdata Ġin Ġlayer ĊĠĠĠ Ġprivate Ġvar Ġderived Weights Ġ= ĠAtomic Map < String , ĠArray < Array < Float >> >() // Array ( this . ne uron Count ) Ġ{ Ġ 0 . 0 Ġ} ĊĠĠĠ Ġprivate Ġvar Ġweights : ĠArray < Array < Float >> Ġ= Ġempty Array () // input Map Depth Ġ* Ġmap Depth ĊĊĠĠĠ Ġoverride Ġfun Ġforward Impl ( data Id : ĠLong , Ġinput Neuron : ĠArray < Float >, Ġy : ĠFloat , Ġtraining : ĠBoolean ): ĠArray < Float > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( input Neuron . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" input Ġne uron Ġerror , Ġdata Ġsize :[ % s ] ". format ( input Neuron . size )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . weights . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . weights Ġ= ĠArray ( input Neuron . size ) Ġ{ ĠArray ( this . ne uron Count ) Ġ{ Ġ 0 . 1 f Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Neuron Ġ= Ġinput Neuron . multiply ( this . weights ) ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput Neuron ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġbackward Impl ( data Id : ĠLong , Ġinput Neuron : ĠArray < Float >, Ġy : ĠFloat ) Ġ{ Ċ // add Ġbias Ġwhen Ġsupport Ġbias ĊĠĠĠĠĠĠĠ Ġval Ġnew Input Neuron Ġ= Ġinput Neuron ĊĠĠĠĠĠĠĠ Ġ// out Ġput Ġloss ĊĠĠĠĠĠĠĠ Ġval Ġnext Layer Loss Ġ= ĠgetNext Layer Input Neuron Loss ( data Id ) Ċ // ĠĠĠĠĠĠĠ Ġprintln ( this . weights . toJson () Ġ+ Ġ", Ġnext Ġlayer Ġloss :" Ġ+ Ġnext Layer Loss . toJson ()) ĊĠĠĠĠĠĠĠ Ġ// update Ġcurrent Ġlayer Ġinput Ġne uron Ġloss ĊĠĠĠĠĠĠĠ Ġval Ġinput Neuron Loss Ġ= Ġthis . weights . multiply ( next Layer Loss . transpose ()) // only Ġone Ġloss , Ġafter Ġcalculate , Ġtransform Ġto Ġinput Neuron Count * 1 Ġmatrix Ċ // ĠĠĠĠĠĠĠ Ġinput Neuron Loss . print To Matrix () ĊĠĠĠĠĠĠĠ Ġthis . input Neuron Loss [ data Id ] Ġ= Ġinput Neuron Loss . to New Array Ġ{ Ġit [ 0 ] Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġprintln (" ----- back ----- " Ġ+ Ġthis . input Neuron Map [ data Id ]?. toJson () Ġ+ Ġ"," Ġ+ Ġthis . input Neuron Loss [ data Id ]?. toJson ()) Ċ // ĠĠĠĠĠĠĠ Ġprintln (" input Ġsize :${ input Neuron . size }, Ġout Ġput Ġsize :${ this . ne uron Count }, Ġnext Ġlayer Ġloss :${ next Layer Loss . toJson () }") ĊĊĠĠĠĠĠĠĠ Ġ// derived , Ġweight Ġgradient Ġdesc ent , Ġsum Ġall Ġweight Ġgrad Ġfor Ġevery Ġx , Ġuse Ġfor Ġaverage Ġweight Ġgrad ĊĠĠĠĠĠĠĠ Ġthis . derived Weights . operate ( DER IVED _ WEIGHT S _ KEY , Ġcreate Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( new Input Neuron . size ) Ġ{ Ġx Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġnew Input Neuron [ x Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( this . ne uron Count ) Ġ{ Ġoutput Neuron Index Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" x :$ x , Ġderived :" Ġ+ Ġordinary Least S quares Derived ( x , Ġnext Layer Loss [ output Neuron Index ][ 0 ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġordinary Least S quares Derived ( x , Ġnext Layer Loss [ output Neuron Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġupdate Ġ= Ġ{ Ġold Derived Weights Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( new Input Neuron . size ) Ġ{ Ġx Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġnew Input Neuron [ x Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( this . ne uron Count ) Ġ{ Ġoutput Neuron Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Derived Weights [ x Index ][ output Neuron Index ] Ġ+ Ġordinary Least S quares Derived ( x , Ġnext Layer Loss [ output Neuron Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġforward Reset Impl ( data Id : ĠLong ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Impl ( epoch : ĠInt , Ġprint Period : ĠInt , Ġtotal DataSize : ĠLong , Ġlearning Rate : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// update Ġall Ġweight , Ġgradient Ġdesc ent ĊĠĠĠĠĠĠĠ Ġval Ġderived Weights Ġ= Ġthis . derived Weights [ DER IVED _ WEIGHT S _ KEY ] Ġ?: Ġempty Array () ĊĠĠĠĠĠĠĠ Ġthis . weights . forEach Indexed Ġ{ Ġweight Index , Ġoutput Neuron Weight Array Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Neuron Weight Array . forEach Indexed Ġ{ Ġoutput Neuron Index , Ġweight Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . weights [ weight Index ][ output Neuron Index ] Ġ= Ġweight Ġ- Ġ( learning Rate Ġ* Ġderived Weights [ weight Index ][ output Neuron Index ]) Ġ/ Ġtotal DataSize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( epoch Ġ% Ġprint Period Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" epoch :% s , Ġweight Ġarray :% s ", Ġepoch , Ġthis . weights . toJson (). to Brief String ( 1 0 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// reset Ġafter Ġupdate ĊĠĠĠĠĠĠĠ Ġthis . derived Weights . clear () // reset Ġafter Ġupdate Ġper Ġone Ġtime ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinitialize Layer Model Data Impl ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġdata . json ToMap () ĊĠĠĠĠĠĠĠ Ġval Ġweights Data Ġ= Ġmap [ WEIGHT S _ KEY ]?. json ToObject List ( Array < Float >:: class ) ĊĠĠĠĠĠĠĠ Ġif Ġ( weights Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . weights Ġ= Ġweights Data . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Layer Model Data Impl (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠArray < Array < Float >> >() ĊĠĠĠĠĠĠĠ Ġmap [ WEIGHT S _ KEY ] Ġ= Ġthis . weights ĊĠĠĠĠĠĠĠ Ġreturn Ġmap . toJson () ĊĠĠĠ Ġ} Ċ }