/* Ċ * Ġ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 Ċ Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . K Graph Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . layer . con volution al . Conv Padding Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . layer . pool ing . Avg Pool 3 D Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . shape . shape Ċ import Ġorg . jetbrains . kotlin x . dl . api . core . shape . to IntArray Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . tensorflow . E ager Session Ċ import Ġorg . tensorflow . Graph Ċ import Ġorg . tensorflow . Shape Ċ import Ġorg . tensorflow . op . Ops Ċ Ċ private Ġconst Ġval ĠEPS : ĠFloat Ġ= Ġ 1 e - 6 f Ċ Ċ internal Ġclass ĠA vg Pool 3 D Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġinput Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 . 0 f , Ġ- 2 . 0 f , Ġ 3 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 0 . 5 f , Ġ 2 . 0 f , Ġ 5 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf (- 1 . 0 f , Ġ 3 . 0 f , Ġ 2 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 . 5 f , Ġ- 1 . 0 f , Ġ 0 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf (- 1 . 0 f , Ġ 2 . 0 f , Ġ- 2 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 2 . 5 f , Ġ 3 . 0 f , Ġ 1 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf (- 2 . 0 f , Ġ 3 . 0 f , Ġ 2 . 5 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf (- 3 . 0 f , Ġ 1 . 0 f , Ġ 1 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 . 0 f , Ġ 3 . 0 f , Ġ 1 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 6 . 0 f , Ġ- 2 . 5 f , Ġ 4 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 7 . 0 f , Ġ 0 . 0 f , Ġ 5 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 . 0 f , Ġ 2 . 0 f , Ġ 4 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 7 . 0 f , Ġ- 3 . 0 f , Ġ 2 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 . 0 f , Ġ 2 . 0 f , Ġ 2 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 3 . 0 f , Ġ 5 . 0 f , Ġ- 2 . 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 3 . 0 f , Ġ- 1 . 0 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġinput Shape : ĠShape Ġ= Ġinput . shape ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdefault () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= ĠA vg Pool 3 D () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 8 . 0 f Ġ/ Ġ 8 , Ġ 4 . 5 f Ġ/ Ġ 8 , Ġ 1 6 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 9 . 5 f Ġ/ Ġ 8 , Ġ 1 2 . 0 f Ġ/ Ġ 8 , Ġ 1 3 . 5 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠE ager Session . create (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtf Ġ= ĠOps . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayer . build ( tf , ĠK Graph ( Graph (). to Graph Def ()), Ġinput Shape ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Op Ġ= Ġtf . constant ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Training Ġ= Ġtf . constant ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Los ses Ġ= Ġtf . constant ( 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġlayer . forward ( tf , Ġinput Op , Ġis Training , ĠnumberOf Los ses ). as Output () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġoutput Ġshape Ġis Ġcorrect . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Shape Ġ= Ġint ArrayOf ( input . size , Ġ 1 , Ġ 1 , Ġ 2 , Ġinput [ 0 ][ 0 ][ 0 ][ 0 ]. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Shape , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . shape (). to IntArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġoutput Ġvalues Ġare Ġcorrect . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠArray ( input . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( 1 ) Ġ{ ĠArray ( 1 ) Ġ{ ĠArray ( 2 ) Ġ{ ĠFloat Array ( input [ 0 ][ 0 ][ 0 ][ 0 ]. size ) Ġ} Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . tensor (). copy To ( actual ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġexpected . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġexpected [ i ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġexpected [ i ][ j ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( l Ġin Ġexpected [ i ][ j ][ k ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected [ i ][ j ][ k ][ l ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual [ i ][ j ][ k ][ l ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEPS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwith Padding And Stride () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= ĠA vg Pool 3 D ( strides Ġ= Ġlong ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 ), Ġpadding Ġ= ĠConv Padding . SAME ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 8 . 0 f Ġ/ Ġ 8 , Ġ 4 . 5 f Ġ/ Ġ 8 , Ġ 1 6 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 7 . 0 f Ġ/ Ġ 8 , Ġ 1 5 . 5 f Ġ/ Ġ 8 , Ġ 1 9 . 5 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 9 . 5 f Ġ/ Ġ 8 , Ġ 1 2 . 0 f Ġ/ Ġ 8 , Ġ 1 3 . 5 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 5 . 0 f Ġ/ Ġ 8 , Ġ 2 . 0 f Ġ/ Ġ 8 , Ġ 1 2 . 0 f Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 9 . 0 f Ġ/ Ġ 8 , Ġ 8 . 0 f Ġ/ Ġ 8 , Ġ 6 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 9 . 0 f Ġ/ Ġ 8 , Ġ 2 6 . 0 f Ġ/ Ġ 8 , Ġ 7 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 2 . 0 f Ġ/ Ġ 8 , Ġ 1 6 . 0 f Ġ/ Ġ 8 , Ġ 4 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 0 . 0 f Ġ/ Ġ 8 , Ġ 0 . 0 f Ġ/ Ġ 8 , Ġ 6 . 0 f Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 3 0 . 0 f Ġ/ Ġ 8 , Ġ- 1 . 0 f Ġ/ Ġ 8 , Ġ 1 8 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 3 4 . 0 f Ġ/ Ġ 8 , Ġ 9 . 0 f Ġ/ Ġ 8 , Ġ 1 8 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 2 8 . 0 f Ġ/ Ġ 8 , Ġ 1 2 . 0 f Ġ/ Ġ 8 , Ġ 1 4 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 6 . 0 f Ġ/ Ġ 8 , Ġ 4 . 0 f Ġ/ Ġ 8 , Ġ 1 6 . 0 f Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 3 2 . 0 f Ġ/ Ġ 8 , Ġ- 4 . 0 f Ġ/ Ġ 8 , Ġ 1 6 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 6 . 0 f Ġ/ Ġ 8 , Ġ 2 8 . 0 f Ġ/ Ġ 8 , Ġ 0 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 2 4 . 0 f Ġ/ Ġ 8 , Ġ 1 6 . 0 f Ġ/ Ġ 8 , Ġ- 8 . 0 f Ġ/ Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 2 4 . 0 f Ġ/ Ġ 8 , Ġ- 8 . 0 f Ġ/ Ġ 8 , Ġ 0 . 0 f Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠE ager Session . create (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtf Ġ= ĠOps . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayer . build ( tf , ĠK Graph ( Graph (). to Graph Def ()), Ġinput Shape ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Op Ġ= Ġtf . constant ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Training Ġ= Ġtf . constant ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Los ses Ġ= Ġtf . constant ( 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġlayer . forward ( tf , Ġinput Op , Ġis Training , ĠnumberOf Los ses ). as Output () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġoutput Ġshape Ġis Ġcorrect . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Shape Ġ= Ġinput Shape . to IntArray () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Shape , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . shape (). to IntArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġoutput Ġvalues Ġare Ġcorrect . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠArray ( input . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( input [ 0 ]. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( input [ 0 ][ 0 ]. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( input [ 0 ][ 0 ][ 0 ]. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat Array ( input [ 0 ][ 0 ][ 0 ][ 0 ]. size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . tensor (). copy To ( actual ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġexpected . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġexpected [ i ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġexpected [ i ][ j ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( l Ġin Ġexpected [ i ][ j ][ k ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected [ i ][ j ][ k ][ l ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual [ i ][ j ][ k ][ l ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEPS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwith PoolSize And Stride () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= ĠA vg Pool 3 D ( pool Size Ġ= Ġlong ArrayOf ( 1 , Ġ 2 , Ġ 2 , Ġ 3 , Ġ 1 ), Ġstrides Ġ= Ġlong ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 2 5 . 0 f Ġ/ Ġ 1 2 , Ġ 1 5 . 5 f Ġ/ Ġ 1 2 , Ġ 2 3 . 5 f Ġ/ Ġ 1 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( 1 9 . 5 f Ġ/ Ġ 1 2 , Ġ 1 6 . 5 f Ġ/ Ġ 1 2 , Ġ 2 5 . 5 f Ġ/ Ġ 1 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠE ager Session . create (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtf Ġ= ĠOps . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayer . build ( tf , ĠK Graph ( Graph (). to Graph Def ()), Ġinput Shape ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Op Ġ= Ġtf . constant ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Training Ġ= Ġtf . constant ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Los ses Ġ= Ġtf . constant ( 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġlayer . forward ( tf , Ġinput Op , Ġis Training , ĠnumberOf Los ses ). as Output () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġoutput Ġshape Ġis Ġcorrect . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Shape Ġ= Ġint ArrayOf ( input . size , Ġ 1 , Ġ 1 , Ġ 2 , Ġinput [ 0 ][ 0 ][ 0 ][ 0 ]. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Shape , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . shape (). to IntArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġoutput Ġvalues Ġare Ġcorrect . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠArray ( input . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( 1 ) Ġ{ ĠArray ( 1 ) Ġ{ ĠArray ( 2 ) Ġ{ ĠFloat Array ( input [ 0 ][ 0 ][ 0 ][ 0 ]. size ) Ġ} Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . tensor (). copy To ( actual ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġexpected . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġexpected [ i ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġexpected [ i ][ j ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( l Ġin Ġexpected [ i ][ j ][ k ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected [ i ][ j ][ k ][ l ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual [ i ][ j ][ k ][ l ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEPS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