计算在开发/测试集上的准确率和成本

我有一个关于开发神经网络的相当普遍的问题。这仍然与如何编程一个模型有关。

在训练模型时,定期计算成本(甚至可能是准确率)以便能够检查进展趋势是一种常见的做法。成本可能不是在每个周期后计算,而是每隔 – 比如说 – 100个周期计算一次,并保存到某个地方,以便在最后绘制其图表。特别是如果数据集非常大,(基于我迄今所见)这种成本通常只在小批量数据上计算,而不是在整个训练数据集上计算,模型的成本通过取所有这些训练集小批量成本的平均值来计算。

在训练模型时,我希望定期计算开发和测试集上的成本(甚至可能是准确率),以便稍后能够比较趋势(特别是训练集和开发集之间的趋势),以更好地了解模型的运行情况。但我从csv文件中读取训练数据的while循环如下:

......try:        while not coord.should_stop():          _ , minibatch_cost = sess.run([optimizer, cost])          nr_of_minibatches += 1          cost_of_model += minibatch_cost          cost_of_model /= nr_of_minibatches          # 定期打印和保存进展(成本、准确率等)          if print_progress == True and nr_of_minibatches % 5 == 0:              print ("Cost after minibatch %i: %f" % (nr_of_minibatches, cost_of_model))              costs.append(cost_of_model)              accuracy_train = accuracy.eval() #(feed_dict={ZL: ZL, Y_mini_batch: Y_mini_batch})              train_accuracies.append(accuracy_train)              print("accuracy_train = " + str(accuracy_train))              test_accuracy = accuracy.eval(feed_dict={X_Y_mini_batch: Y_test})      except tf.errors.OutOfRangeError:        print('Done training, epoch reached')      finally:        coord.request_stop()        coord.join(threads)......

这个while循环将持续循环,直到训练集csv文件的周期数完成。如上所见,每5个小批量后,我会计算成本。我希望为开发和测试数据集也添加成本/准确率计算。

问题1)从实际角度来看,我认为开发和测试集数据应该存放在单独的csv文件中。你同意我的看法吗?如果不同意,(如果你认为所有训练/开发/测试集可以放在同一个文件中),那么我应该如何在tensorflow中实现它?我猜Scikit-learn有这方面的技巧,但我认为在tensorflow实现中,训练/开发/测试数据应该是分开的。

问题2)如果训练/开发/测试数据应该存放在单独的csv文件中,实现应该是什么样的?上面给出的while循环是通过训练csv文件进行循环的。我对如何优雅地实现这一点有些困惑,以便在每隔 – 比如说 – 5个训练周期后重新计算开发/测试集的成本/准确率,这些数据在单独的csv文件中。


回答:

你的try/except/finally块的缩进有问题。exceptfinally语句应该与try保持相同的缩进级别。

关于数据分割,你可以选择任何一种方式,这取决于你的具体使用情况。你可以将所有数据保存在一个大的CSV文件中,并让程序将数据分割成训练/开发/测试的不同块,或者你可以保持3个单独的CSV文件。唯一需要注意的是,如果你选择将所有数据保存在一个CSV文件中,你分割数据成训练/开发/测试集的方法应该可重现,否则如果你多次训练模型,你可能会意外地在开发/测试集上进行训练。

你如何分割数据并不是你使用的深度学习包所独有的。你当然可以使用Scikit-learn的数据分割方法,然后用Tensorflow进行训练。没有必要为Tensorflow特定的数据分割重新发明轮子。

我建议不要在训练过程中检查测试集上的成本/准确率。这违背了测试集的目的。你可以使用开发集来微调模型中的超参数,但你应该只在最后使用测试集来查看你的成本/准确率在“现实世界”中可能是什么样子。你永远不希望过度拟合到测试集上,这就是将数据分割成3个集合的全部意义所在。

如果你选择将文件分开,这意味着你将在你的循环中有一个循环,遍历单独的文件并计算单独的开发集文件上的成本/准确率。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注