22
22
__all__ = [
23
23
'Accuracy' ,
24
24
'ChunkEvaluator' ,
25
+ 'EditDistance' ,
25
26
]
26
27
27
28
@@ -211,7 +212,7 @@ def eval(self, executor, eval_program=None):
211
212
class EditDistance (Evaluator ):
212
213
"""
213
214
Accumulate edit distance sum and sequence number from mini-batches and
214
- compute the average edit_distance of all batches.
215
+ compute the average edit_distance and instance error of all batches.
215
216
216
217
Args:
217
218
input: the sequences predicted by network.
@@ -228,11 +229,11 @@ class EditDistance(Evaluator):
228
229
distance_evaluator.reset(exe)
229
230
for data in batches:
230
231
loss = exe.run(fetch_list=[cost])
231
- distance, sequence_error = distance_evaluator.eval(exe)
232
+ distance, instance_error = distance_evaluator.eval(exe)
232
233
233
234
In the above example:
234
235
'distance' is the average of the edit distance rate in a pass.
235
- 'sequence_error ' is the sequence error rate in a pass.
236
+ 'instance_error ' is the instance error rate in a pass.
236
237
237
238
"""
238
239
@@ -246,24 +247,27 @@ def __init__(self, input, label, ignored_tokens=None, **kwargs):
246
247
dtype = 'float32' , shape = [1 ], suffix = 'total_distance' )
247
248
self .seq_num = self .create_state (
248
249
dtype = 'int64' , shape = [1 ], suffix = 'seq_num' )
249
- self .seq_error = self .create_state (
250
- dtype = 'int64' , shape = [1 ], suffix = 'seq_error ' )
250
+ self .instance_error = self .create_state (
251
+ dtype = 'int64' , shape = [1 ], suffix = 'instance_error ' )
251
252
distances , seq_num = layers .edit_distance (
252
253
input = input , label = label , ignored_tokens = ignored_tokens )
253
254
254
255
zero = layers .fill_constant (shape = [1 ], value = 0.0 , dtype = 'float32' )
255
256
compare_result = layers .equal (distances , zero )
256
257
compare_result_int = layers .cast (x = compare_result , dtype = 'int' )
257
258
seq_right_count = layers .reduce_sum (compare_result_int )
258
- seq_error_count = layers .elementwise_sub (x = seq_num , y = seq_right_count )
259
+ instance_error_count = layers .elementwise_sub (
260
+ x = seq_num , y = seq_right_count )
259
261
total_distance = layers .reduce_sum (distances )
260
262
layers .sums (
261
263
input = [self .total_distance , total_distance ],
262
264
out = self .total_distance )
263
265
layers .sums (input = [self .seq_num , seq_num ], out = self .seq_num )
264
- layers .sums (input = [self .seq_error , seq_error_count ], out = self .seq_error )
266
+ layers .sums (
267
+ input = [self .instance_error , instance_error_count ],
268
+ out = self .instance_error )
265
269
self .metrics .append (total_distance )
266
- self .metrics .append (seq_error_count )
270
+ self .metrics .append (instance_error_count )
267
271
268
272
def eval (self , executor , eval_program = None ):
269
273
if eval_program is None :
@@ -272,11 +276,12 @@ def eval(self, executor, eval_program=None):
272
276
with program_guard (main_program = eval_program ):
273
277
total_distance = _clone_var_ (block , self .total_distance )
274
278
seq_num = _clone_var_ (block , self .seq_num )
275
- seq_error = _clone_var_ (block , self .seq_error )
279
+ instance_error = _clone_var_ (block , self .instance_error )
276
280
seq_num = layers .cast (x = seq_num , dtype = 'float32' )
277
- seq_error = layers .cast (x = seq_error , dtype = 'float32' )
281
+ instance_error = layers .cast (x = instance_error , dtype = 'float32' )
278
282
avg_distance = layers .elementwise_div (x = total_distance , y = seq_num )
279
- avg_seq_error = layers .elementwise_div (x = seq_error , y = seq_num )
280
- result = executor .run (eval_program ,
281
- fetch_list = [avg_distance , avg_seq_error ])
283
+ avg_instance_error = layers .elementwise_div (
284
+ x = instance_error , y = seq_num )
285
+ result = executor .run (
286
+ eval_program , fetch_list = [avg_distance , avg_instance_error ])
282
287
return np .array (result [0 ]), np .array (result [1 ])
0 commit comments