Add examples to layer losses
, metrics
, add_metric
, model reset_metrics
APIs.
PiperOrigin-RevId: 306448789 Change-Id: I8a21d9802ab7c0bf371ab219768609f33cf1146a
This commit is contained in:
parent
86592330b1
commit
22573b59c0
@ -123,8 +123,6 @@ class Layer(module.Module, version_utils.LayerVersionSelector):
|
|||||||
precision is used with a `tf.keras.mixed_precision.experimental.Policy`,
|
precision is used with a `tf.keras.mixed_precision.experimental.Policy`,
|
||||||
this is instead just the dtype of the layer's weights, as the computations
|
this is instead just the dtype of the layer's weights, as the computations
|
||||||
are done in a different dtype.
|
are done in a different dtype.
|
||||||
losses: List of losses added to this layer (via `self.add_loss()`).
|
|
||||||
metrics: List of metrics added to this layer (via `self.add_metric()`)..
|
|
||||||
trainable_weights: List of variables to be included in backprop.
|
trainable_weights: List of variables to be included in backprop.
|
||||||
non_trainable_weights: List of variables that should not be
|
non_trainable_weights: List of variables that should not be
|
||||||
included in backprop.
|
included in backprop.
|
||||||
@ -1140,12 +1138,42 @@ class Layer(module.Module, version_utils.LayerVersionSelector):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def losses(self):
|
def losses(self):
|
||||||
"""Losses which are associated with this `Layer`.
|
"""List of losses added using the `add_loss()` API.
|
||||||
|
|
||||||
Variable regularization tensors are created when this property is accessed,
|
Variable regularization tensors are created when this property is accessed,
|
||||||
so it is eager safe: accessing `losses` under a `tf.GradientTape` will
|
so it is eager safe: accessing `losses` under a `tf.GradientTape` will
|
||||||
propagate gradients back to the corresponding variables.
|
propagate gradients back to the corresponding variables.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
>>> class MyLayer(tf.keras.layers.Layer):
|
||||||
|
... def call(self, inputs):
|
||||||
|
... self.add_loss(tf.abs(tf.reduce_mean(inputs)))
|
||||||
|
... return inputs
|
||||||
|
>>> l = MyLayer()
|
||||||
|
>>> l(np.ones((10, 1)))
|
||||||
|
>>> l.losses
|
||||||
|
[1.0]
|
||||||
|
|
||||||
|
>>> inputs = tf.keras.Input(shape=(10,))
|
||||||
|
>>> x = tf.keras.layers.Dense(10)(inputs)
|
||||||
|
>>> outputs = tf.keras.layers.Dense(1)(x)
|
||||||
|
>>> model = tf.keras.Model(inputs, outputs)
|
||||||
|
>>> # Activity regularization.
|
||||||
|
>>> model.add_loss(tf.abs(tf.reduce_mean(x)))
|
||||||
|
>>> model.losses
|
||||||
|
[<tf.Tensor 'Abs:0' shape=() dtype=float32>]
|
||||||
|
|
||||||
|
>>> inputs = tf.keras.Input(shape=(10,))
|
||||||
|
>>> d = tf.keras.layers.Dense(10, kernel_initializer='ones')
|
||||||
|
>>> x = d(inputs)
|
||||||
|
>>> outputs = tf.keras.layers.Dense(1)(x)
|
||||||
|
>>> model = tf.keras.Model(inputs, outputs)
|
||||||
|
>>> # Weight regularization.
|
||||||
|
>>> model.add_loss(lambda: tf.reduce_mean(d.kernel))
|
||||||
|
>>> model.losses
|
||||||
|
[<tf.Tensor: shape=(), dtype=float32, numpy=1.0>]
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A list of tensors.
|
A list of tensors.
|
||||||
"""
|
"""
|
||||||
@ -1215,11 +1243,12 @@ class Layer(module.Module, version_utils.LayerVersionSelector):
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
inputs = tf.keras.Input(shape=(10,))
|
inputs = tf.keras.Input(shape=(10,))
|
||||||
x = tf.keras.layers.Dense(10)(inputs)
|
d = tf.keras.layers.Dense(10)
|
||||||
|
x = d(inputs)
|
||||||
outputs = tf.keras.layers.Dense(1)(x)
|
outputs = tf.keras.layers.Dense(1)(x)
|
||||||
model = tf.keras.Model(inputs, outputs)
|
model = tf.keras.Model(inputs, outputs)
|
||||||
# Weight regularization.
|
# Weight regularization.
|
||||||
model.add_loss(lambda: tf.reduce_mean(x.kernel))
|
model.add_loss(lambda: tf.reduce_mean(d.kernel))
|
||||||
```
|
```
|
||||||
|
|
||||||
The `get_losses_for` method allows to retrieve the losses relevant to a
|
The `get_losses_for` method allows to retrieve the losses relevant to a
|
||||||
@ -1302,7 +1331,21 @@ class Layer(module.Module, version_utils.LayerVersionSelector):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def metrics(self):
|
def metrics(self):
|
||||||
"""List of `tf.keras.metrics.Metric` instances tracked by the layer."""
|
"""List of metrics added using the `add_metric()` API.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
>>> input = tf.keras.layers.Input(shape=(3,))
|
||||||
|
>>> d = tf.keras.layers.Dense(2)
|
||||||
|
>>> output = d(input)
|
||||||
|
>>> d.add_metric(tf.reduce_max(output), name='max')
|
||||||
|
>>> d.add_metric(tf.reduce_min(output), name='min')
|
||||||
|
>>> [m.name for m in d.metrics]
|
||||||
|
['max', 'min']
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of tensors.
|
||||||
|
"""
|
||||||
collected_metrics = []
|
collected_metrics = []
|
||||||
all_layers = self._gather_unique_layers()
|
all_layers = self._gather_unique_layers()
|
||||||
for layer in all_layers:
|
for layer in all_layers:
|
||||||
@ -1313,6 +1356,48 @@ class Layer(module.Module, version_utils.LayerVersionSelector):
|
|||||||
def add_metric(self, value, name=None, **kwargs):
|
def add_metric(self, value, name=None, **kwargs):
|
||||||
"""Adds metric tensor to the layer.
|
"""Adds metric tensor to the layer.
|
||||||
|
|
||||||
|
This method can be used inside the `call()` method of a subclassed layer
|
||||||
|
or model.
|
||||||
|
|
||||||
|
```python
|
||||||
|
class MyMetricLayer(tf.keras.layers.Layer):
|
||||||
|
def __init__(self):
|
||||||
|
super(MyMetricLayer, self).__init__(name='my_metric_layer')
|
||||||
|
self.mean = metrics_module.Mean(name='metric_1')
|
||||||
|
|
||||||
|
def call(self, inputs):
|
||||||
|
# Provide same name as in the instance created in __init__
|
||||||
|
self.add_metric(self.mean(x), name='metric_1')
|
||||||
|
self.add_metric(math_ops.reduce_sum(x), name='metric_2')
|
||||||
|
return inputs
|
||||||
|
```
|
||||||
|
|
||||||
|
This method can also be called directly on a Functional Model during
|
||||||
|
construction. In this case, any tensor passed to this Model must
|
||||||
|
be symbolic and be able to be traced back to the model's `Input`s. These
|
||||||
|
metrics become part of the model's topology and are tracked when you
|
||||||
|
save the model via `save()`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
inputs = tf.keras.Input(shape=(10,))
|
||||||
|
x = tf.keras.layers.Dense(10)(inputs)
|
||||||
|
outputs = tf.keras.layers.Dense(1)(x)
|
||||||
|
model = tf.keras.Model(inputs, outputs)
|
||||||
|
model.add_metric(math_ops.reduce_sum(x), name='metric_1')
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: Calling `add_metric()` with the result of a metric object on a
|
||||||
|
Functional Model, as shown in the example below, is not supported. This is
|
||||||
|
because we cannot trace the metric result tensor back to the model's inputs.
|
||||||
|
|
||||||
|
```python
|
||||||
|
inputs = tf.keras.Input(shape=(10,))
|
||||||
|
x = tf.keras.layers.Dense(10)(inputs)
|
||||||
|
outputs = tf.keras.layers.Dense(1)(x)
|
||||||
|
model = tf.keras.Model(inputs, outputs)
|
||||||
|
model.add_metric(tf.keras.metrics.Mean()(x), name='metric_1')
|
||||||
|
```
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
value: Metric tensor.
|
value: Metric tensor.
|
||||||
name: String metric name.
|
name: String metric name.
|
||||||
|
@ -397,8 +397,8 @@ class Model(network.Network, version_utils.ModelVersionSelector):
|
|||||||
def metrics(self):
|
def metrics(self):
|
||||||
"""Returns the model's metrics added using `compile`, `add_metric` APIs.
|
"""Returns the model's metrics added using `compile`, `add_metric` APIs.
|
||||||
|
|
||||||
Note: `metrics` are available only after a `keras.Model` has been
|
Note: Metrics passed to `compile()` are available only after a `keras.Model`
|
||||||
trained/evaluated on actual data.
|
has been trained/evaluated on actual data.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
@ -1375,7 +1375,24 @@ class Model(network.Network, version_utils.ModelVersionSelector):
|
|||||||
return tf_utils.to_numpy_or_python_type(all_outputs)
|
return tf_utils.to_numpy_or_python_type(all_outputs)
|
||||||
|
|
||||||
def reset_metrics(self):
|
def reset_metrics(self):
|
||||||
"""Resets the state of metrics."""
|
"""Resets the state of all the metrics in the model.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
>>> inputs = tf.keras.layers.Input(shape=(3,))
|
||||||
|
>>> outputs = tf.keras.layers.Dense(2)(inputs)
|
||||||
|
>>> model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
|
||||||
|
>>> model.compile(optimizer="Adam", loss="mse", metrics=["mae"])
|
||||||
|
|
||||||
|
>>> x = np.random.random((2, 3))
|
||||||
|
>>> y = np.random.randint(0, 2, (2, 2))
|
||||||
|
>>> _ = model.fit(x, y, verbose=0)
|
||||||
|
>>> assert all(float(m.result()) for m in model.metrics)
|
||||||
|
|
||||||
|
>>> model.reset_metrics()
|
||||||
|
>>> assert all(float(m.result()) == 0 for m in model.metrics)
|
||||||
|
|
||||||
|
"""
|
||||||
for m in self.metrics:
|
for m in self.metrics:
|
||||||
m.reset_states()
|
m.reset_states()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user