metrics_cn.rst 13.2 KB
Newer Older
C
Cheerego 已提交
1 2 3 4 5 6
#################
 fluid.metrics
#################



T
Tink_Y 已提交
7
.. _cn_api_fluid_metrics_Accuracy:
C
Cheerego 已提交
8

T
Tink_Y 已提交
9 10
Accuracy
-------------------------------
C
Cheerego 已提交
11

T
Tink_Y 已提交
12
.. py:class:: paddle.fluid.metrics.Accuracy(name=None)
C
Cheerego 已提交
13

T
Tink_Y 已提交
14
累加mini-batch正确率,计算每次pass的平均准确率。https://en.wikipedia.org/wiki/Accuracy_and_precision
C
Cheerego 已提交
15

T
Tink_Y 已提交
16 17
参数:
    - **name** — 度量标准的名称
C
Cheerego 已提交
18

T
Tink_Y 已提交
19
**代码示例**
C
Cheerego 已提交
20 21 22

.. code-block:: python

T
Tink_Y 已提交
23 24
    labels = fluid.layers.data(name="data", shape=[1], dtype="int32")
    data = fluid.layers.data(name="data", shape=[32, 32], dtype="int32")
C
Cheerego 已提交
25
    pred = fluid.layers.fc(input=data, size=1000, act="tanh")
T
Tink_Y 已提交
26 27 28 29 30 31 32 33 34
    minibatch_accuracy = fluid.layers.accuracy(pred, label)
    accuracy_evaluator = fluid.metrics.Accuracy()
    for pass in range(PASSES):
        accuracy_evaluator.reset()
        for data in train_reader():
            batch_size = data[0]
            loss = exe.run(fetch_list=[cost, minibatch_accuracy])
        accuracy_evaluator.update(value=minibatch_accuracy, weight=batch_size)
        numpy_acc = accuracy_evaluator.eval()
C
Cheerego 已提交
35 36


T
Tink_Y 已提交
37
.. py:method:: update(value, weight)
C
Cheerego 已提交
38

T
Tink_Y 已提交
39
更新mini batch的状态.
C
Cheerego 已提交
40

T
Tink_Y 已提交
41 42 43
参数:	
    - **value** (float|numpy.array) – 每个mini batch的正确率
    - **weight** (int|float) – batch 大小
C
Cheerego 已提交
44 45 46 47 48 49 50







T
Tink_Y 已提交
51
.. _cn_api_fluid_metrics_Auc:
C
Cheerego 已提交
52

T
Tink_Y 已提交
53 54
Auc
-------------------------------
C
Cheerego 已提交
55

T
Tink_Y 已提交
56
.. py:class:: paddle.fluid.metrics.Auc(name, curve='ROC', num_thresholds=4095)
C
Cheerego 已提交
57

T
Tink_Y 已提交
58
Auc度量适用于二分类。参考 https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve  。需要注意auc度量本身是用Python计算值。如果关心速度,请用fluid.layers.auc。
C
Cheerego 已提交
59

T
Tink_Y 已提交
60
auc函数创建四个局部变量true_positives, true_negatives, false_positives和false_negatives,用于计算AUC。对于离散化AUC曲线,临界值线性间隔设置以便计算召回率和准确率的值,用false positive率的召回值高度计算ROC曲线面积,用recall的准确值高度计算PR曲线面积。
C
Cheerego 已提交
61 62

参数:
T
Tink_Y 已提交
63 64
    - **name** - 度量名
    - **curve** - 将要计算的曲线名的详情,曲线包括ROC(默认)或者PR(Precision-Recall-curve)。
C
Cheerego 已提交
65

T
Tink_Y 已提交
66
注:目前只用Python实现ROC曲线
C
Cheerego 已提交
67

T
Tink_Y 已提交
68
**代码示例**:
C
Cheerego 已提交
69

T
Tink_Y 已提交
70
.. code-block:: python
C
Cheerego 已提交
71

T
Tink_Y 已提交
72 73 74 75 76 77
    pred = fluid.layers.fc(input=data, size=1000, act="tanh")
    metric = fluid.metrics.Auc()
    for data in train_reader():
        loss, preds, labels = exe.run(fetch_list=[cost, preds, labels])
        metric.update(preds, labels)
        numpy_auc = metric.eval()
