Regression

A flexible estimator for regression problems is implemented in bob.learn.tensorflow.estimators.Regressor. You can use this estimator for various regression problems. The guide below (taken from https://www.tensorflow.org/tutorials/keras/basic_regression) outlines a basic regression example using the API of this package.

The Boston Housing Prices dataset

1. Let’s do some imports:

>>> import tensorflow as tf
>>> from tensorflow import keras
>>> import tensorflow.contrib.slim as slim
>>> from bob.learn.tensorflow.estimators import Regressor

2. Download the dataset:

>>> boston_housing = keras.datasets.boston_housing
>>> print("doctest s**t"); (train_data, train_labels), (test_data, test_labels) = boston_housing.load_data() 
doc...
>>> print("Training set: {}".format(train_data.shape))
Training set: (404, 13)
>>> print("Testing set:  {}".format(test_data.shape))
Testing set:  (102, 13)

3. Normalize features

>>> # Test data is *not* used when calculating the mean and std.
>>>
>>> mean = train_data.mean(axis=0)
>>> std = train_data.std(axis=0)
>>> train_data = (train_data - mean) / std
>>> test_data = (test_data - mean) / std

4. Define the input functions

>>> EPOCH = 2
>>> def input_fn(mode):
...     if mode == tf.estimator.ModeKeys.TRAIN:
...         features, labels = train_data, train_labels
...     else:
...         features, labels, = test_data, test_labels
...     dataset = tf.data.Dataset.from_tensor_slices((features, labels, [str(x) for x in labels]))
...     dataset = dataset.batch(1)
...     if mode == tf.estimator.ModeKeys.TRAIN:
...         dataset = dataset.apply(tf.contrib.data.shuffle_and_repeat(len(labels), EPOCH))
...     data, label, key = dataset.make_one_shot_iterator().get_next()
...     # key is a unique string identifier of each sample.
...     # Here we just use the string version of labels.
...     return {'data': data, 'key': key}, label
...
>>> def train_input_fn():
...     return input_fn(tf.estimator.ModeKeys.TRAIN)
...
>>> def eval_input_fn():
...     return input_fn(tf.estimator.ModeKeys.EVAL)

5. Create the estimator

>>> def architecture(data, mode, **kwargs):
...     endpoints = {}
...
...     with tf.variable_scope('DNN'):
...
...         name = 'fc1'
...         net = slim.fully_connected(data, 64, scope=name)
...         endpoints[name] = net
...
...         name = 'fc2'
...         net = slim.fully_connected(net, 64, scope=name)
...         endpoints[name] = net
...
...     return net, endpoints
...
>>> estimator = Regressor(architecture, model_dir=model_dir)

5. Train and evaluate the model

>>> estimator.train(train_input_fn) 
<bob.learn.tensorflow.estimators.Regressor ...

>>> 'rmse' in estimator.evaluate(eval_input_fn) 
True

>>> list(estimator.predict(eval_input_fn)) 
[...