keras model.evaluate()和model.predict()之间的区别

时间:2017-06-10 18:28:24

标签: machine-learning neural-network deep-learning keras image-segmentation

我使用keras生物医学图像分割来分割脑神经元。我使用model.evaluate()它给了我Dice coef:0.916,然而,当我使用model.predict然后通过计算Dice coef来循环预测图像时,Dice coef是0.82。 有什么想法吗?

由于

4 个答案:

答案 0 :(得分:7)

关于正则化。 <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.datatables.net/v/dt/dt-1.10.16/r-2.2.1/datatables.min.css"> <script src="https://cdn.datatables.net/v/dt/dt-1.10.16/r-2.2.1/datatables.min.js"></script> <script> $(document).ready(function() { var table = $('#example').DataTable({ 'responsive': true }); // Handle click on "Expand All" button $('#btn-show-all-children').on('click', function() { // Expand row details table.rows(':not(.parent)').nodes().to$().find('td:first-child').trigger('click'); }); // Handle click on "Collapse All" button $('#btn-hide-all-children').on('click', function() { // Collapse row details table.rows('.parent').nodes().to$().find('td:first-child').trigger('click'); }); }); </script> </head> <table id="example" class="display" cellspacing="0" width="100%"> <thead> <tr> <th>Name</th> <th>Position</th> <th>Office</th> <th class="none">Age</th> <th class="none">Start date</th> <th class="none">Salary</th> </tr> </thead> <tfoot> <tr> <th>Name</th> <th>Position</th> <th>Office</th> <th>Age</th> <th>Start date</th> <th>Salary</th> </tr> </tfoot> <tbody> <tr> <td>Tiger Nixon</td> <td>System Architect</td> <td>Edinburgh</td> <td>61</td> <td>2011/04/25</td> <td>$320,800</td> </tr> <tr> <td>Garrett Winters</td> <td>Accountant</td> <td>Tokyo</td> <td>63</td> <td>2011/07/25</td> <td>$170,750</td> </tr> <tr> <td>Ashton Cox</td> <td>Junior Technical Author</td> <td>San Francisco</td> <td>66</td> <td>2009/01/12</td> <td>$86,000</td> </tr> </tbody> </table> </html> 返回模型的最终输出,即答案。 model.predict()返回损失。损失用于训练模型(通过反向传播),但这并不是答案。

video of ML Tokyo应该有助于理解model.evaluate()model.evaluate()之间的区别。

答案 1 :(得分:4)

问题在于Keras中的每个指标都以下列方式评估:

  1. 对每个batch评估指标值。
  2. 当前损失值(k批次之后等于计算k批次中指标的平均值)。
  3. 最终结果是所有批次计算的所有损失的平均值。
  4. 大多数最受欢迎的指标(例如msecategorical_crossentropymae)等 - 作为每个示例的损失值的平均值 - 都具有此类评估结束的属性结果合适。但是在Dice Coefficient的情况下 - 它在所有批次中的值的平均值不等于在整个数据集上计算的实际值,并且model.evaluate()使用这种计算方式 - 这是您的问题的直接原因。

答案 2 :(得分:0)

keras.evaluate()函数将为您提供每批的损失值。对于所有批次,keras.predict()函数将为批量中的所有样本提供实际预测。因此,即使您使用相同的数据,也会存在差异,因为损失函数的值几乎总是与预测值不同。这是两件不同的事情。

答案 3 :(得分:0)

model.evaluate函数预测给定输入的输出,然后基于model.compiley_true计算在y_pred中指定的指标函数,并返回计算的指标值作为输出。

model.predict仅返回y_pred

因此,如果您使用model.predict然后自己计算指标,则计算出的指标值应与model.evaluate相同

例如,在评估基于RNN / LSTM的模型时,应该使用model.predict而不是model.evaluate,在该模型中,下一步需要将输出作为输入馈入