当前位置:   article > 正文

Estimator简介与使用

estimator

1 Estimator简介

Tensorflow中,Estimator可以用来模型的训练、评估、预测等。
当用 Estimator 编写一个 application,你必须将 input pipeline 和 model 分开。这种分离简化了在不同数据集上的 experiments。
在这里插入图片描述

可以看到Estimator是属于High level的API,而Mid-level API分别是:
• Layers:用来构建网络结构
• Datasets: 用来构建数据读取pipeline
• Metrics:用来评估网络性能
可以看到如果使用Estimator,我们只需要关注这三个部分即可,而不用再关心一些太细节的东西,另外也不用再使用烦人的Session了。

2 Estimator 的优势

Estimator 有以下优势:

  1. 对分布式的良好支持(不需要更改代码)。
  2. 有利于模型开发者之间的代码分享。
  3. 简化了模型的创建工作。
  4. Estimator 建立在 tf.layers 上,这简化了自定义 Estimator 的编写。
  5. Estimator 会为你创建 graph。
  6. 通过使用Estimator,您可以轻松保存摘要以使用Tensorboard进行可视化。
  7. Estimator 提供了一个安全的分布式训练环境,其会帮我们控制这么、何时去:
     建立 graph。
     初始化 variables。
     开始 queues。
     处理 exceptions。
     创建 checkpoint 文件,从失败中恢复训练。
     保存 summaries for TensorBoard。

3 Estimator 与 keras

Estimator API和Keras API都在低级核心Tensorflow API之上提供了更高级的API,您可以使用其中任何一个来训练您的模型。

Estimators API是在版本1.1中添加到Tensorflow中的,它提供了对较低级别Tensorflow核心操作的高级抽象。 它与Estimator实例一起使用,该实例是TensorFlow对完整模型的高级表示。

在1.x版本中,对于生产级项目,模型构建API是Estimator API。但是,随着最近的变化,keras api几乎赶上了Estimator API。最初,Estimator API具有更高的可伸缩性,允许分布式,并且具有方便的跨平台功能。然而,现在Estimator API的大部分优点都已被消除,因此,很快Keras API将很可能成为构建TensorFlow模型的唯一标准API

Keras与Estimators API相似之处在于,它抽象化了深度学习模型组件,如层 layers, 激活函数activation functions 和优化器optimizers,使开发人员更容易使用。 它是一个模型级别的库,不处理低级操作,低级操作是张量操作库或后端的工作。 Keras支持三个后端–Tensorflow,Theano和CNTK。

Keras在版本1.4.0(2017年11月2日)之前不属于Tensorflow的一部分,直到版本1.4.0,Keras才是Tensorflow的一部分。现在,当您使用tf.Keras(或者谈论’Tensorflow Keras’)时,您只需使用Keras接口和Tensorflow后端来构建和训练您的模型。

实战中:如果是tf1.0, 建议使用estimator,2.0以上建议使用keras API。

4 Estimator使用

在这里插入图片描述

4.1 Estimator定义

方法说明

class Estimator(object):
def init(self, model_fn, model_dir=None, config=None, params=None, warm_start_from=None):

参数说明:
• model_fn: 这个是需要我们自定义的网络模型函数。由model_fn指定的模型,其中,给定输入和其他一些参数,返回需要进行训练、计算,或预测的操作
• config: 用于控制内部和checkpoints等,如果model_fn函数也定义config这个变量,则会将config传给model_fn
• model_dir:保存模型参数、图形等的目录.这也可用于将目录中的检查点加载到Estimator中,以继续训练以前保存的模型

具体示例

#If TPU is not available, this will fall back to normal Estimator on CPU # or GPU.

estimator = tf.contrib.tpu.TPUEstimator(
use_tpu=FLAGS.use_tpu,
model_fn=model_fn,
config=run_config,

train_batch_size=FLAGS.train_batch_size,
eval_batch_size=FLAGS.eval_batch_size,
predict_batch_size=FLAGS.predict_batch_size)

4.2 model_fn定义

方法说明

def my_model_fn(
features, # This is batch_features from input_fn,Tensor or dict of Tensor (depends on data passed to fit).
labels, # This is batch_labels from input_fn
mode, # An instance of tf.estimator.ModeKeys
params, # Additional configuration
config=None
):
Estimator规定model_fn需要返回tf.estimator.EstimatorSpec
参数说明:
• mode == tf.estimator.ModeKeys.TRAIN、EVAL
• features:这是从input_fn传递给train、evaluate和predict返回的第一个项目.这应该是一个相同的单一的Tensor或dict.

具体示例

