当我目前正在尝试使用tf.estimator API时,我也想在此添加露水发现。我还不知道在整个TensorFlow中步骤和纪元参数的用法是否一致,因此,我现在仅与tf.estimator(特别是tf.estimator.LinearRegressor)有关。
num_epochs
定义的培训步骤:未明确定义的steps
estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input)
评论:我为训练输入设置了num_epochs=1
,并且numpy_input_fn
的doc条目告诉我“ num_epochs:整数,要遍历数据的时期数。如果None
则将永远运行。” 。在上面的示例中, num_epochs=1
,训练正好运行x_train.size / batch_size次/步(在我的情况下,这是175000个步,因为x_train
的大小为700000, batch_size
为4)。
培养通过限定的步骤num_epochs
: steps
比由隐式定义的步骤数显式定义的更高num_epochs=1
estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=200000)
注释:在我的情况下, num_epochs=1
意味着175000步( x_train.size / batch_size , x_train.size = 700,000和batch_size = 4 ),这恰好是estimator.train
的步数,尽管将steps参数设置为200,000 estimator.train(input_fn=train_input, steps=200000)
。
由steps
定义的培训steps
estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=1000)
注释:尽管我在调用numpy_input_fn
时已设置num_epochs=1
,但是训练在1000个步骤后停止。这是因为steps=1000
在estimator.train(input_fn=train_input, steps=1000)
覆盖num_epochs=1
在tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
。
结论 :无论参数num_epochs
为tf.estimator.inputs.numpy_input_fn
和steps
为estimator.train
限定,下限确定的,这将通过运行步骤的数目。
0
在大多数模型中,都有一个steps参数,指示要运行数据的步骤数 。但是我仍然看到,在最实际的用法中,我们还执行了拟合函数N epochs 。
以1个时间段运行1000个步和以10个时间段运行100个步有什么区别?在实践中哪一个更好?连续纪元之间有逻辑变化吗?数据改组?