C
Cheerego 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94














.. _cn_api_fluid_metrics_ChunkEvaluator:

ChunkEvaluator
T
Tink_Y 已提交
95
-------------------------------
C
Cheerego 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

.. py:class:: paddle.fluid.metrics.ChunkEvaluator(name=None)

用mini-batch的chunk_eval累计counter numbers,用累积的counter numbers计算准确率、召回率和F1值。对于chunking的基础知识,请参考 .. _Chunking with Support Vector Machines: https://aclanthology.info/pdf/N/N01/N01-1025.pdf 。ChunkEvalEvaluator计算块检测(chunk detection)的准确率,召回率和F1值,支持IOB, IOE, IOBES和IO标注方案。

**代码示例**:

.. code-block:: python

        labels = fluid.layers.data(name="data", shape=[1], dtype="int32")
        data = fluid.layers.data(name="data", shape=[32, 32], dtype="int32")
        pred = fluid.layers.fc(input=data, size=1000, act="tanh")
        precision, recall, f1_score, num_infer_chunks, num_label_chunks, num_correct_chunks = layers.chunk_eval(
        input=pred,
        label=label)
        metric = fluid.metrics.ChunkEvaluator()
        for data in train_reader():
            loss, preds, labels = exe.run(fetch_list=[cost, preds, labels])
            metric.update(num_infer_chunks, num_label_chunks, num_correct_chunks)
            numpy_precision, numpy_recall, numpy_f1 = metric.eval()
    
.. py:method:: update(num_infer_chunks, num_label_chunks, num_correct_chunks)

基于layers.chunk_eval()输出更新状态(state)输出

参数:
    - **num_infer_chunks** (int|numpy.array): 给定minibatch的Interface块数。
    - **num_label_chunks** (int|numpy.array): 给定minibatch的Label块数。
    - **num_correct_chunks** (int|numpy.array): 给定minibatch的Interface和Label的块数



T
Tink_Y 已提交
128 129 130



C
Cheerego 已提交
131 132 133 134

.. _cn_api_fluid_metrics_CompositeMetric:

CompositeMetric
T
Tink_Y 已提交
135
-------------------------------
C
Cheerego 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

.. py:class:: paddle.fluid.metrics.CompositeMetric(name=None)

在一个实例中组合多个指标。例如,将F1、准确率、召回率合并为一个指标。

**代码示例**

.. code-block:: python

        labels = fluid.layers.data(name="data", shape=[1], dtype="int32")
        data = fluid.layers.data(name="data", shape=[32, 32], dtype="int32")
        pred = fluid.layers.fc(input=data, size=1000, act="tanh")
        comp = fluid.metrics.CompositeMetric()
        acc = fluid.metrics.Precision()
        recall = fluid.metrics.Recall()
        comp.add_metric(acc)
        comp.add_metric(recall)
        for pass in range(PASSES):
        comp.reset()
        for data in train_reader():
            loss, preds, labels = exe.run(fetch_list=[cost, preds, labels])
        comp.update(preds=preds, labels=labels)
        numpy_acc, numpy_recall = comp.eval()


.. py:method:: add_metric(metric)

向CompositeMetric添加一个度量指标

参数:
    - **metric** –  MetricBase的一个实例。



.. py:method:: update(preds, labels)

更新序列中的每个指标。

参数:
    - **preds**  (numpy.array) - 当前mini batch的预测
    - **labels**  (numpy.array) - 当前minibatch的label,如果标签是one-hot或soft-laebl 编码,应该自定义相应的更新规则。

.. py:method:: eval()

按顺序评估每个指标。


返回:Python中的度量值列表。

返回类型:list(float | numpy.array)




T
Tink_Y 已提交
190 191 192



C
Cheerego 已提交
193 194 195 196

.. _cn_api_fluid_metrics_DetectionMAP:

DetectionMAP
T
Tink_Y 已提交
197
-------------------------------
C
Cheerego 已提交
198

C
Cheerego 已提交
199
.. py:class:: paddle.fluid.metrics.DetectionMAP(input, gt_label, gt_box, gt_difficult=None, class_num=None, background_label=0, overlap_threshold=0.5, evaluate_difficult=True, ap_version='integral')
C
Cheerego 已提交
200 201 202 203 204 205 206 207 208 209 210

