tf.contrib.learn 分布式模型训练任务快速入门

一个简单例子

tf.contrib.learn 的模型训练任务在执行训练的时候需要调用 Estimatorfit 方法,调用该方法时指定一个 input_fn 来指定模型的输入(features)和预期输出(labels)。

import tensorflow as tf
import numpy as np
tf.logging.set_verbosity(tf.logging.INFO)

features = [tf.contrib.layers.real_valued_column("x", dimension=1)]
estimator = tf.contrib.learn.LinearRegressor(feature_columns=features)

x = np.array([1., 2., 3., 4.])
y = np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4,
                                              num_epochs=1000)
estimator.fit(input_fn=input_fn, steps=1000)
estimator.evaluate(input_fn=input_fn)

在编写支持 TaaS 平台的 tf.contrib.learn 模型训练任务的时候,只需要将传递给 Estimatorfitevaluate 方法的 input_fn 参数来定义一个 dist_base.Experiment 对象即可。

import tensorflow as tf
import numpy as np
from caicloud.clever.tensorflow import dist_base
tf.logging.set_verbosity(tf.logging.INFO)

features = [tf.contrib.layers.real_valued_column("x", dimension=1)]
estimator = tf.contrib.learn.LinearRegressor(feature_columns=features)

x = np.array([1., 2., 3., 4.])
y = np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4,
                                              num_epochs=1000)
experiment = dist_base.Experiment(
    estimator = estimator,
    train_input_fn = input_fn,
    eval_input_fn = input_fn)
experiment.run()

Boston House 样例

TensorFlow 官方文档提供 Boston House Values 样例来讲解了 tf.contrib.learn 的使用(请参数 Building Input Functions with tf.contrib.learn),实现代码请参考 boston.py

下面通过改造 Boston House 样例代码来支持在 TaaS 平台上执行。

# coding=utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import itertools

import pandas as pd
import tensorflow as tf
import tensorflow.contrib.learn as learn

from caicloud.clever.tensorflow import dist_base

tf.app.flags.DEFINE_string("data_dir",
                           ".",
                           "data directory path.")
FLAGS = tf.app.flags.FLAGS

tf.logging.set_verbosity(tf.logging.INFO)

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",
           "dis", "tax", "ptratio", "medv"]
FEATURES = ["crim", "zn", "indus", "nox", "rm",
            "age", "dis", "tax", "ptratio"]
LABEL = "medv"

# 加载训练数据集和测试数据集
training_set = pd.read_csv("{0}/boston_train.csv".format(FLAGS.data_dir),
                           skipinitialspace=True,
                           skiprows=1, names=COLUMNS)
test_set = pd.read_csv("{0}/boston_test.csv".format(FLAGS.data_dir),
                       skipinitialspace=True,
                       skiprows=1, names=COLUMNS)

# 输入数据的特征列表
feature_cols = [tf.contrib.layers.real_valued_column(k)
                for k in FEATURES]

# 定义深度神经网络回归模型
run_config = tf.contrib.learn.RunConfig(
    save_checkpoints_secs=dist_base.cfg.save_checkpoints_secs)
regressor = tf.contrib.learn.DNNRegressor(
    feature_columns=feature_cols,
    hidden_units=[10, 10],
    model_dir=dist_base.cfg.logdir,
    config=run_config)

def input_fn(data_set):
    feature_cols = {k: tf.constant(data_set[k].values)
                    for k in FEATURES}
    labels = tf.constant(data_set[LABEL].values)
    return feature_cols, labels

# 定义 dist_base.Experiment 对象来分布式执行 tf.contrib.learn 模型训练任务。
# 指定相对应的 esimator 对象,将要传递给 estimator.fit() 方法进行模型训练的
# input_fn 参数传递给 dist_base.Experiment 的 train_input_fn 参数。将执行模型
# 评估时传递给 estimator.evaluate() 方法的 input_fn 参数传递给 dist_base.Experiment
# 对象的 eval_input_fn 参数。
exp = dist_base.Experiment(
    estimator = regressor,
    train_input_fn = lambda: input_fn(training_set),
    eval_input_fn = lambda: input_fn(test_set),
    eval_steps = 1)

# 调用 dist.Experiment.run() 方法来分布式执行 tf.contrib.learn 模型训练任务。
exp.run()

results matching ""

    No results matching ""