/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠDeep ĠLearning Ġproject Ġcontributors . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin x . dl . api . core . layer . resh aping Ċ Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . K Graph Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . layer . Layer Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . shape . Tensor Shape Ċ import Ġorg . tensorflow . Operand Ċ import Ġorg . tensorflow . Shape Ċ import Ġorg . tensorflow . op . Ops Ċ Ċ /** Ċ Ġ* ĠC ro pping Ġlayer Ġfor Ġ 2 D Ġinput Ġ( e . g . Ġpicture ). Ċ Ġ* ĠIt Ġcro ps Ġalong Ġspatial Ġdimensions , Ġi . e . Ġheight Ġand Ġwidth . Ċ Ġ* Ċ Ġ* ĠInput Ġshape : Ġ 4 D Ġtensor Ġwith Ġshape Ġ`( batch _ size , Ġrows , Ġcols , Ġchannels )` Ċ Ġ* Ċ Ġ* ĠOutput Ġshape : Ġ 4 D Ġtensor Ġwith Ġshape : Ġ`( batch _ size , Ġc ropped _ rows , Ġc ropped _ cols , Ġchannels )` Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ cro pping ] Ġtuple Ġof Ġ 2 Ġtuples Ġof Ġ 2 Ġints : Ġinterpreted Ġas Ġ` (( top _ crop , Ġbottom _ crop ), Ġ( left _ crop , Ġright _ crop )) `. Ċ Ġ* Ġ@ property Ġ[ name ] ĠCustom Ġlayer Ġname . Ċ Ġ* Ġ@ constructor ĠCreates Ġ[ Flatten ] Ġobject . Ċ Ġ* Ċ Ġ* Ġ@ since Ġ 0 . 2 Ċ Ġ*/ Ċ public Ġclass ĠC ro pping 2 D ( ĊĠĠĠ Ġpublic Ġval Ġcro pping : ĠArray < IntArray >, ĊĠĠĠ Ġname : ĠString Ġ= Ġ"" Ċ ) Ġ: ĠLayer ( name ) Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshape : ĠLong Array ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( tf : ĠOps , Ġk Graph : ĠK Graph , Ġinput Shape : ĠShape ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// left Ġempty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute Output Shape ( input Shape : ĠShape ): ĠShape Ġ{ ĊĠĠĠĠĠĠĠ Ġshape Ġ= ĠTensor Shape ( input Shape ). dims () ĊĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġinput Shape . size ( 1 ) Ġ- Ġthis . cro pping [ 0 ][ 0 ] Ġ- Ġthis . cro pping [ 0 ][ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġcols Ġ= Ġinput Shape . size ( 2 ) Ġ- Ġthis . cro pping [ 1 ][ 0 ] Ġ- Ġthis . cro pping [ 1 ][ 1 ] ĊĊĠĠĠĠĠĠĠ Ġreturn ĠShape . make ( input Shape . size ( 0 ), Ġrows , Ġcols , Ġinput Shape . size ( 3 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġforward ( ĊĠĠĠĠĠĠĠ Ġtf : ĠOps , ĊĠĠĠĠĠĠĠ Ġinput : ĠOper and < Float >, ĊĠĠĠĠĠĠĠ Ġis Training : ĠOper and < Boolean >, ĊĠĠĠĠĠĠĠ ĠnumberOf Los ses : ĠOper and < Float >? ĊĠĠĠ Ġ): ĠOper and < Float > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh S liced Ġ= Ġslice Al ong Axis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtf , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cro pping [ 0 ][ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape [ 1 ] Ġ- Ġthis . cro pping [ 0 ][ 0 ] Ġ- Ġthis . cro pping [ 0 ][ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġslice Al ong Axis Ġ= Ġslice Al ong Axis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtf , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh S liced , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cro pping [ 1 ][ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape [ 2 ] Ġ- Ġthis . cro pping [ 1 ][ 1 ] Ġ- Ġthis . cro pping [ 1 ][ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġslice Al ong Axis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġrewrite Ġmore Ġcommon Ġand Ġmult id imension al Ġcase Ġhttps :// github . com / tensorflow / tf js / blob / master / tf js - layers / src / backend / tf js _ backend . ts # L 2 2 6 ĊĠĠĠ Ġprivate Ġfun Ġslice Al ong Axis ( tf : ĠOps , Ġinput : ĠOper and < Float >, Ġstart : ĠInt , Ġsize : ĠLong , Ġaxis : ĠInt ): ĠOper and < Float > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Shape Ġ= Ġinput . as Output (). shape () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( axis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġtf . slice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput , Ġtf . constant ( int ArrayOf ( 0 , Ġstart , Ġ 0 , Ġ 0 )), Ġtf . constant ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Shape . size ( 0 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Shape . size ( 2 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Shape . size ( 3 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġtf . slice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput , Ġtf . constant ( int ArrayOf ( 0 , Ġ 0 , Ġstart , Ġ 0 )), Ġtf . constant ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Shape . size ( 0 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Shape . size ( 1 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Shape . size ( 3 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException ("$ axis Ġis Ġnot Ġsupported Ġfor Ġthe Ġs licing Ġin ĠC ro pping 2 D Ġop !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġweights : ĠMap < String , ĠArray <* >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġempty Map () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġassign Weights ( value ) ĊĊĠĠĠ Ġoverride Ġval Ġhas Activation : ĠBoolean Ġget () Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġval Ġparam Count : ĠInt Ġget () Ġ= Ġ 0 Ċ } Ċ