计算 detection 平均精度(mAP)。 mAP是衡量object detectors精度的指标,比如 Faster R-CNN,SSD等。它不同于召回率,它是最大精度的平均值。 请从以下文章中获取更多信息:

https://sanchom.wordpress.com/tag/average-precision/

https://arxiv.org/abs/1512.02325

通常步骤如下:

1. 根据detectors中的输入和label,计算  true positive 和 false positive
2. 计算map,支持 ‘11 point’ and ‘integral’
C
Cheerego 已提交
211 212 213 214 215 216 217 218 219 220 221

参数:
	- **input** (Variable) – detection的结果,一个 shape=[M, 6] 的 lodtensor。布局为[label, confidence, xmin, ymin, xmax, ymax]
	- **gt_label** (Variable) – ground truth label 的索引,它是一个形状为[N, 1]的lodtensor
	- **gt_box** (Variable) – ground truth bounds box (bbox),是一个具有形状的lod张量[N, 4]。布局是[xmin, ymin, xmax, ymax]
	- **gt_difficult** (Variable|None) – 指定这个ground truth是否是一个difficult bounding bbox,它可以是一个 shape=[N, 1]的LoDTensor,也可以不被指定。如果设置为None,则表示所有的ground truth标签都不是difficult bbox。
	- **class_num** (int) – 检测类别的数目
	- **background_label** (int) – 背景标签的索引,背景标签将被忽略。如果设置为-1,则所有类别将被考虑,默认为0。
	- **overlap_threshold** (float) – 判断真假阳性的阈值,默认为0.5
	- **evaluate_difficult** (bool) – 是否考虑 difficult ground truth 进行评价,默认为 True。当 gt_difficult 为 None 时,这个参数不起作用。
	- **ap_version** (string) – 平均精度的计算方法,必须是 "integral" 或 "11point"。详情请查看 https://sanchom.wordpress.com/tag/averageprecision/。 其中,11point为:11-point 插值平均精度。积分: precision-recall曲线的自然积分。
C
Cheerego 已提交
222 223 224 225 226

**代码示例**

.. code-block:: python

C
Cheerego 已提交
227 228 229 230 231 232 233 234 235 236
	exe = fluid.Executor(place)
	map_evaluator = fluid.Evaluator.DetectionMAP(input,
	    gt_label, gt_box, gt_difficult)
	cur_map, accum_map = map_evaluator.get_map_var()
	fetch = [cost, cur_map, accum_map]
	for epoch in PASS_NUM:
	    map_evaluator.reset(exe)
	    for data in batches:
	        loss, cur_map_v, accum_map_v = exe.run(fetch_list=fetch)

C
Cheerego 已提交
237 238


C
Cheerego 已提交
239 240 241 242 243
在上述例子中:
	
	"cur_map_v" 是当前 mini-batch 的 mAP
	
	"accum_map_v" 是一个 pass 的 mAP累加和
C
Cheerego 已提交
244

C
Cheerego 已提交
245
.. py:method:: get_map_var()
C
Cheerego 已提交
246

C
Cheerego 已提交
247
返回:当前 mini-batch 的 mAP 变量,和跨 mini-batch 的 mAP 累加和
C
Cheerego 已提交
248

C
Cheerego 已提交
249
.. py:methord::  reset(executor, reset_program=None)
T
Tink_Y 已提交
250

C
Cheerego 已提交
251 252 253 254 255
在指定 batch 的每一 pass/user  开始时重置度量状态。

参数:
	- **executor** (Executor) – 执行reset_program的执行程序
	- **reset_program** (Program|None) –  单一 program 的 reset 过程。如果设置为 None,将创建一个 program
T
Tink_Y 已提交
256 257


C
Cheerego 已提交
258 259 260 261

.. _cn_api_fluid_metrics_EditDistance:

EditDistance
T
Tink_Y 已提交
262
-------------------------------
C
Cheerego 已提交
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288

.. py:class:: paddle.fluid.metrics.EditDistance(name)

编辑距离是通过计算将一个字符串转换为另一个字符串所需的最小操作数来量化两个字符串(例如单词)之间的差异的一种方法。参考 https://en.wikipedia.org/wiki/Edit_distance
从mini batch中累计编辑距离和序列号,计算所有batch的平均编辑距离和实例错误。

