【问题标题】:Hyperparameters tuning with tf.estimator.DNNClassifier使用 tf.estimator.DNNClassifier 调整超参数
【发布时间】:2020-07-21 16:32:56
【问题描述】:

我使用 DNNClassifier 类实现了以下模型。模型参数化如下

classifier = tf.estimator.DNNClassifier(
       hidden_units=[60, 30, 20],
       feature_columns=feature_columns,
       n_classes=len(labels),
       label_vocabulary=labels,
       batch_norm=True,
       optimizer=lambda: tf.keras.optimizers.Adam(
           learning_rate=tf.compat.v1.train.exponential_decay(
               learning_rate=0.1,
               global_step=tf.compat.v1.train.get_global_step(),
               decay_steps=10000,
               decay_rate=0.96)
       )
)

现在我想做一些超参数调整(例如学习率、单元数等)。

DNNClassifier 是一个预制的估算器类,继承自 Estimator 类。 但是虽然Estimator 有一个params 参数来传递超参数,但DNNClassifier 没有。 那么使用DNNClassifier 进行超参数调整的首选方法应该是什么?

【问题讨论】:

  • 但是您已经将两个超参数都传递给了您的模型。您正在传递hidden_units 中的单元数和optimizers.Adam(learning_rate)=0.1 中的学习率。你能再描述一下你的问题吗?
  • 是的,模型已经用固定值参数化了。我现在的目标是对几个值进行一些超参数调整。我重新表述了这个问题。希望对你有帮助

标签: tensorflow2.0 tensorflow-estimator


【解决方案1】:

首先,您的估算器需要一个输入函数,假设您使用 pandas 数据帧来保存数据,(data_df 和 label_df 是数据帧)您可以编写类似:

def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
    def input_function():
        ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
        if shuffle:
            ds = ds.shuffle(1024)
        ds = ds.batch(batch_size).repeat(num_epochs)
        return ds

    return input_function

然后使用上面的代码创建两个输入函数,一个用于训练,一个用于验证,如下所示:

train_input_fn = make_input_fn(X_train, y_train)
val_input_fn = make_input_fn(X_val, y_val, num_epochs=1, shuffle=False)

最后训练您定义的分类器并使用验证集评估它。多次运行此管道以调整您的超参数

classifier = tf.estimator.DNNClassifier(
       hidden_units=[60, 30, 20],
       feature_columns=feature_columns,
       n_classes=len(labels),
       label_vocabulary=labels,
       batch_norm=True,
       optimizer=lambda: tf.keras.optimizers.Adam(
           learning_rate=tf.compat.v1.train.exponential_decay(
               learning_rate=0.1,
               global_step=tf.compat.v1.train.get_global_step(),
               decay_steps=10000,
               decay_rate=0.96)
       )
)
# Train Classifier.
classifier.train(train_input_fn)

# Evaluate Classifier.
result = classifier.evaluate(val_input_fn)
print(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2021-10-12
    • 2021-08-11
    • 2020-07-24
    • 1970-01-01
    • 2018-12-07
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多