aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar A. Unique TensorFlower <gardener@tensorflow.org>2018-04-03 08:54:01 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-04-03 08:56:29 -0700
commitcaf6706067718e5b8856036893977085b3b18fcb (patch)
tree134858bd09f7cca9fd696c04baffec3b4fdf13a9
parentb036452ca347b7ab809711f71041d0457b0062d0 (diff)
Changes loss_reduction default to SUM_OVER_BATCH_SIZE for regression_head and poisson_regression_head.
PiperOrigin-RevId: 191446787
-rw-r--r--tensorflow/contrib/estimator/BUILD3
-rw-r--r--tensorflow/contrib/estimator/python/estimator/dnn_linear_combined_test.py9
-rw-r--r--tensorflow/contrib/estimator/python/estimator/dnn_test.py5
-rw-r--r--tensorflow/contrib/estimator/python/estimator/head.py12
-rw-r--r--tensorflow/contrib/estimator/python/estimator/head_test.py4
-rw-r--r--tensorflow/contrib/estimator/python/estimator/linear_test.py5
-rw-r--r--tensorflow/contrib/estimator/python/estimator/multi_head_test.py14
7 files changed, 35 insertions, 17 deletions
diff --git a/tensorflow/contrib/estimator/BUILD b/tensorflow/contrib/estimator/BUILD
index 2be62c9438..bec0329ebb 100644
--- a/tensorflow/contrib/estimator/BUILD
+++ b/tensorflow/contrib/estimator/BUILD
@@ -89,6 +89,7 @@ py_test(
"//tensorflow/python/estimator:numpy_io",
"//tensorflow/python/estimator:prediction_keys",
"//tensorflow/python/feature_column",
+ "//tensorflow/python/ops/losses",
"//third_party/py/numpy",
"@six_archive//:six",
],
@@ -129,6 +130,7 @@ py_test(
"//tensorflow/python/estimator:numpy_io",
"//tensorflow/python/estimator:prediction_keys",
"//tensorflow/python/feature_column",
+ "//tensorflow/python/ops/losses",
"//third_party/py/numpy",
"@six_archive//:six",
],
@@ -266,6 +268,7 @@ py_test(
"//tensorflow/python/estimator:numpy_io",
"//tensorflow/python/estimator:prediction_keys",
"//tensorflow/python/feature_column",
+ "//tensorflow/python/ops/losses",
"//third_party/py/numpy",
"@six_archive//:six",
],
diff --git a/tensorflow/contrib/estimator/python/estimator/dnn_linear_combined_test.py b/tensorflow/contrib/estimator/python/estimator/dnn_linear_combined_test.py
index b5e4d34dc7..dd009a6753 100644
--- a/tensorflow/contrib/estimator/python/estimator/dnn_linear_combined_test.py
+++ b/tensorflow/contrib/estimator/python/estimator/dnn_linear_combined_test.py
@@ -34,6 +34,7 @@ from tensorflow.python.estimator.inputs import numpy_io
from tensorflow.python.feature_column import feature_column
from tensorflow.python.framework import ops
from tensorflow.python.ops import nn
+from tensorflow.python.ops.losses import losses
from tensorflow.python.platform import gfile
from tensorflow.python.platform import test
from tensorflow.python.summary.writer import writer_cache
@@ -52,7 +53,9 @@ def _dnn_only_estimator_fn(
config=None):
return dnn_linear_combined.DNNLinearCombinedEstimator(
head=head_lib.regression_head(
- weight_column=weight_column, label_dimension=label_dimension),
+ weight_column=weight_column, label_dimension=label_dimension,
+ # Tests in core (from which this test inherits) test the sum loss.
+ loss_reduction=losses.Reduction.SUM),
model_dir=model_dir,
dnn_feature_columns=feature_columns,
dnn_optimizer=optimizer,
@@ -100,7 +103,9 @@ def _linear_only_estimator_fn(
partitioner=None):
return dnn_linear_combined.DNNLinearCombinedEstimator(
head=head_lib.regression_head(
- weight_column=weight_column, label_dimension=label_dimension),
+ weight_column=weight_column, label_dimension=label_dimension,
+ # Tests in core (from which this test inherits) test the sum loss.
+ loss_reduction=losses.Reduction.SUM),
model_dir=model_dir,
linear_feature_columns=feature_columns,
linear_optimizer=optimizer,
diff --git a/tensorflow/contrib/estimator/python/estimator/dnn_test.py b/tensorflow/contrib/estimator/python/estimator/dnn_test.py
index 71f810acec..75e3107670 100644
--- a/tensorflow/contrib/estimator/python/estimator/dnn_test.py
+++ b/tensorflow/contrib/estimator/python/estimator/dnn_test.py
@@ -32,6 +32,7 @@ from tensorflow.python.estimator.export import export
from tensorflow.python.estimator.inputs import numpy_io
from tensorflow.python.feature_column import feature_column
from tensorflow.python.framework import ops
+from tensorflow.python.ops.losses import losses
from tensorflow.python.platform import gfile
from tensorflow.python.platform import test
from tensorflow.python.summary.writer import writer_cache
@@ -41,7 +42,9 @@ def _dnn_estimator_fn(weight_column=None, label_dimension=1, *args, **kwargs):
"""Returns a DNNEstimator that uses regression_head."""
return dnn.DNNEstimator(
head=head_lib.regression_head(
- weight_column=weight_column, label_dimension=label_dimension),
+ weight_column=weight_column, label_dimension=label_dimension,
+ # Tests in core (from which this test inherits) test the sum loss.
+ loss_reduction=losses.Reduction.SUM),
*args, **kwargs)
diff --git a/tensorflow/contrib/estimator/python/estimator/head.py b/tensorflow/contrib/estimator/python/estimator/head.py
index 74da2cbb3f..85ef3291ba 100644
--- a/tensorflow/contrib/estimator/python/estimator/head.py
+++ b/tensorflow/contrib/estimator/python/estimator/head.py
@@ -178,7 +178,7 @@ def binary_classification_head(
def regression_head(weight_column=None,
label_dimension=1,
- loss_reduction=losses.Reduction.SUM,
+ loss_reduction=losses.Reduction.SUM_OVER_BATCH_SIZE,
loss_fn=None,
inverse_link_fn=None,
name=None):
@@ -218,7 +218,9 @@ def regression_head(weight_column=None,
of the last dimension of the labels `Tensor` (typically, this has shape
`[batch_size, label_dimension]`).
loss_reduction: One of `tf.losses.Reduction` except `NONE`. Describes how to
- reduce training loss over batch. Defaults to `SUM`.
+ reduce training loss over batch and label dimension. Defaults to
+ `SUM_OVER_BATCH_SIZE`, namely weighted sum of losses divided by
+ `batch size * label_dimension`. See `tf.losses.Reduction`.
loss_fn: Optional loss function. Defaults to `mean_squared_error`.
inverse_link_fn: Optional inverse link function, also known as 'mean
function'. Defaults to identity.
@@ -243,7 +245,7 @@ def regression_head(weight_column=None,
def poisson_regression_head(
weight_column=None,
label_dimension=1,
- loss_reduction=losses.Reduction.SUM,
+ loss_reduction=losses.Reduction.SUM_OVER_BATCH_SIZE,
compute_full_loss=True,
name=None):
"""Creates a `_Head` for poisson regression using `tf.nn.log_poisson_loss`.
@@ -275,7 +277,9 @@ def poisson_regression_head(
of the last dimension of the labels `Tensor` (typically, this has shape
`[batch_size, label_dimension]`).
loss_reduction: One of `tf.losses.Reduction` except `NONE`. Describes how to
- reduce training loss over batch. Defaults to `SUM`.
+ reduce training loss over batch and label dimension. Defaults to
+ `SUM_OVER_BATCH_SIZE`, namely weighted sum of losses divided by
+ `batch size * label_dimension`. See `tf.losses.Reduction`.
compute_full_loss: Whether to include the constant `log(z!)` term in
computing the poisson loss. See `tf.nn.log_poisson_loss` for the full
documentation.
diff --git a/tensorflow/contrib/estimator/python/estimator/head_test.py b/tensorflow/contrib/estimator/python/estimator/head_test.py
index 8837dfdc6c..98962ca427 100644
--- a/tensorflow/contrib/estimator/python/estimator/head_test.py
+++ b/tensorflow/contrib/estimator/python/estimator/head_test.py
@@ -1162,8 +1162,8 @@ class PoissonRegressionHead(test.TestCase):
# exp(-1) - 2 * (-1) + 2*ln(2) - 2 + 0.5*ln(2*pi*2),
# exp(1) - 3 * 1 + 3*ln(3) - 3 + 0.5*ln(2*pi*3)]
# = [1.0, 3.020, 1.482]
- # sum_loss = 5.502
- expected_loss = 5.502
+ # training_loss = (1.0 + 3.020 + 1.482) / 3
+ expected_loss = 1.834
atol = 0.001
expected_train_result = b'my_train_op'
def _train_op_fn(loss):
diff --git a/tensorflow/contrib/estimator/python/estimator/linear_test.py b/tensorflow/contrib/estimator/python/estimator/linear_test.py
index c63514eb68..c41996b9c6 100644
--- a/tensorflow/contrib/estimator/python/estimator/linear_test.py
+++ b/tensorflow/contrib/estimator/python/estimator/linear_test.py
@@ -32,6 +32,7 @@ from tensorflow.python.estimator.export import export
from tensorflow.python.estimator.inputs import numpy_io
from tensorflow.python.feature_column import feature_column
from tensorflow.python.framework import ops
+from tensorflow.python.ops.losses import losses
from tensorflow.python.platform import gfile
from tensorflow.python.platform import test
from tensorflow.python.summary.writer import writer_cache
@@ -42,7 +43,9 @@ def _linear_estimator_fn(
"""Returns a LinearEstimator that uses regression_head."""
return linear.LinearEstimator(
head=head_lib.regression_head(
- weight_column=weight_column, label_dimension=label_dimension),
+ weight_column=weight_column, label_dimension=label_dimension,
+ # Tests in core (from which this test inherits) test the sum loss.
+ loss_reduction=losses.Reduction.SUM),
*args, **kwargs)
diff --git a/tensorflow/contrib/estimator/python/estimator/multi_head_test.py b/tensorflow/contrib/estimator/python/estimator/multi_head_test.py
index 74d3d6d728..d9e5aca295 100644
--- a/tensorflow/contrib/estimator/python/estimator/multi_head_test.py
+++ b/tensorflow/contrib/estimator/python/estimator/multi_head_test.py
@@ -483,14 +483,14 @@ class MultiHeadTest(test.TestCase):
[[2., 2., 0.], [2., 2., 0.]]], dtype=np.float32),
}
# Loss for the first head:
- # loss1 = (1+1)^2 + (0-1)^2 + (1+1)^2 + (0-1)^2 +
- # (1.5+1.5)^2 + (1.5-1.5)^2 + (1.5+1.5)^2 + (1.5-1.5)^2
- # = 28
+ # loss1 = ((1+1)^2 + (0-1)^2 + (1+1)^2 + (0-1)^2 +
+ # (1.5+1.5)^2 + (1.5-1.5)^2 + (1.5+1.5)^2 + (1.5-1.5)^2) / 8
+ # = 3.5
# Loss for the second head:
- # loss2 = (0-2)^2 + (1+2)^2 + (0-2)^2 + (0-2)^2 + (1+2)^2 + (0-2)^2 +
- # (2+2)^2 + (2-2)^2 + (0+2)^2 + (2+2)^2 + (2-2)^2 + (0+2)^2
- # = 74
- expected_training_loss = 28. + 74.
+ # loss2 = ((0-2)^2 + (1+2)^2 + (0-2)^2 + (0-2)^2 + (1+2)^2 + (0-2)^2 +
+ # (2+2)^2 + (2-2)^2 + (0+2)^2 + (2+2)^2 + (2-2)^2 + (0+2)^2) / 12
+ # = 6.167
+ expected_training_loss = 3.5 + 6.167
training_loss = multi_head.create_loss(
features={},