@@ -142,6 +142,51 @@ public void FBetaScore()
142142 Assert . AreEqual ( r , new [ ] { 0.3846154f , 0.90909094f , 0.8333334f } ) ;
143143 }
144144
145+ /// <summary>
146+ /// https://www.tensorflow.org/addons/api_docs/python/tfa/metrics/HammingLoss
147+ /// </summary>
148+ [ TestMethod ]
149+ public void HammingLoss ( )
150+ {
151+ // multi-class hamming loss
152+ var y_true = np . array ( new [ , ]
153+ {
154+ { 1 , 0 , 0 , 0 } ,
155+ { 0 , 0 , 1 , 0 } ,
156+ { 0 , 0 , 0 , 1 } ,
157+ { 0 , 1 , 0 , 0 }
158+ } ) ;
159+ var y_pred = np . array ( new [ , ]
160+ {
161+ { 0.8f , 0.1f , 0.1f , 0.0f } ,
162+ { 0.2f , 0.0f , 0.8f , 0.0f } ,
163+ { 0.05f , 0.05f , 0.1f , 0.8f } ,
164+ { 1.0f , 0.0f , 0.0f , 0.0f }
165+ } ) ;
166+ var m = tf . keras . metrics . HammingLoss ( mode : "multiclass" , threshold : 0.6f ) ;
167+ m . update_state ( y_true , y_pred ) ;
168+ var r = m . result ( ) . numpy ( ) ;
169+ Assert . AreEqual ( r , 0.25f ) ;
170+
171+ // multi-label hamming loss
172+ y_true = np . array ( new [ , ]
173+ {
174+ { 1 , 0 , 1 , 0 } ,
175+ { 0 , 1 , 0 , 1 } ,
176+ { 0 , 0 , 0 , 1 }
177+ } ) ;
178+ y_pred = np . array ( new [ , ]
179+ {
180+ { 0.82f , 0.5f , 0.9f , 0.0f } ,
181+ { 0f , 1f , 0.4f , 0.98f } ,
182+ { 0.89f , 0.79f , 0f , 0.3f }
183+ } ) ;
184+ m = tf . keras . metrics . HammingLoss ( mode : "multilabel" , threshold : 0.8f ) ;
185+ m . update_state ( y_true , y_pred ) ;
186+ r = m . result ( ) . numpy ( ) ;
187+ Assert . AreEqual ( r , 0.16666667f ) ;
188+ }
189+
145190 /// <summary>
146191 /// https://www.tensorflow.org/api_docs/python/tf/keras/metrics/TopKCategoricalAccuracy
147192 /// </summary>
0 commit comments