aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/contrib/learn/README.md
blob: d516bffc5e0327a3400068b35de5503e5a925a54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
EVERYTHING IN THIS DIRECTORY IS DEPRECATED.

Using functions or classes will result in warnings.

Instructions for converting to current alternatives are included in the
warnings. A high-level overview is below.

## Canned Estimators

Many canned estimators (subclasses of `Estimator`) have equivalents in core:
`DNNClassifier`, `DNNRegressor`, `DNNEstimator`, `LinearClassifier`,
`LinearRegressor`, `DNNLinearCombinedClassifier` and
`DNNLinearCombinedRegressor`. They are exposed under `tf.estimator`.
`DNNEstimator`, `LinearEstimator` and `DNNLinearCombinedEstimator`
are exposed under `tf.contrib.estimator`.

To migrate to the new api, users need to take the following steps:

* Replace `tf.contrib.learn` with `tf.estimator`.
* If you subclass any of the estimators, stop doing that. You should be able to
  write a factory method that returns a canned estimator instead. If this is not
  possible (if you override methods from the canned estimator), consider writing
  a custom estimator instead. See `tf.estimator.Estimator`.
* Set `loss_reduction=tf.losses.Reduction.SUM_OVER_BATCH_SIZE` to preserve loss
  reduction as the average over batch.
* Some optimizer-related arguments are no longer passed in the estimator
  constructor. Instead, we provide methods that perform the same job by wrapping
  an optimizer. Specifically:
  *  `gradient_clip_norm`: Use `tf.contrib.estimator.clip_gradients_by_norm`
  *  `embedding_lr_multipliers`: Not supported.
  Other arguments:
  * `input_layer_min_slice_size`: Replaced by `input_layer_partitioner`
  * `enable_centered_bias`: Not supported. Dropping this argument is unlikely to
    harm your model.
  * `feature_engineering_fn`: Not supported. You can call your
    `feature_engineering_fn` inside your input_fn:
    ```python
    def new_input_fn():
      features, labels = old_input_fn()
      return feature_engineering_fn(features, labels)
    ```
* Use `tf.reshape` to reshape labels in your `input_fn`. `tf.estimator`
  classifiers and regressors expect labels as a 2D Tensor of shape
  `[batch_size, 1]`, or `[batch_size, n_labels]`. In contrast,
  `tf.contrib.learn` classifiers and regressors supported labels with shape
  `[batch_size]`.
* If you pass custom metrics from the `evaluate()` method call, use
  `tf.contrib.estimator.add_metrics`.
* Replace your `serving_input_fn` with a `serving_input_receiver_fn`.
  Note this should be entirely distinct from your training `input_fn`, so if you
  previously had one `input_fn` with different "modes", you should now factor
  that apart.  Where the former returned either a simple `(features, labels)`
  tuple or `InputFnOps`, you should now return a `ServingInputReceiver`.
  If you were generating your `serving_input_fn` using the
  `build_parsing_serving_input_fn` helper, you can simply drop in the
  replacement `build_parsing_serving_input_receiver_fn`.

Some remaining estimators/classes:

* `DynamicRnnEstimator`:  Consider a custom `model_fn`.
* `KMeansClustering`: Use `tf.contrib.factorization.KMeansClustering`.
* `LogisticRegressor`: Not supported. Instead, use `binary_classification_head`
  with a custom `model_fn`, or with `DNNEstimator`.
* `StateSavingRnnEstimator`: Consider a custom `model_fn`.
* SVM: Consider a custom `model_fn`.
* `LinearComposableModel` and `DNNComposableModel`: Not supported. 
  Consider `tf.contrib.estimator.DNNEstimator`, or write a custom model_fn.
* `MetricSpec`: Deprecated. For adding custom metrics to canned Estimators, use
  `tf.contrib.estimator.add_metrics`.

## Estimator
`tf.contrib.learn.Estimator` is migrated to `tf.estimator.Estimator`.

To migrate, users need to take the following steps:

* Replace `tf.contrib.learn.Estimator` with `tf.estimator.Estimator`.
* If you pass a `config` argument to `Estimator`, this must be
  `tf.estimator.RunConfig`. You may need to edit your code accordingly.
* Edit your `model_fn` to return `tf.estimator.EstimatorSpec`. Refer to
  `EstimatorSpec` for documentation of specific fields.
* If your `model_fn` uses the `mode` argument, use `tf.estimator.ModeKeys`.

Some related classes:
* `Evaluable`, `Trainable`: Not supported, merged into `tf.estimator.Estimator`.
* ExportStrategy: Replaced by `tf.estimator.Exporter`.

## Head/MultiHead
These classes are now supported under `tf.contrib.estimator`, e.g.
`tf.contrib.estimator.multi_class_head` and `tf.contrib.estimator.multi_head`.

Some differences:

* `multi_class_head`: If you use `tf.contrib.learn.multi_class_head` with
  `n_classes=2`, switch to `tf.contrib.estimator.binary_classification_head`.
* `loss_only_head`: Not supported.
* `poisson_regression_head`: Not supported (yet).
* `binary_svm_head`: Not supported (yet).
* `no_op_train_fn`: Replace it with `tf.no_op`.

Some arguments are renamed, please refer to documentation. In addition:

* `loss_fn`: Supported for `multi_label_head`. If you need it for other heads,
  please open an issue.
* `metric_class_ids`: Not supported (yet).
* `enable_centered_bias`: Not supported. Dropping this argument is unlikely to
  harm your model.
* `label_name`: Not needed in `tf.estimator`. If you don’t use `multi_head`,
  drop this argument. If you use `multi_head`, refer to
  `tf.contrib.estimator.multi_head` documentation.

## Experiment Class - Distributed Training Tooling

Switch to `tf.estimator.train_and_evaluate`. Some differences:

* Most of the constructor arguments, like `train_input_fn`, `eval_input_fn`,
  should be wrapped into `tf.estimator.TrainSpec` and `tf.estimator.EvalSpec`.
* Remove the `experiment_fn`. Instead, create the `Estimator`,
  `train_spec` and `eval_spec`, then call `tf.estimator.train_and_evaluate`
  directly.
* Inside `tf.estimator.EvalSpec`, the `exporter` field is the replacement
  for `export_strategy`. To be precise, `tf.estimator.LatestExporter` is the
  replacement for `tf.contrib.learn.make_export_strategy`. If you want to export
  only at the end of training  use `tf.estimator.FinalExporter`.
* If the `TF_CONFIG` environment variable is constructed manually, please read
  the `train_and_evaluate` documentation for the new requirementds (in
  particular, the chief node and evaluator node).

## Others Classes and Functions

* `tf.contrib.learn.datasets` is deprecated. We are adding ready to use datasets
  to tensorflow/models. Many smaller datasets are available from other sources,
  such as scikits.learn. Some Python processing may have to be written, but this
  is straightforward to implement using the standard modules.
* `tf.contrib.learn.preprocessing`: Deprecated. The python-only preprocessing
  functions are not a good fit for TensorFlow. Please use `tf.data`, and
  consider tensorflow/transform for more complex use cases.
* `tf.contrib.learn.models`: Not supported, use canned estimators instead.
* `tf.contrib.learn.monitors`: Implement `SessionRunHook` instead. Hook
  implementations are in `tf.train`.
* `tf.contrib.learn.learn_io`: Use the methods in `tf.estimator.inputs`, such as
  `tf.estimator.inputs.numpy_input_fn`. Some utility functions have no
  equivalent, we encourage the use of `tf.data`.