package Ġcom . m cc or by . phot ol abel ler . trainer Ċ Ċ import Ġcom . m cc or by . phot ol abel ler . config . Shared Config Ċ import Ġcom . m cc or by . phot ol abel ler . model . Iteration Logger Ċ import Ġcom . m cc or by . phot ol abel ler . model . Stats Ċ import Ġcom . m cc or by . phot ol abel ler . model . Trainer Ċ import Ġcom . m cc or by . phot ol abel ler . repository . Local DataSource Ċ import Ġorg . deep learning 4 j . nn . api . Model Ċ import Ġorg . deep learning 4 j . nn . mult il ayer . Multi Layer Network Ċ import Ġorg . deep learning 4 j . nn . transfer learning . Transfer Learning Ċ import Ġorg . deep learning 4 j . optimize . api . Iteration Listener Ċ import Ġorg . deep learning 4 j . optimize . api . Training Listener Ċ import Ġorg . deep learning 4 j . util . Model Serializer Ċ import Ġorg . nd 4 j . linalg . api . ndarray . IND Array Ċ import Ġorg . nd 4 j . linalg . factory . Nd 4 j Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġa Ġsingleton Ġobject . ĠWe Ġdon 't Ġwant Ġto Ġcreate Ġa Ġtrainer Ġeach Ġtime Ġwe Ġneed Ġit Ċ Ġ* ĠThe Ġtrainer Ġholds Ġa Ġreference Ġto Ġthe Ġmodel Ġthat Ġis Ġthe Ġbiggest Ġobject Ġin Ġthe Ġapp Ġand Ġthe Ċ Ġ* Ġmost Ġcost ly Ġto Ġbuild Ċ Ġ* ĠThe Ġtrainer Ġdoes Ġa Ġtransfer Ġlearning Ġprocess Ġduring Ġtraining , Ġtaking Ġthe Ġimages Ġin Ġthe Ġdirectories Ċ Ġ* Ġand Ġusing Ġthem Ġto Ġupdate Ġthe Ġmodel Ċ Ġ* Ċ Ġ*/ Ċ Ċ class ĠTr ainer Impl : ĠTr ainer Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinstance : ĠTr ainer Impl Ġ= ĠTr ainer Impl () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġconfig : ĠShared Config ĊĠĠĠ Ġlateinit Ġvar Ġlocal DataSource : ĠLocal DataSource ĊĠĠĠ Ġlateinit Ġvar Ġimage Processor : ĠImage Processor Impl ĊĠĠĠ Ġvar Ġiteration Logger : ĠIteration Logger ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġiteration Listener Ġ= Ġobject Ġ: ĠTraining Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiteration Done ( model : ĠModel ?, Ġiteration : ĠInt , Ġepoch : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiteration Logger ?. on Iteration Done (" Score Ġat Ġiteration Ġ$ iteration : Ġ${ model !!. score () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Gradient Calculation ( model : ĠModel ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Backward Pass ( model : ĠModel ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forward Pass ( model : ĠModel ?, Ġactiv ations : ĠMutable List < IND Array > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Forward Pass ( model : ĠModel ?, Ġactiv ations : ĠMutable Map < String , ĠIND Array > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Epoch End ( model : ĠModel ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Epoch Start ( model : ĠModel ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmodel : ĠMulti Layer Network ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġsamples Used In Training : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġload Model ( location : ĠFile ): ĠStats Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġmodel ĊĠĠĠĠĠĠĠ Ġmodel Ġ= ĠModel Serializer . restore Multi Layer Network ( location ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( model . toString ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠStats (" Model Ġloaded ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtrain ( num Samples : ĠInt , Ġepochs : ĠInt ): ĠStats Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel Ġ?: Ġreturn ĠStats (" Model Ġnot Ġready ") ĊĊĠĠĠĠĠĠĠ Ġval Ġimage Loader Ġ= ĠClient C if ar Loader ( local DataSource , Ġimage Processor , Ġconfig . labels ) ĊĊĠĠĠĠĠĠĠ Ġval ĠdataSet Iterator Ġ= ĠClient C if ar DataSet Iterator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . batch Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . labels . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Samples ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFree ze Ġall Ġlayers Ġuntil Ġthe Ġlayer Ġindexed Ġin Ġthe Ġconfig Ġfile ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġindex Ġmust Ġmatch Ġthe Ġindex Ġin Ġthe Ġmodel Ġcreated Ġin Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġval Ġnew Model Ġ= ĠTransfer Learning . Builder ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Feature Extractor ( config . feature Layer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ// ĠA Ġsecond Ġmodel Ġis Ġgenerated Ġwith ĠTransfer Learning . ĠWe Ġcannot Ġaff ord Ġhaving Ġtwo ! ĊĠĠĠĠĠĠĠ Ġmodel Ġ= Ġnew Model ĊĊĠĠĠĠĠĠĠ Ġmodel !!. set Listeners ( iteration Listener ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġepochs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Epoch ================ ==== =$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet Iterator . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel !!. fit ( data Set Iterator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsamples Used In Training Ġ= ĠMath . min ( image Loader . total Examples (), Ġconfig . max Samples ) ĊĠĠĠĠĠĠĠ Ġ// ĠEmpty Ġlisteners ĊĠĠĠĠĠĠĠ Ġmodel !!. listeners Ġ= ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠStats (" Model Ġtrained ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Model Loaded () Ġ= Ġmodel Ġ!= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġpredict ( file : ĠFile ): ĠStats Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodel ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġimage Processor . process Image ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġhave Ġa Ġ[ batch _ size , Ġchannels , Ġwidth , Ġheight ] Ġarray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . predict ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġit . output ( image ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġresult . join ToString (", Ġ", Ġprefix Ġ= Ġ"[", Ġpostfix Ġ= Ġ"] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStats ( message , Ġresult [ 0 ], Ġoutput . data (). as Double (). asList ()) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠStats (" Model Ġnot Ġready ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Model ( file : ĠFile ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ ĠModel Serializer . write Model ( model !! , Ġfile , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Samples In Training () Ġ= Ġsamples Used In Training ĊĊĠĠĠ Ġoverride Ġfun Ġget Update From Layer (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġweights Ġ= Ġmodel !!. get Layer ( config . feature Layer Index ). params () ĊĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ ĠN d 4 j . write ( output Stream , Ġweights ) ĊĠĠĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠoutputStream . toByteArray () ĊĠĠĠĠĠĠĠ ĠoutputStream . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġbytes ĊĠĠĠ Ġ} Ċ }