@@ -143,6 +143,20 @@ public void TensorIm2Col2()
143
143
}
144
144
}
145
145
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
+
146
160
//[TestMethod]
147
161
//public void TensorCalculateWeightUpdate()
148
162
//{
@@ -335,7 +349,7 @@ void _TensorReverseIm2Col(int filterWidth, int filterHeight, int stride, int dep
335
349
cpuFilterList . Add ( cpuFilter . Column ( i ) . Split ( depth ) . Select ( v => v . Rotate ( v . Count / filterWidth ) ) . ToList ( ) ) ;
336
350
337
351
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);
339
353
340
354
using ( var gpuTensor = _cuda . Create3DTensor ( outputTensor . AsIndexable ( ) ) ) {
341
355
var gpuFilterList = cpuFilterList . Select ( fl => fl . Select ( f => _cuda . CreateVector ( f . AsIndexable ( ) ) ) . ToList ( ) ) . ToList ( ) ;
@@ -369,6 +383,18 @@ public void TensorReverseIm2Col4()
369
383
_TensorReverseIm2Col ( 2 , 2 , 2 , 2 , 2 , 4 , 4 ) ;
370
384
}
371
385
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
+
372
398
FloatMatrix _CreateMatrix ( int depth , int rows , int columns , Func < int , int , int , float > valueProvider )
373
399
{
374
400
return new FloatMatrix {
@@ -440,6 +466,18 @@ public void TensorCombineDepthSlices()
440
466
FloatingPointHelper . AssertEqual ( cpuCombined . AsIndexable ( ) , gpuCombined . AsIndexable ( ) ) ;
441
467
}
442
468
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
+
443
481
[ TestMethod ]
444
482
public void TensorAddInPlace ( )
445
483
{
@@ -682,11 +720,26 @@ public void Tensor4DColumnSums()
682
720
}
683
721
}
684
722
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
+ }
685
738
686
739
[ TestMethod ]
687
740
public void Tensor4DReverseIm2Col ( )
688
741
{
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 ;
690
743
691
744
var normalDistribution = new Normal ( 0 , 1 ) ;
692
745
var data = Enumerable . Range ( 0 , count )
@@ -698,8 +751,6 @@ public void Tensor4DReverseIm2Col()
698
751
for ( var i = 0 ; i < cpuFilter . ColumnCount ; i ++ )
699
752
cpuFilterList . Add ( cpuFilter . Column ( i ) . Split ( depth ) . Select ( v => v . Rotate ( v . Count / filterWidth ) ) . ToList ( ) ) ;
700
753
701
- var cpuReverseIm2Col = cpuTensor . ReverseIm2Col ( cpuFilterList , rows , columns , depth , 0 , filterHeight , filterWidth , stride ) ;
702
-
703
754
using ( var gpuTensor = _cuda . Create4DTensor ( data ) )
704
755
using ( var gpuFilter = _cuda . CreateMatrix ( cpuFilter . AsIndexable ( ) ) ) {
705
756
var gpuFilterList = new List < IReadOnlyList < IVector > > ( ) ;
@@ -720,9 +771,12 @@ public void Tensor4DReverseIm2Col()
720
771
}
721
772
FloatingPointHelper . AssertEqual ( cpuTensor . AsIndexable ( ) , gpuTensor . AsIndexable ( ) ) ;
722
773
774
+ var cpuReverseIm2Col = cpuTensor . ReverseIm2Col ( cpuFilterList , rows , columns , depth , 0 , filterHeight , filterWidth , stride ) ;
723
775
using ( var gpuReverseIm2Col = gpuTensor . ReverseIm2Col ( gpuFilterList , rows , columns , depth , 0 , filterHeight , filterWidth , stride ) ) {
724
776
var cpuResult = cpuReverseIm2Col . AsIndexable ( ) ;
725
777
var gpuResult = gpuReverseIm2Col . AsIndexable ( ) ;
778
+ var cpuXml = cpuResult . AsXml ;
779
+ var gpuXml = gpuResult . AsXml ;
726
780
FloatingPointHelper . AssertEqual ( cpuResult , gpuResult ) ;
727
781
728
782
foreach ( var filter in gpuFilterList ) {
0 commit comments