关于遍历数据集的Tensorflow崩溃课程问题

时间:2019-01-02 00:23:30

标签: tensorflow

我对my_input_fn()感到非常困惑 https://colab.research.google.com/notebooks/mlcc/first_steps_with_tensor_flow.ipynb

如果shuffle = False,estimator.train()不会在循环内使用相同的数据子集吗?即循环迭代1和0使用相同的数据子集。

这里的目标是: *循环调用estimator.train() *评估循环中的验证错误 *对于不同的循环迭代,train()和评估应该在数据的不同子集上进行。

从运行时调试消息中看,每次调用train()时都会调用input_func,例如,如果循环计数为10,则input_func()将被调用10次。由于input_func每次都会设置数据集(重新初始化tf.data.Dataset),因此对数据集的相同子集进行评估,每次10次。 train()在整个集合上完成,因为shuffle = True。如果shuffle为False,则还将对数据集的相同子集进行10次训练。

我了解在每个train()中,它将遍历tf.data.Dataset。但是,如果再次调用train(),它将像上一次一样遍历tf.data.Dataset的相同子集(假设shuffle为False)。

我看了看文档。看起来要用不同的数据来馈送estimator.train()的不同调用,必须为每个estimator.train()创建一个新的数据集。例如,使用数据行1-10000为estimator.train()的第一次调用创建tf.data.Dataset,然后使用数据行10001-20000为estimator.train()的第二次调用创建tf.data.Dataset。 / p>

是否有更好的方法将tf.data.Dataset馈入循环中estimator.train()的不同调用?

谢谢。

2 个答案:

答案 0 :(得分:1)

不,不会。 tf.data.Dataset.batch()将在整个集合中创建维度为batch_size的批次,并在每次调用get_next() op时将其返回。

  

将此数据集的连续元素组合为批次。

     

结果元素中的张量将具有额外的外部   尺寸,即为batch_size(或最后一个为N%batch_size   如果batch_size不除以输入元素的数量,则为元素N   均匀且drop_remainder为False)。如果您的程序取决于   具有相同外部尺寸的批次,应将   将drop_remainder参数设置为True可以防止较小的批处理   正在生产。

.shuffle()将仅更改数据点的顺序。如果启用,则每次您都会分批获得不同的数据点。

答案 1 :(得分:0)

如果您查看train_model函数,您会看到以下两行:

training_input_fn = lambda:my_input_fn(my_feature_data, targets, batch_size=batch_size)
prediction_input_fn = lambda: my_input_fn(my_feature_data, targets, num_epochs=1, shuffle=False) 

如果设置shuffle = False,则每次调用函数时,数据的顺序都相同。通过这种方式计算损失时,正是预测所需要的:

# Compute loss.
root_mean_squared_error = math.sqrt(
    metrics.mean_squared_error(predictions, targets))

您需要为每个相应的标签提供正确的预测,因此您的订购很重要。