赞
踩
Tensorflow中,Estimator可以用来模型的训练、评估、预测等。
当用 Estimator 编写一个 application,你必须将 input pipeline 和 model 分开。这种分离简化了在不同数据集上的 experiments。
可以看到Estimator是属于High level的API,而Mid-level API分别是:
• Layers:用来构建网络结构
• Datasets: 用来构建数据读取pipeline
• Metrics:用来评估网络性能
可以看到如果使用Estimator,我们只需要关注这三个部分即可,而不用再关心一些太细节的东西,另外也不用再使用烦人的Session了。
Estimator 有以下优势:
tf.layers
上,这简化了自定义 Estimator 的编写。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。
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)
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)
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)
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))
estimator.train(input_fn=train_input_fn, max_steps=num_train_steps)
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。