我对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()的不同调用?
谢谢。
答案 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))
您需要为每个相应的标签提供正确的预测,因此您的订购很重要。