@@ -143,6 +143,20 @@ public void TensorIm2Col2()
143143 }
144144 }
145145
146+ [ TestMethod ]
147+ public void TensorIm2Col3 ( )
148+ {
149+ var normalDistribution = new Normal ( 0 , 1 ) ;
150+ using ( var cpuTensor = _cpu . Create3DTensor ( Enumerable . Range ( 0 , 2 ) . Select ( i => _cpu . CreateMatrix ( 8 , 8 , ( j , k ) => Convert . ToSingle ( normalDistribution . Sample ( ) ) ) ) . ToList ( ) ) )
151+ using ( var gpuTensor = _cuda . Create3DTensor ( cpuTensor . AsIndexable ( ) ) )
152+ using ( var cpuMatrix = cpuTensor . Im2Col ( 2 , 2 , 1 ) )
153+ using ( var gpuMatrix = gpuTensor . Im2Col ( 2 , 2 , 1 ) ) {
154+ var cpu = cpuMatrix . AsIndexable ( ) ;
155+ var gpu = gpuMatrix . AsIndexable ( ) ;
156+ FloatingPointHelper . AssertEqual ( cpu , gpu ) ;
157+ }
158+ }
159+
146160 //[TestMethod]
147161 //public void TensorCalculateWeightUpdate()
148162 //{
@@ -335,7 +349,7 @@ void _TensorReverseIm2Col(int filterWidth, int filterHeight, int stride, int dep
335349 cpuFilterList . Add ( cpuFilter . Column ( i ) . Split ( depth ) . Select ( v => v . Rotate ( v . Count / filterWidth ) ) . ToList ( ) ) ;
336350
337351 var cpuReverseIm2Col = outputTensor . ReverseIm2Col ( cpuFilterList , inputHeight , inputWidth , depth , 0 , filterHeight , filterWidth , stride ) ;
338- var cpuUpdate = cpuReverseIm2Col . ConvertTo3DTensor ( inputHeight , inputWidth ) ;
352+ // var cpuUpdate = cpuReverseIm2Col.ConvertTo3DTensor(inputHeight, inputWidth);
339353
340354 using ( var gpuTensor = _cuda . Create3DTensor ( outputTensor . AsIndexable ( ) ) ) {
341355 var gpuFilterList = cpuFilterList . Select ( fl => fl . Select ( f => _cuda . CreateVector ( f . AsIndexable ( ) ) ) . ToList ( ) ) . ToList ( ) ;
@@ -369,6 +383,18 @@ public void TensorReverseIm2Col4()
369383 _TensorReverseIm2Col ( 2 , 2 , 2 , 2 , 2 , 4 , 4 ) ;
370384 }
371385
386+ [ TestMethod ]
387+ public void TensorReverseIm2Col5 ( )
388+ {
389+ _TensorReverseIm2Col ( 2 , 2 , 1 , 2 , 1 , 4 , 4 ) ;
390+ }
391+
392+ [ TestMethod ]
393+ public void TensorReverseIm2Col6 ( )
394+ {
395+ _TensorReverseIm2Col ( 2 , 2 , 1 , 2 , 2 , 4 , 4 ) ;
396+ }
397+
372398 FloatMatrix _CreateMatrix ( int depth , int rows , int columns , Func < int , int , int , float > valueProvider )
373399 {
374400 return new FloatMatrix {
@@ -440,6 +466,18 @@ public void TensorCombineDepthSlices()
440466 FloatingPointHelper . AssertEqual ( cpuCombined . AsIndexable ( ) , gpuCombined . AsIndexable ( ) ) ;
441467 }
442468
469+ [ TestMethod ]
470+ public void TensorCombineDepthSlices2 ( )
471+ {
472+ var tensor = _CreateTensor ( 12 , 6 , 3 , ( i , j , k ) => ( i + 1 ) * ( j + 1 ) * ( k + 1 ) ) ;
473+ var cpuTensor = _cpu . Create3DTensor ( tensor ) ;
474+ var cpuCombined = cpuTensor . CombineDepthSlices ( ) ;
475+
476+ using ( var gpuTensor = _cuda . Create3DTensor ( tensor ) )
477+ using ( var gpuCombined = gpuTensor . CombineDepthSlices ( ) )
478+ FloatingPointHelper . AssertEqual ( cpuCombined . AsIndexable ( ) , gpuCombined . AsIndexable ( ) ) ;
479+ }
480+
443481 [ TestMethod ]
444482 public void TensorAddInPlace ( )
445483 {
@@ -682,11 +720,26 @@ public void Tensor4DColumnSums()
682720 }
683721 }
684722
723+ [ TestMethod ]
724+ public void Tensor4DGetTensorAt ( )
725+ {
726+ var data = Enumerable . Range ( 0 , 5 )
727+ . Select ( z => _CreateTensor ( 3 , 4 , 2 , ( i , j , k ) => ( i + 1 ) * ( j + 1 ) * ( k + 1 ) ) ) . ToList ( ) ;
728+ var cpu4dTensor = _cpu . Create4DTensor ( data ) ;
729+
730+ using ( var gpu4dTensor = _cuda . Create4DTensor ( data ) ) {
731+ for ( var i = 0 ; i < 5 ; i ++ ) {
732+ var cpuTensor = cpu4dTensor . GetTensorAt ( i ) ;
733+ var gpuTensor = gpu4dTensor . GetTensorAt ( i ) ;
734+ FloatingPointHelper . AssertEqual ( cpuTensor . AsIndexable ( ) , gpuTensor . AsIndexable ( ) ) ;
735+ }
736+ }
737+ }
685738
686739 [ TestMethod ]
687740 public void Tensor4DReverseIm2Col ( )
688741 {
689- const int rows = 4 , columns = 4 , depth = 2 , count = 2 , filterWidth = 2 , filterHeight = 2 , filterCount = 4 , stride = 2 ;
742+ const int rows = 4 , columns = 4 , depth = 1 , count = 1 , filterWidth = 2 , filterHeight = 2 , filterCount = 1 , stride = 2 ;
690743
691744 var normalDistribution = new Normal ( 0 , 1 ) ;
692745 var data = Enumerable . Range ( 0 , count )
@@ -698,8 +751,6 @@ public void Tensor4DReverseIm2Col()
698751 for ( var i = 0 ; i < cpuFilter . ColumnCount ; i ++ )
699752 cpuFilterList . Add ( cpuFilter . Column ( i ) . Split ( depth ) . Select ( v => v . Rotate ( v . Count / filterWidth ) ) . ToList ( ) ) ;
700753
701- var cpuReverseIm2Col = cpuTensor . ReverseIm2Col ( cpuFilterList , rows , columns , depth , 0 , filterHeight , filterWidth , stride ) ;
702-
703754 using ( var gpuTensor = _cuda . Create4DTensor ( data ) )
704755 using ( var gpuFilter = _cuda . CreateMatrix ( cpuFilter . AsIndexable ( ) ) ) {
705756 var gpuFilterList = new List < IReadOnlyList < IVector > > ( ) ;
@@ -720,9 +771,12 @@ public void Tensor4DReverseIm2Col()
720771 }
721772 FloatingPointHelper . AssertEqual ( cpuTensor . AsIndexable ( ) , gpuTensor . AsIndexable ( ) ) ;
722773
774+ var cpuReverseIm2Col = cpuTensor . ReverseIm2Col ( cpuFilterList , rows , columns , depth , 0 , filterHeight , filterWidth , stride ) ;
723775 using ( var gpuReverseIm2Col = gpuTensor . ReverseIm2Col ( gpuFilterList , rows , columns , depth , 0 , filterHeight , filterWidth , stride ) ) {
724776 var cpuResult = cpuReverseIm2Col . AsIndexable ( ) ;
725777 var gpuResult = gpuReverseIm2Col . AsIndexable ( ) ;
778+ var cpuXml = cpuResult . AsXml ;
779+ var gpuXml = gpuResult . AsXml ;
726780 FloatingPointHelper . AssertEqual ( cpuResult , gpuResult ) ;
727781
728782 foreach ( var filter in gpuFilterList ) {
0 commit comments