我正在通过TensorFlow get started tutorial。在tf.contrib.learn
示例中,这些是两行代码:
input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4, num_epochs=1000)
estimator.fit(input_fn=input_fn, steps=1000)
我想知道steps
函数调用中的fit
参数与num_epochs
调用中的numpy_input_fn
之间有什么区别。难道不应该有一个论点吗?他们是如何联系的?
我发现代码以某种方式将这两者中的min
作为本教程玩具示例中的步骤数。
感谢所有答案。恕我直言,至少,num_epochs
或steps
这两个参数中的一个必须是多余的。我们可以从另一个计算一个。有没有办法可以知道我的算法实际采取了多少步骤(参数更新的次数)?
我很好奇哪一个优先。它是否依赖于其他一些参数?
答案 0 :(得分:36)
contrib.learn.io模块没有很好地记录,但似乎numpy_input_fn()
函数需要一些numpy数组并将它们一起批处理作为分类器的输入。因此,时期的数量可能意味着“在停止之前通过输入数据的次数”。在这种情况下,它们以4个元素批次提供两个长度为4的数组,因此它只是意味着输入函数在引发“数据外”异常之前最多会执行1000次。估算器fit()
函数中的steps参数是估计器应该执行训练循环的次数。这个特殊的例子有点不正常,所以让我组成另一个让事情变得更清晰(希望如此)。
假设您有两个要训练的numpy数组(样本和标签)。它们各有100个元素。您希望您的培训批量生产每批10个样品。因此,在10批次之后,您将查看所有培训数据。那是一个时代。如果您将输入生成器设置为10个时期,它将在停止之前通过您的训练集10次,即最多生成100个批次。
同样,io模块没有记录,但考虑到张量流中其他与输入相关的API如何工作,应该可以使它生成无限数量的时期数据,因此控制训练时间的唯一因素是是步骤。这为您提供培训进展的灵活性。您可以一次或多次执行多个时期或两者或其他任何步骤。
编辑:TL; DR Epoch是您的模型一次完成整个训练数据的时间。步骤是您的模型在单个批次上进行训练(如果您逐个发送样本,则为单个样本)。 1000个样本的5个时期的培训每批10个样本将需要500个步骤。
答案 1 :(得分:19)
时代:一次通过整个数据。
批量大小:一批中看不到的例子。
如果有1000个示例且批量大小为100,那么每个时期将有10个步骤。
纪元和批量大小完全定义了步数。
steps_cal =(没有ex / batch_size)* no_of_epochs
estimator.fit(input_fn=input_fn)
如果你只是编写上面的代码,那么'steps'的值是由上面公式中的'steps_cal'给出的。
estimator.fit(input_fn=input_fn, steps = steps_less)
如果你给一个小于'steps_cal'的值(比如'steps_less'),那么只会执行'steps_less'no步骤。在这种情况下,训练不会覆盖所提到的整个时期。
estimator.fit(input_fn=input_fn, steps = steps_more)
如果你给一个值(比如steps_more)大于steps_cal,那么'steps_cal'也会执行步骤。
答案 2 :(得分:16)
让我们从顺序开始:
1) 步骤 - 学习算法中的训练循环将运行以更新模型中的参数的次数。在每次循环迭代中,它将处理一大块数据,这基本上是一个批处理。通常,此循环基于 Gradient Descent 算法。
2) 批量大小 - 您在学习算法的每个循环中提供的数据块的大小。您可以提供整个数据集,在这种情况下,批量大小等于数据集大小。您也可以一次提供一个示例。或者您可以提供一些 N 的示例。
3) 纪元 - 您在提取批次以提供学习算法的数据集上运行的次数。
假设你有1000个例子。设置批量大小= 100,epoch = 1和步骤= 200给出了在整个数据集上一次通过(一个时期)的过程。在每次传递中,它将为算法提供100个示例。该算法将在每批中运行200步。总共可以看到10批次。如果你将纪元改为25,那么它将完成25次,你可以完全看到25x10批次。
为什么我们需要这个?梯度下降(批量,随机,小批量)以及用于优化学习参数的其他算法(例如,L-BFGS)有许多变化。其中一些需要批量查看数据,而其他人一次只能查看一个数据。此外,其中一些包括随机因素/步骤,因此您可能需要多次传递数据才能获得良好的收敛。
答案 3 :(得分:13)
这个答案是基于我在入门教程代码上所做的实验。
Mad Wombat详细解释了术语 num_epochs , batch_size 和步骤。这个答案是他答案的延伸。
num_epochs - 程序在一个train()
中迭代整个数据集的最大次数。使用此参数,我们可以限制在执行一个train()
方法期间可以处理的批次数。
batch_size - input_fn
发出的单个批次中的示例数量 步骤 - LinearRegressor.train()
方法可以在一次执行中处理的批次数
max_steps 是LinearRegressor.train()
方法的另一个参数。此参数定义了LinearRegressor()
对象生存期中可以处理的最大步骤数(批次)。
我们这意味着什么。以下实验更改了本教程提供的两行代码。其余的代码保持原样。
注意:对于所有示例,假设训练次数,即 x_train 的长度等于4。
例1:
input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_train}, y_train, batch_size=4, num_epochs=2, shuffle=True)
estimator.train(input_fn=input_fn, steps=10)
在这个例子中,我们定义了 batch_size = 4和 num_epochs = 2.因此,input_fn
只能发出2批输入数据执行train()
。即使我们定义了步骤 = 10,但train()
方法在两步后停止。
现在,再次执行estimator.train(input_fn=input_fn, steps=10)
。我们可以看到已经执行了2个步骤。我们可以一次又一次地执行train()
方法。如果我们执行train()
50次,则总共执行了100个步骤。
例2:
input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_train}, y_train, batch_size=2, num_epochs=2, shuffle=True)
estimator.train(input_fn=input_fn, steps=10)
在此示例中, batch_size 的值更改为2(在Ex 1中等于4)。现在,在train()
方法的每次执行中,处理4个步骤。在第4步之后,没有批次可以运行。如果再次执行train()
方法,则会处理另外4个步骤,共计8个步骤。
此处,步骤的值无关紧要,因为train()
方法最多可以获得4个批次。如果步骤的值小于( num_epochs x training_size )/ batch_size ,请参阅例3。
例3:
input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_train}, y_train, batch_size=2, num_epochs=8, shuffle=True)
estimator.train(input_fn=input_fn, steps=10)
现在,让 batch_size = 2, num_epochs = 8,步骤 = 10. input_fn
可以总共发出一次运行train()
方法的16批次。但是,步骤设置为10.这意味着尽管input_fn
可以提供16个批次来执行,但train()
必须在10个步骤后停止。当然,train()
方法可以累积执行更多步骤。
从例子1,2和& 3,我们可以清楚地看到步骤, num_epoch 和 batch_size 的值如何影响{{1}可以执行的步骤数一次运行中的方法。
train()
方法的 max_steps 参数限制了train()
例4:
如果 batch_size = 4, num_epochs = 2,则train()
可以为一次input_fn
执行2批次。但是,如果将train()
设置为20,则无论执行max_steps
多少次,优化中只会运行20个步骤。这与示例1形成对比,如果train()
方法被退出100次,优化器可以运行200步。
希望这能详细了解这些论点的含义。
答案 4 :(得分:3)
num_epochs:最大纪元数(查看每个数据点)。
步骤:更新次数(参数)。
您可以在一个纪元中多次更新 当批量大小小于训练数据时。