我有一个关于开发神经网络的相当普遍的问题。这仍然与如何编程一个模型有关。
在训练模型时,定期计算成本(甚至可能是准确率)以便能够检查进展趋势是一种常见的做法。成本可能不是在每个周期后计算,而是每隔 – 比如说 – 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
块的缩进有问题。except
和finally
语句应该与try
保持相同的缩进级别。
关于数据分割,你可以选择任何一种方式,这取决于你的具体使用情况。你可以将所有数据保存在一个大的CSV文件中,并让程序将数据分割成训练/开发/测试的不同块,或者你可以保持3个单独的CSV文件。唯一需要注意的是,如果你选择将所有数据保存在一个CSV文件中,你分割数据成训练/开发/测试集的方法应该可重现,否则如果你多次训练模型,你可能会意外地在开发/测试集上进行训练。
你如何分割数据并不是你使用的深度学习包所独有的。你当然可以使用Scikit-learn的数据分割方法,然后用Tensorflow进行训练。没有必要为Tensorflow特定的数据分割重新发明轮子。
我建议不要在训练过程中检查测试集上的成本/准确率。这违背了测试集的目的。你可以使用开发集来微调模型中的超参数,但你应该只在最后使用测试集来查看你的成本/准确率在“现实世界”中可能是什么样子。你永远不希望过度拟合到测试集上,这就是将数据分割成3个集合的全部意义所在。
如果你选择将文件分开,这意味着你将在你的循环中有一个循环,遍历单独的文件并计算单独的开发集文件上的成本/准确率。