学习 Tensorflow(3)

Fri 12 January 2018

学习 Tensorflow (3)

Estimator

官方资料参考 https://www.tensorflow.org/api_docs/python/tf/estimator

Estimator 一个非常赞的 High-level 封装。

tensorflow programming environment

Estimator 的架构如下:

estimators struct

对外提供的四个功能接口:

  • train, 训练模型
  • evaluate, 验证测试集
  • predict, 利用模型进行预测
  • export_savedmodel, 将模型导出给 tensorflow serving 使用

我们需要给 estimator 提供input_fn,怎么读取解析训练数据或者测试数据。predict_input_fn,怎么解析预测数据。

Estimator 帮我们实现了 train 和 eval 的 loop,并且会 catch 正常的 DataLoss 错误(数据读完时)。

我们指定 model dir,estimator 帮我们自动的保持 checkpoint。

Estimator 提供的生产力

Estimator 可以帮我们做什么

我们只要关注该关注的几个地方:

  • input,数据的读取和解析
  • inference & loss,模型的定义,loss 函数的选择

其他的东西交给 estimator:

  • save checkpoint
  • scalars,记录 global_step,loss 等的变化
  • loop,写 loop 代码和跳出逻辑
  • distributed,我们只要指定一下环境变量,就可以从单机变成分布式

Estimator 的模型定义

Estimator 为我们封装了,6 个 High level 的 Classifier 和 Regressor,分别是:

  • DNNClassifier,简单的全连接 DNN 分类模型
  • DNNRegressor,简单的全连接 DNN 回归模型
  • LinearClassifier,线性分类模型
  • LinearRegressor,线性回归模型
  • DNNLinearCombinedClassifier,Wide and deep 的分类模型
  • DNNLinearCombinedRegressor,Wide and deep 的回归模型

在使用上述模型的时候,我们只要指定 feature column,和 hidden units(如果是 DNN 或者 Wide and deep),连 optimizer 都可以不指定。如果你不需要模型的 optimizer,或者 learning rate,也可以自己指定。

除了上面傻瓜式的 6 个模型外,estimator 提供了tf.estimator.EstimatorSpec给我们创建自定义的 estimator。

Estimator 导出模型给 serving 使用

Estimator 中记录性能 profile

Low level 的 profile 保存方法,在 estimator 中无法使用,因为 train 或者 evaluate 的循环被 estimator 封装了,你无从插入记录的代码。但 Estimator 提供了一个更简单的方法,就是 hook:tf.train.ProfilerHook

    if FLAGS.profiler:
        hooks = [tf.train.ProfilerHook(save_steps=2000)]
    else:
        hooks = None
    regressor.train(input_fn=lambda: input_fn(True, train_files, FLAGS.batch_size, FLAGS.train_epochs), hooks=hooks)

生成的文件依然使用 Chrome 查看,

Estimator 的困扰和解决方法

因为封装太高层了,很多知道怎么用 low level api 去解的问题,现在不知道怎么解。我把自己遇到的问题和解决方法列在下面供大家参考。

怎样分布式部署:

estimator 的RunConfig在构造的时候会从环境变量TF_CONFIG读取分布式运行的配置。假设我们要启动一个分布式训练中的 chief 节点,用下面的 json 设置环境变量就可以了。

cluster = {'chief': ['host0:2222'],
           'ps': ['host1:2222', 'host2:2222'],
           'worker': ['host3:2222', 'host4:2222', 'host5:2222']}
os.environ['TF_CONFIG'] = json.dumps(
    {'cluster': cluster,
     'task': {'type': 'worker', 'index': 1}})

逻辑回归的 AUC 怎么算:

如果使用的模型是 estimator 提供的 6 个 high level estimator 之一,用:

def my_auc(labels, predictions):
    return {'auc': tf.metrics.auc(labels, tf.sigmoid(predictions['predictions']))}

m = tf.contrib.estimator.add_metrics(m, my_auc)

如果是自定义的 estimator,建议:

    if mode == tf.estimator.ModeKeys.EVAL:
        metric_ops = {
            'eval/auc': tf.metrics.auc(labels=labels, predictions=logistic, name='auc'),
            'eval/auc_pr': tf.metrics.auc(labels=labels, predictions=logistic, curve='PR', name='auc_precision_recall')
        }
        return tf.estimator.EstimatorSpec(mode=mode, loss=loss,

怎么样指定设备:

estimator 会自动选用设备,但你也可以自己用环境变量或者代码指定设备。

利用环境变量CUDA_VISIBLE_DEVICES可以隐藏 GPU 设备,如下面只让训练程序使用 GPU0:

CUDA_VISIBLE_DEVICES=0 python trainer.py

你也可以在model_fn函数中,使用with tf.device('/gpu:1')这样的代码指定设备。

Category: 机器学习 Tagged: Tensorflow 深度学习 DNN TFRecords

comments


学习Tensorflow(2)

Wed 06 December 2017

学习Tensorflow (2)

如果你对Tensorflow不是怎么了解,建议你先阅读入门的教程。

Spark生成TFRecords格式

官方推荐的也是效率最高的训练数据的组织形式就是TFRecords格式。Spark是大数据处理的神器,处理完的数据放在hdfs上,Tensorflow可以直接读取。

很多公司的训练数据准备都是用Spark进行处理的,Google也为我们提供了在Spark中生成TFRecords格式的方法:https://github.com/tensorflow/ecosystem/tree/master/hadoop

因为Tensorflow用的protobuf版本和Hadoop的不一样,所以要新引入一个jar包,这个jar包在编译的时候用shade把protobuf的包名改名。注意protoc的版本,按照文档说明编译,基本上不会出错。

import org.tensorflow.hadoop.shaded.protobuf.ByteString
import org.apache.hadoop.io.{NullWritable, BytesWritable}
import org.apache.spark.{SparkConf, SparkContext}
import …

Category: 机器学习 Tagged: Tensorflow 深度学习 DNN TFRecords

comments

Read More
Page 1 of 1