@@ -1184,19 +1184,42 @@ public void ToArray()
11841184 }
11851185 }
11861186
1187+ /// <summary>
1188+ /// Dropout should let the volume go thru if drop probability is 0
1189+ /// </summary>
1190+ [ TestMethod ]
1191+ public void DropoutWith0Dropprob ( )
1192+ {
1193+ var volume = NewVolume ( RandomUtilities . RandomDoubleArray ( 100 ) , new Shape ( 100 ) ) ;
1194+ var result = NewVolume ( new double [ 100 ] , new Shape ( 100 ) ) ;
1195+ var dropprob = ( T ) Convert . ChangeType ( 0.0 , typeof ( T ) ) ;
1196+
1197+ // Forward
1198+ volume . DoDropout ( result , dropprob ) ;
1199+ Assert . IsTrue ( volume . ToArray ( ) . SequenceEqual ( result . ToArray ( ) ) ) ;
1200+
1201+ // Backward
1202+ var inputGradient = BuilderInstance < T > . Volume . SameAs ( volume . Storage , volume . Shape ) ;
1203+ var outputActivationGradient = NewVolume ( new double [ 100 ] . Populate ( 1.0 ) , new Shape ( 100 ) ) ;
1204+ volume . DoDropoutGradient ( volume , outputActivationGradient , inputGradient , dropprob ) ;
1205+
1206+ Assert . IsTrue ( inputGradient . ToArray ( ) . SequenceEqual ( outputActivationGradient . ToArray ( ) ) ) ;
1207+ }
1208+
11871209 [ TestMethod ]
11881210 public void Dropout ( )
11891211 {
11901212 var volume = NewVolume ( new double [ 100 ] . Populate ( 1.0 ) , new Shape ( 100 ) ) ;
11911213 var result = NewVolume ( new double [ 100 ] , new Shape ( 100 ) ) ;
11921214
1193- var dropProb = 0.5 ;
1215+ var dropProb = 0.0 ;
11941216 volume . DoDropout ( result , ( T ) Convert . ChangeType ( dropProb , typeof ( T ) ) ) ;
11951217
11961218 var array = result . Storage . ToArray ( ) ;
11971219 var c = array . Count ( o => o . Equals ( Ops < T > . Zero ) ) ;
1198- Assert . IsTrue ( c > 0 ) ;
1220+ Assert . IsTrue ( dropProb > 0 ? c > 0 : c >= 0 ) ;
11991221
1222+ // Check magnitude scale up
12001223 var nonZeroEntry = array . First ( o => ! o . Equals ( Ops < T > . Zero ) ) ;
12011224 AssertNumber . AreEqual ( 1.0 / ( 1 - dropProb ) , nonZeroEntry , 1e-6 ) ;
12021225
0 commit comments