我的想法是使用字符串占位符,即假设您有多个输入文件:
filenames_place = tf.placeholder(tf.string, shape=[None]) num_epochs_place = tf.placeholder(tf.int32) example_batch, label_batch = input_pipeline(filenames_place, batch_size, num_epochs_place) ... try: sess.run(train_op, feed_dict={filenames_place: ["train_data1", "train_data2"], num_epochs_place=5}) except tf.errors.OutOfRangeError: print('Done training -- epoch limit reached') sess.run(eval_op, feed_dict={filenames_place: ["test_data"], num_epochs_place=1})
您肯定在正确的轨道上,为数据集评估创建额外的输入管道。运用 多输入管道 是推荐的方法之一,它包括两个过程,一个是培训,另一个是eval。检查点将在培训过程中使用,然后每千步,代码可以尝试 eval 针对训练和测试数据集的模型。
eval
<子> 引自文件: 子>
训练过程读取训练输入数据并定期写入包含所有训练变量的检查点文件。 评估过程将检查点文件恢复为读取验证输入数据的推理模型。
即使在培训完成/退出后,也可以评估。 ( 看这个例子 )
另一个考虑因素是 共享变量 train和eval可以在同一个过程中在同一个图表中运行,同时分享他们训练过的变量!
关于队列耗尽问题,如果你将num_threads设置为大于1 tf.train.shuffle_batch* 它同时从单个文件读取(+比1个线程快),而不是一次读取N个文件(参见上一节) 配料 )。
tf.train.shuffle_batch*