def my_model_fn(
features, # This is batch_features from input_fn,Tensor or dict of Tensor (depends on data passed to fit).
labels, # This is batch_labels from input_fn
mode, # An instance of tf.estimator.ModeKeys
params, # Additional configuration
config=None
):
input_ids = features[“input_ids”]
input_mask = features[“input_mask”]
segment_ids = features[“segment_ids”]
label_ids = features[“label_ids”]

if mode == tf.estimator.ModeKeys.TRAIN:

train_op = optimization.create_optimizer(
total_loss, learning_rate, num_train_steps, num_warmup_steps, use_tpu)

output_spec = tf.contrib.tpu.TPUEstimatorSpec(
mode=mode,
loss=total_loss,
train_op=train_op,
scaffold_fn=scaffold_fn)
return output_spec

predicted_classes = tf.argmax(logits, 1)
if mode == tf.estimator.ModeKeys.PREDICT:
predictions = {
‘class_ids’: predicted_classes[:, tf.newaxis],
‘probabilities’: tf.nn.softmax(logits),
‘logits’: logits,
}
return tf.estimator.EstimatorSpec(mode, predictions=predictions)

metrics = {‘accuracy’: accuracy}

if mode == tf.estimator.ModeKeys.EVAL:
return tf.estimator.EstimatorSpec(
mode, loss=loss, eval_metric_ops=metrics)

4.3 EstimatorSpec

方法说明

class EstimatorSpec():
def new(cls,
mode,
predictions=None,
loss=None,
train_op=None,
eval_metric_ops=None,
export_outputs=None,
training_chief_hooks=None,
training_hooks=None,
scaffold=None,
evaluation_hooks=None,
prediction_hooks=None):
根据mode的值的不同,需要不同的参数,即:
• 对于mode == ModeKeys.TRAIN:必填字段是loss和train_op.
• 对于mode == ModeKeys.EVAL:必填字段是loss.
• 对于mode == ModeKeys.PREDICT:必填字段是predictions.

具体示例

train_op = optimization.create_optimizer(
total_loss, learning_rate, num_train_steps, num_warmup_steps, use_tpu)

def tpu_scaffold():
tf.train.init_from_checkpoint(init_checkpoint, assignment_map)
return tf.train.Scaffold()

scaffold_fn = tpu_scaffold

output_spec = tf.contrib.tpu.TPUEstimatorSpec(
mode=mode,
loss=total_loss,
train_op=train_op,
scaffold_fn=scaffold_fn)

4.4 Config

方法说明

class RunConfig(object):
“”“This class specifies the configurations for an Estimator run.”""

def init(self,
model_dir=None,
tf_random_seed=None,
save_summary_steps=100,
save_checkpoints_steps=_USE_DEFAULT,
save_checkpoints_secs=_USE_DEFAULT,
session_config=None,
keep_checkpoint_max=5,
keep_checkpoint_every_n_hours=10000,
log_step_count_steps=100,
train_distribute=None,
device_fn=None,
protocol=None,
eval_distribute=None,
experimental_distribute=None,
experimental_max_worker_delay_secs=None,
session_creation_timeout_secs=7200):
参数说明:
• save_checkpoints_steps:每隔多少个step就存一次checkpoint

具体示例

if FLAGS.use_tpu and FLAGS.tpu_name:
tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(
FLAGS.tpu_name, zone=FLAGS.tpu_zone, project=FLAGS.gcp_project)

run_config = tf.contrib.tpu.RunConfig(
cluster=tpu_cluster_resolver,
master=FLAGS.master,
model_dir=FLAGS.output_dir,
save_checkpoints_steps=FLAGS.save_checkpoints_steps,
tpu_config=tf.contrib.tpu.TPUConfig(
iterations_per_loop=FLAGS.iterations_per_loop,
num_shards=FLAGS.num_tpu_cores,
per_host_input_for_training=is_per_host))

4.5 estimator.train

estimator.train(input_fn=train_input_fn, max_steps=num_train_steps)

4.6 input_fn

input_fn:一个函数,提供由小 batches 组成的数据, 供训练使用。必须返回以下之一:
1、一个 'tf.data.Dataset’对象:Dataset的输出必须是一个元组 (features, labels),元组要求如下。
2、一个元组 (features, labels):features 是一个 Tensor 或者一个字典(特征名为 Tensor),labels 是一个 Tensor 或者一个字典(特征名为 Tensor)。features 和 labels 都被 model_fn 所使用,应该符合 model_fn 输入的要求。

def train_input_fn(features, labels, batch_size):
“”“An input function for training”""
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

return dataset.shuffle(1000).repeat().batch(batch_size)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/312325?site
推荐阅读
相关标签
  

闽ICP备14008679号