TensorFlowestimator详解

TensorFlowestimator详解
1.框架
Estimator是属于High level的API
Mid-level API分别是 —— Layers:⽤来构建⽹络结构、Datasets: ⽤来构建数据读取pipeline、Metrics:⽤来评估⽹络性能
2.使⽤
创建⼀个或多个输⼊函数,即input_fn
定义模型的特征列,即feature_columns
实例化 Estimator,指定特征列和各种超参数
在 Estimator 对象上调⽤⼀个或多个⽅法,传递适当的输⼊函数作为数据的来源。(train, evaluate, predict)
伪代码形式介绍如何使⽤Estimator
创建⼀个或多个输⼊函数,即input_fn
关闭起重装置注意, features需要是字典 (另外此处的feature与我们常说的提取特征的feature还不太⼀样,也可以指原图数据(raw image),或者其他未作处理的数据)。下⾯定义的my_feature_column会传给Estimator⽤于解析features。
流媒体直播系统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))
汽车喷水电机# Shuffle, repeat, and batch the examples.
return dataset.shuffle(1000).repeat().batch(batch_size)
定义模型的特征列,即feature_columns
# Feature columns describe how to use the input.
my_feature_columns = []
for key in train_x.keys():
my_feature_columns.append(tf.feature_column.numeric_column(key=key))
实例化 Estimator,指定特征列和各种超参数
注意在实例化Estimator的时候不⽤把数据传进来,你只需要把feature_columns传进来即可,告诉Estimator需要解析哪些特征值,⽽数据集需要在训练和评估模型的时候才传
# Build a DNN with 2 hidden layers and 10 nodes in each hidden layer.
classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
# Two hidden layers of 10 nodes each.
hidden_units=[10, 10],
# The model must choose between 3 classes.
镂空雕花n_classes=3)
在 Estimator 对象上调⽤⼀个或多个⽅法,传递适当的输⼊函数作为数据的来源
train(训练)
# Train the Model.
input_fn=lambda:ain_input_fn(train_x, train_y, args.batch_size),
ain_steps)
evaluate(评估)
# Evaluate the model.
eval_result = classifier.evaluate(
input_fn=lambda:iris_data.eval_input_fn(test_x, test_y, args.batch_size))
print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
predict(预测)
# Generate predictions from the model
expected = ['Setosa', 'Versicolor', 'Virginica']
predict_x = {
'SepalLength': [5.1, 5.9, 6.9],
'SepalWidth': [3.3, 3.0, 3.1],
'PetalLength': [1.7, 4.2, 5.4],
'PetalWidth': [0.5, 1.5, 2.1],
}
predictions = classifier.predict(
input_fn=lambda:iris_data.eval_input_fn(predict_x,
batch_size=args.batch_size))
3.深⼊理解
上⾯的⽰例中简单地介绍了Estimator,⽹络使⽤的是预创建好的DNNClassifier,其他预创建⽹络结构有如下
3.1 源码理解
防震床
def __init__(self, model_fn, model_dir=None, config=None, params=None, warm_start_from=None):
...t恤制作
model_dir: 指定checkpoints和其他⽇志存放的路径
model_fn: 这个是需要我们⾃定义的⽹络模型函数,后⾯详细介绍
config: ⽤于控制内部和checkpoints等,如果model_fn函数也定义config这个变量,则会将config传给model_fn
params: 该参数的值会传递给model_fn
warm_start_from: 指定checkpoint路径,会导⼊该checkpoint开始训练
3.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
):
前两个参数是从输⼊函数中返回的特征和标签批次;也就是说,features 和 labels 是模型将使⽤的数据
params 是⼀个字典,它可以传⼊许多参数⽤来构建⽹络或者定义训练⽅式等。例如通过设置params['n_classes']来定义最终输出节点的个数等。
config 通常⽤来控制checkpoint或者分布式什么,这⾥不深⼊研究。
mode 参数表⽰调⽤程序是请求训练、评估还是预测,分别通过tf.estimator.ModeKeys.TRAIN / EVAL / PREDICT 来定义。另外通过观察DNNClassifier的源代码可以看到,mode这个参数并不⽤⼿动传⼊,因为Estimator会⾃动调整。例如当你调⽤ain(...)的时候,mode则会被赋值tf.estimator.ModeKeys.TRAIN
model_fn需要对于不同的模式提供不同的处理⽅式,并且都需要返回⼀个tf.estimator.EstimatorSpec的实例。
咋听起来可能有点不知所云,⼤⽩话版本就是:模型有训练,验证和测试三种阶段,⽽且对于不同模式,对数据有不同的处理⽅式。例如在训练阶段,我们需要将数据喂给模型,模型基于输⼊数据给出预测值,然后我们在通过预测值和真实值计算出loss,最后⽤loss更新⽹络参数,⽽在评估阶段,我们则不需要反向传播更新⽹络参数,换句话说,mdoel_fn需要对三种模式设置三套代码。
另外model_fn需要返回什么东西呢?Estimator规定model_fn需要返回tf.estimator.EstimatorSpec,这样它才好更具⼀般化的进⾏处理。
3.3 Config
此处的config需要传⼊tf.estimator.RunConfig,其源代码如下
"""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):
model_dir: 指定存储模型参数,graph等的路径
save_summary_steps: 每隔多少step就存⼀次Summaries,不知道summary是啥
save_checkpoints_steps:每隔多少个step就存⼀次checkpoint
save_checkpoints_secs: 每隔多少秒就存⼀次checkpoint,不可以和save_checkpoints_steps同时指
定。如果⼆者都不指定,则使⽤默认值,即每600秒存⼀次。如注意上⾯三个**save-**参数会控制保存checkpoints(模型结构和参数)和event⽂件(⽤于tensorboard),如果你都不想保存,那么你需要将这三个参数都置为FA
keep_checkpoint_max:指定最多保留多少个checkpoints,也就是说当超出指定数量后会将旧的checkpoint删除。当设置为None或0时,则保留所有checkpoints。    keep_checkpoint_every_n_hours:
log_step_count_steps:该参数的作⽤是,(相对于总的step数⽽⾔)指定每隔多少step就记录⼀次训练过程中loss的值,同时也会记录global steps/s,通过这个也可以得后⾯这些参数与分布式有关,以后有时间再慢慢了解。
train_distribute
device_fn
protocol
eval_distribute
experimental_distribute
experimental_max_worker_delay_secs
3.4 tf.estimator.EstimatorSpec
它是⼀个class(类),是定义在model_fn中的,并且model_fn返回的也是它的⼀个实例,这个实例是⽤来初始化Estimator类的
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):

本文发布于:2024-09-22 17:23:38,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/216566.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:需要   模型   数据   训练   参数   指定
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议