tensorflow入门教程中的步骤vs num_epochs

use*_*366 41 tensorflow

我正在通过TensorFlow 入门教程.在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)
Run Code Online (Sandbox Code Playgroud)

我想知道是什么样的参数之间的差异steps在调用fit函数并num_epochsnumpy_input_fn通话.难道不应该有一个论点吗?他们是如何联系的?

我发现代码以某种方式min将这两者作为本教程玩具示例中的步骤数.


编辑

感谢所有的答案.IMHO,这两个参数中的至少一任一num_epochssteps具有是多余的.我们可以从另一个计算一个.有没有办法可以知道我的算法实际采取了多少步骤(参数更新的次数)?

我很好奇哪一个优先.它是否依赖于其他一些参数?

Mad*_*bat 39

contrib.learn.io模块没有很好地记录,但似乎contrib.learn.io函数需要一些numpy数组并将它们一起批处理作为分类器的输入.因此,时期的数量可能意味着"在停止之前通过输入数据的次数".在这种情况下,它们以4个元素批次提供两个长度为4的数组,因此它只是意味着输入函数在引发"数据外"异常之前最多会执行1000次.估计器numpy_input_fn()函数中的步骤参数是估计器应该执行训练循环的次数.这个特殊的例子有些不正常,所以让我组成另一个让事情更清晰(希望如此).

假设您有两个要训练的numpy数组(样本和标签).它们各有100个元素.您希望您的培训批量生产每批10个样品.因此,在10批次之后,您将查看所有培训数据.那是一个时代.如果您将输入生成器设置为10个时期,它将在停止之前通过您的训练集10次,即它将最多生成100个批次.

同样,io模块没有记录,但考虑到张量流中其他与输入相关的API是如何工作的,应该可以使它生成无限数量的时期数据,因此控制训练时长的唯一因素就是步骤.这为您提供培训进展的灵活性.您可以一次或多次执行多个时期,或两者兼而有之.

编辑:TL; DR Epoch是您的模型一次完成整个训练数据的时间.步骤是您的模型在单个批次上进行训练(如果您逐个发送样本,则为单个样本).对1000个样品进行5个时期的培训每批10个样品将需要500个步骤.


Him*_*ghi 22

时代:一次通过整个数据.

批量大小:一批中看不到的例子.

如果有1000个示例且批量大小为100,那么每个时期将有10个步骤.

时期和批量大小完全定义步骤数.

steps_cal =(没有ex/batch_size)*no_of_epochs

estimator.fit(input_fn=input_fn)
Run Code Online (Sandbox Code Playgroud)

如果你只是编写上面的代码,那么'steps'的值就是上面公式中'steps_cal'给出的值.

estimator.fit(input_fn=input_fn, steps  = steps_less)
Run Code Online (Sandbox Code Playgroud)

如果你给一个小于'steps_cal'的值(比如'steps_less'),那么只会执行'steps_less'no步骤.在这种情况下,训练不会涵盖所提到的整个时期.

estimator.fit(input_fn=input_fn, steps  = steps_more)
Run Code Online (Sandbox Code Playgroud)

如果你给一个值(比如steps_more)大于steps_cal,那么'steps_cal'也会执行步骤.


小智 16

让我们从订单开始:

1)步骤 - 学习算法中的训练循环将运行以更新模型中的参数的次数.在每次循环迭代中,它将处理一大块数据,这基本上是一个批处理.通常,此循环基于梯度下降算法.

2)批量大小 - 您在学习算法的每个循环中提供的数据块的大小.您可以提供整个数据集,在这种情况下批处理大小等于数据集大小.您也可以一次提供一个示例.或者您可以提供一些N个示例.

3)Epoch - 您在提取批次以提供学习算法的数据集上运行的次数.

假设你有1000个例子.设置批量大小= 100,epoch = 1和步骤= 200给出了在整个数据集上一次通过(一个时期)的过程.在每次传递中,它将为算法提供100个示例.该算法将在每批中运行200步.总共可以看到10批次.如果你将纪元改为25,那么它将完成25次,你可以完全看到25x10批次.

我们为什么需要这个?梯度下降(批量,随机,小批量)以及用于优化学习参数的其他算法(例如,L-BFGS)存在许多变化.其中一些需要批量查看数据,而其他人一次只能查看一个数据.此外,其中一些包括随机因素/步骤,因此您可能需要多次传递数据才能获得良好的收敛.

  • 在一个时期内,每个批次的模型都会更新。因此,batch_size 已经确定了步骤。我仍然不清楚为什么有一个单独的变量“步骤”。 (2认同)

pbs*_*mar 13

这个答案基于我在入门教程代码上所做的实验.

Mad Wombat详细解释了术语num_epochs,batch_size步骤.这个答案是他答案的延伸.

num_epochs - 程序可以在一个中迭代整个数据集的最大次数train().使用此参数,我们可以限制在执行一个train()方法期间可以处理的批次数.

batch_size - input_fn发出的单个批处理中的示例数

steps - LinearRegressor.train()方法在一次执行中可以处理的批次数

max_stepsLinearRegressor.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()方法在2个步骤后停止.

现在,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,请参见ex 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和steps = 10. input_fn在一次train()方法运行中,总共可以发出16个批次.但是,步骤设置为10.这意味着尽管input_fn可以提供16个批次执行,但train()必须在10个步骤后停止.当然,train()可以累积更多步骤重新执行方法.


从示例1,2和3中,我们可以清楚地看到steps,num_epochbatch_size的值如何影响train()一次运行中方法可以执行的步骤数.

方法的max_steps参数train()限制了可累计运行的步骤总数train()

例4:

如果batch_size = 4,num_epochs = 2,则input_fn一次train()执行可以发出2批.但是,如果max_steps设置为20,则无论train()执行多少次,优化中只会运行20个步骤.这与示例1形成对比,其中如果train()方法被退出100次,则优化器可以运行到200步.

希望这能详细了解这些论点的含义.