参数:
    - **name** - 度量标准名称

**代码示例**

.. code-block:: python

    distances, seq_num = fluid.layers.edit_distance(input, label)
    distance_evaluator = fluid.metrics.EditDistance()
    for epoch in PASS_NUM:
        distance_evaluator.reset()
        for data in batches:
            loss = exe.run(fetch_list=[cost] + list(edit_distance_metrics))
        distance_evaluator.update(distances, seq_num)
        distance, instance_error = distance_evaluator.eval()

在上面的例子中:'distance'是一个pass中的编辑距离的平均值。 'instance_error'是一个pass中的实例的错误率。



T
Tink_Y 已提交
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340




.. _cn_api_fluid_metrics_MetricBase:

MetricBase
-------------------------------

.. py:class:: paddle.fluid.metrics.MetricBase(name)

所有Metrics的基类。MetricBase为模型估计方法定义一组接口。Metrics累积连续的两个minibatch之间的度量状态,对每个minibatch用最新接口将当前minibatch值添加到全局状态。用eval函数来计算last reset()或者scratch on()中累积的度量值。如果需要定制一个新的metric,请继承自MetricBase和自定义实现类。

参数:
    - **name** (str) - metric实例名。例如准确率(accuracy)。如果想区分一个模型里不同的metrics,则需要实例名。

.. py:method:: reset()

        reset()清除度量(metric)的状态(state)。默认情况下,状态(state)包含没有 ``_`` 前缀的metric。reset将这些状态设置为初始状态。如果不想使用隐式命名规则,请自定义reset接口。

.. py:method:: get_config()

获取度量(metric)状态和当前状态。状态(state)包含没有 ``_`` 前缀的成员。
        
参数:**None**

返回:metric对应到state的字典

返回类型:字典(dict)


.. py:method:: update(preds,labels)

更新每个minibatch的度量状态(metric states),用户可通过Python或者C++操作符计算minibatch度量值(metric)。

参数:
     - **preds** (numpy.array) - 当前minibatch的预测
     - **labels** (numpy.array) - 当前minibatch的标签,如果标签为one-hot或者soft-label,应该自定义相应的更新规则。

.. py:method:: eval()

基于累积状态(accumulated states)评估当前度量(current metric)。

返回:metrics(Python中)

返回类型:float|list(float)|numpy.array






C
Cheerego 已提交
341 342 343 344

.. _cn_api_fluid_metrics_Precision:

Precision
T
Tink_Y 已提交
345
-------------------------------
C
Cheerego 已提交
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371

.. py:class:: paddle.fluid.metrics.Precision(name=None)

Precision(也称为 positive predictive value,正预测值)是被预测为正样例中实际为正的比例。https://en.wikipedia.org/wiki/Evaluation_of_binary_classifiers
注:二分类中,Precision与Accuracy不同,

.. math::
    Accuracy  & = \frac{true \quad positive}{total \quad instances(所有样例)}  \\\\
    Precision & = \frac{true \quad positive}{all \quad positive \quad instances(所有正样例)}


**代码示例**

.. code-block:: python

    metric = fluid.metrics.Precision() 
    
    for pass in range(PASSES):
        metric.reset() 
        for data in train_reader():
        loss, preds, labels = exe.run(fetch_list=[cost, preds, labels])
         metric.update(preds=preds, labels=labels) 
        numpy_precision = metric.eval()



T
Tink_Y 已提交
372 373 374



C
Cheerego 已提交
375 376 377 378

.. _cn_api_fluid_metrics_Recall:

Recall
T
Tink_Y 已提交
379
-------------------------------
C
Cheerego 已提交
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402

.. py:class:: paddle.fluid.metrics.Recall(name=None)

召回率(也称为敏感度)是度量有多个正例被分为正例

https://en.wikipedia.org/wiki/Precision_and_recall

**代码示例**

.. code-block:: python

        metric = fluid.metrics.Recall() 
        
        for pass in range(PASSES):
            metric.reset() 
            for data in train_reader():
                loss, preds, labels = exe.run(fetch_list=[cost, preds, labels])
                metric.update(preds=preds, labels=labels) 
                numpy_recall = metric.eval()




T
Tink_Y 已提交
403 404 405



C
Cheerego 已提交
406