我想管理我的培训tf.estimator.Estimator但是在tf.dataAPI 旁边使用它有些麻烦.
我有这样的事情:
def model_fn(features, labels, params, mode):
# Defines model's ops.
# Initializes with tf.train.Scaffold.
# Returns an tf.estimator.EstimatorSpec.
def input_fn():
dataset = tf.data.TextLineDataset("test.txt")
# map, shuffle, padded_batch, etc.
iterator = dataset.make_initializable_iterator()
return iterator.get_next()
estimator = tf.estimator.Estimator(model_fn)
estimator.train(input_fn)
Run Code Online (Sandbox Code Playgroud)
因为我不能使用一个make_one_shot_iterator用于我的用例,我的问题是input_fn包含一个应该在其中初始化的迭代器model_fn(这里,我tf.train.Scaffold用来初始化本地操作).
此外,我明白我们不能只使用input_fn = iterator.get_next其他ops将不会添加到同一图表.
初始化迭代器的推荐方法是什么?
该tf.estimator.train_and_evaluate文件明确指出,输入数据集必须正确洗牌的训练,看看所有的例子:
过拟合:为了避免过拟合,建议设置训练 input_fn 对训练数据进行适当的 shuffle。还建议在执行评估之前对模型进行更长时间的训练,比如多个时期,因为每次训练的输入管道都从头开始。这对于本地培训和评估尤为重要。
在我的应用程序中,我想从tf.data.Dataset具有任意评估频率和shuffle()缓冲区大小的完整样本中统一采样示例。否则,训练最多只能看到第一个:
(steps_per_second * eval_delay * batch_size) + buffer_size
Run Code Online (Sandbox Code Playgroud)
元素,有效地丢弃其余元素。有没有一种有效的方法来解决这个问题,而无需在系统内存中加载完整的数据集?
我考虑过根据缓冲区大小对数据集进行分片,但如果评估不经常发生,它将在同一个分片上迭代多次(一个repeat()关闭管道)。理想情况下,我想在对数据集进行完整迭代后移动到另一个分片,这可能吗?
感谢您的任何指点!