Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/tensorflow/python/keras/activations.py: 60%
104 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
1# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# ==============================================================================
15"""Built-in activation functions."""
17from tensorflow.python.keras import backend
18from tensorflow.python.keras.layers import advanced_activations
19from tensorflow.python.keras.utils.generic_utils import deserialize_keras_object
20from tensorflow.python.keras.utils.generic_utils import serialize_keras_object
21from tensorflow.python.ops import math_ops
22from tensorflow.python.ops import nn
23from tensorflow.python.util import dispatch
24from tensorflow.python.util.tf_export import keras_export
26# b/123041942
27# In TF 2.x, if the `tf.nn.softmax` is used as an activation function in Keras
28# layers, it gets serialized as 'softmax_v2' instead of 'softmax' as the
29# internal method name is returned in serialization. This results in errors in
30# model exporting and loading as Keras can't find any activation function with
31# the name of `softmax_v2`.
32# This dict maps the activation function name from its v2 version to its
33# canonical name.
34_TF_ACTIVATIONS_V2 = {
35 'softmax_v2': 'softmax',
36}
39@keras_export('keras.activations.softmax')
40@dispatch.add_dispatch_support
41def softmax(x, axis=-1):
42 """Softmax converts a vector of values to a probability distribution.
44 The elements of the output vector are in range (0, 1) and sum to 1.
46 Each vector is handled independently. The `axis` argument sets which axis
47 of the input the function is applied along.
49 Softmax is often used as the activation for the last
50 layer of a classification network because the result could be interpreted as
51 a probability distribution.
53 The softmax of each vector x is computed as
54 `exp(x) / tf.reduce_sum(exp(x))`.
56 The input values in are the log-odds of the resulting probability.
58 Args:
59 x : Input tensor.
60 axis: Integer, axis along which the softmax normalization is applied.
62 Returns:
63 Tensor, output of softmax transformation (all values are non-negative
64 and sum to 1).
66 Examples:
68 **Example 1: standalone usage**
70 >>> inputs = tf.random.normal(shape=(32, 10))
71 >>> outputs = tf.keras.activations.softmax(inputs)
72 >>> tf.reduce_sum(outputs[0, :]) # Each sample in the batch now sums to 1
73 <tf.Tensor: shape=(), dtype=float32, numpy=1.0000001>
75 **Example 2: usage in a `Dense` layer**
77 >>> layer = tf.keras.layers.Dense(32, activation=tf.keras.activations.softmax)
78 """
79 if x.shape.rank > 1:
80 if isinstance(axis, int):
81 output = nn.softmax(x, axis=axis)
82 else:
83 # nn.softmax does not support tuple axis.
84 e = math_ops.exp(x - math_ops.reduce_max(x, axis=axis, keepdims=True))
85 s = math_ops.reduce_sum(e, axis=axis, keepdims=True)
86 output = e / s
87 else:
88 raise ValueError('Cannot apply softmax to a tensor that is 1D. '
89 'Received input: %s' % (x,))
91 # Cache the logits to use for crossentropy loss.
92 output._keras_logits = x # pylint: disable=protected-access
93 return output
96@keras_export('keras.activations.elu')
97@dispatch.add_dispatch_support
98def elu(x, alpha=1.0):
99 """Exponential Linear Unit.
101 The exponential linear unit (ELU) with `alpha > 0` is:
102 `x` if `x > 0` and
103 `alpha * (exp(x) - 1)` if `x < 0`
104 The ELU hyperparameter `alpha` controls the value to which an
105 ELU saturates for negative net inputs. ELUs diminish the
106 vanishing gradient effect.
108 ELUs have negative values which pushes the mean of the activations
109 closer to zero.
110 Mean activations that are closer to zero enable faster learning as they
111 bring the gradient closer to the natural gradient.
112 ELUs saturate to a negative value when the argument gets smaller.
113 Saturation means a small derivative which decreases the variation
114 and the information that is propagated to the next layer.
116 Example Usage:
118 >>> import tensorflow as tf
119 >>> model = tf.keras.Sequential()
120 >>> model.add(tf.keras.layers.Conv2D(32, (3, 3), activation='elu',
121 ... input_shape=(28, 28, 1)))
122 >>> model.add(tf.keras.layers.MaxPooling2D((2, 2)))
123 >>> model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='elu'))
124 >>> model.add(tf.keras.layers.MaxPooling2D((2, 2)))
125 >>> model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='elu'))
127 <tensorflow.python.keras.engine.sequential.Sequential object ...>
129 Args:
130 x: Input tensor.
131 alpha: A scalar, slope of negative section. `alpha` controls the value to
132 which an ELU saturates for negative net inputs.
134 Returns:
135 The exponential linear unit (ELU) activation function: `x` if `x > 0` and
136 `alpha * (exp(x) - 1)` if `x < 0`.
139 Reference:
140 [Fast and Accurate Deep Network Learning by Exponential Linear Units
141 (ELUs) (Clevert et al, 2016)](https://arxiv.org/abs/1511.07289)
142 """
143 return backend.elu(x, alpha)
146@keras_export('keras.activations.selu')
147@dispatch.add_dispatch_support
148def selu(x):
149 """Scaled Exponential Linear Unit (SELU).
151 The Scaled Exponential Linear Unit (SELU) activation function is defined as:
153 - `if x > 0: return scale * x`
154 - `if x < 0: return scale * alpha * (exp(x) - 1)`
156 where `alpha` and `scale` are pre-defined constants
157 (`alpha=1.67326324` and `scale=1.05070098`).
159 Basically, the SELU activation function multiplies `scale` (> 1) with the
160 output of the `tf.keras.activations.elu` function to ensure a slope larger
161 than one for positive inputs.
163 The values of `alpha` and `scale` are
164 chosen so that the mean and variance of the inputs are preserved
165 between two consecutive layers as long as the weights are initialized
166 correctly (see `tf.keras.initializers.LecunNormal` initializer)
167 and the number of input units is "large enough"
168 (see reference paper for more information).
170 Example Usage:
172 >>> num_classes = 10 # 10-class problem
173 >>> model = tf.keras.Sequential()
174 >>> model.add(tf.keras.layers.Dense(64, kernel_initializer='lecun_normal',
175 ... activation='selu'))
176 >>> model.add(tf.keras.layers.Dense(32, kernel_initializer='lecun_normal',
177 ... activation='selu'))
178 >>> model.add(tf.keras.layers.Dense(16, kernel_initializer='lecun_normal',
179 ... activation='selu'))
180 >>> model.add(tf.keras.layers.Dense(num_classes, activation='softmax'))
182 Args:
183 x: A tensor or variable to compute the activation function for.
185 Returns:
186 The scaled exponential unit activation: `scale * elu(x, alpha)`.
188 Notes:
189 - To be used together with the
190 `tf.keras.initializers.LecunNormal` initializer.
191 - To be used together with the dropout variant
192 `tf.keras.layers.AlphaDropout` (not regular dropout).
194 References:
195 - [Klambauer et al., 2017](https://arxiv.org/abs/1706.02515)
196 """
197 return nn.selu(x)
200@keras_export('keras.activations.softplus')
201@dispatch.add_dispatch_support
202def softplus(x):
203 """Softplus activation function, `softplus(x) = log(exp(x) + 1)`.
205 Example Usage:
207 >>> a = tf.constant([-20, -1.0, 0.0, 1.0, 20], dtype = tf.float32)
208 >>> b = tf.keras.activations.softplus(a)
209 >>> b.numpy()
210 array([2.0611537e-09, 3.1326166e-01, 6.9314718e-01, 1.3132616e+00,
211 2.0000000e+01], dtype=float32)
213 Args:
214 x: Input tensor.
216 Returns:
217 The softplus activation: `log(exp(x) + 1)`.
218 """
219 return math_ops.softplus(x)
222@keras_export('keras.activations.softsign')
223@dispatch.add_dispatch_support
224def softsign(x):
225 """Softsign activation function, `softsign(x) = x / (abs(x) + 1)`.
227 Example Usage:
229 >>> a = tf.constant([-1.0, 0.0, 1.0], dtype = tf.float32)
230 >>> b = tf.keras.activations.softsign(a)
231 >>> b.numpy()
232 array([-0.5, 0. , 0.5], dtype=float32)
234 Args:
235 x: Input tensor.
237 Returns:
238 The softsign activation: `x / (abs(x) + 1)`.
239 """
240 return nn.softsign(x)
243@keras_export('keras.activations.swish')
244@dispatch.add_dispatch_support
245def swish(x):
246 """Swish activation function, `swish(x) = x * sigmoid(x)`.
248 Swish activation function which returns `x*sigmoid(x)`.
249 It is a smooth, non-monotonic function that consistently matches
250 or outperforms ReLU on deep networks, it is unbounded above and
251 bounded below.
254 Example Usage:
256 >>> a = tf.constant([-20, -1.0, 0.0, 1.0, 20], dtype = tf.float32)
257 >>> b = tf.keras.activations.swish(a)
258 >>> b.numpy()
259 array([-4.1223075e-08, -2.6894143e-01, 0.0000000e+00, 7.3105860e-01,
260 2.0000000e+01], dtype=float32)
262 Args:
263 x: Input tensor.
265 Returns:
266 The swish activation applied to `x` (see reference paper for details).
268 Reference:
269 - [Ramachandran et al., 2017](https://arxiv.org/abs/1710.05941)
270 """
271 return nn.swish(x)
274@keras_export('keras.activations.relu')
275@dispatch.add_dispatch_support
276def relu(x, alpha=0., max_value=None, threshold=0):
277 """Applies the rectified linear unit activation function.
279 With default values, this returns the standard ReLU activation:
280 `max(x, 0)`, the element-wise maximum of 0 and the input tensor.
282 Modifying default parameters allows you to use non-zero thresholds,
283 change the max value of the activation,
284 and to use a non-zero multiple of the input for values below the threshold.
286 For example:
288 >>> foo = tf.constant([-10, -5, 0.0, 5, 10], dtype = tf.float32)
289 >>> tf.keras.activations.relu(foo).numpy()
290 array([ 0., 0., 0., 5., 10.], dtype=float32)
291 >>> tf.keras.activations.relu(foo, alpha=0.5).numpy()
292 array([-5. , -2.5, 0. , 5. , 10. ], dtype=float32)
293 >>> tf.keras.activations.relu(foo, max_value=5).numpy()
294 array([0., 0., 0., 5., 5.], dtype=float32)
295 >>> tf.keras.activations.relu(foo, threshold=5).numpy()
296 array([-0., -0., 0., 0., 10.], dtype=float32)
298 Args:
299 x: Input `tensor` or `variable`.
300 alpha: A `float` that governs the slope for values lower than the
301 threshold.
302 max_value: A `float` that sets the saturation threshold (the largest value
303 the function will return).
304 threshold: A `float` giving the threshold value of the activation function
305 below which values will be damped or set to zero.
307 Returns:
308 A `Tensor` representing the input tensor,
309 transformed by the relu activation function.
310 Tensor will be of the same shape and dtype of input `x`.
311 """
312 return backend.relu(x, alpha=alpha, max_value=max_value, threshold=threshold)
315@keras_export('keras.activations.gelu', v1=[])
316@dispatch.add_dispatch_support
317def gelu(x, approximate=False):
318 """Applies the Gaussian error linear unit (GELU) activation function.
320 Gaussian error linear unit (GELU) computes
321 `x * P(X <= x)`, where `P(X) ~ N(0, 1)`.
322 The (GELU) nonlinearity weights inputs by their value, rather than gates
323 inputs by their sign as in ReLU.
325 For example:
327 >>> x = tf.constant([-3.0, -1.0, 0.0, 1.0, 3.0], dtype=tf.float32)
328 >>> y = tf.keras.activations.gelu(x)
329 >>> y.numpy()
330 array([-0.00404951, -0.15865529, 0. , 0.8413447 , 2.9959507 ],
331 dtype=float32)
332 >>> y = tf.keras.activations.gelu(x, approximate=True)
333 >>> y.numpy()
334 array([-0.00363752, -0.15880796, 0. , 0.841192 , 2.9963627 ],
335 dtype=float32)
337 Args:
338 x: Input tensor.
339 approximate: A `bool`, whether to enable approximation.
341 Returns:
342 The gaussian error linear activation:
343 `0.5 * x * (1 + tanh(sqrt(2 / pi) * (x + 0.044715 * x^3)))`
344 if `approximate` is `True` or
345 `x * P(X <= x) = 0.5 * x * (1 + erf(x / sqrt(2)))`,
346 where `P(X) ~ N(0, 1)`,
347 if `approximate` is `False`.
349 Reference:
350 - [Gaussian Error Linear Units (GELUs)](https://arxiv.org/abs/1606.08415)
351 """
352 return nn.gelu(x, approximate)
355@keras_export('keras.activations.tanh')
356@dispatch.add_dispatch_support
357def tanh(x):
358 """Hyperbolic tangent activation function.
360 For example:
362 >>> a = tf.constant([-3.0,-1.0, 0.0,1.0,3.0], dtype = tf.float32)
363 >>> b = tf.keras.activations.tanh(a)
364 >>> b.numpy()
365 array([-0.9950547, -0.7615942, 0., 0.7615942, 0.9950547], dtype=float32)
367 Args:
368 x: Input tensor.
370 Returns:
371 Tensor of same shape and dtype of input `x`, with tanh activation:
372 `tanh(x) = sinh(x)/cosh(x) = ((exp(x) - exp(-x))/(exp(x) + exp(-x)))`.
373 """
374 return nn.tanh(x)
377@keras_export('keras.activations.sigmoid')
378@dispatch.add_dispatch_support
379def sigmoid(x):
380 """Sigmoid activation function, `sigmoid(x) = 1 / (1 + exp(-x))`.
382 Applies the sigmoid activation function. For small values (<-5),
383 `sigmoid` returns a value close to zero, and for large values (>5)
384 the result of the function gets close to 1.
386 Sigmoid is equivalent to a 2-element Softmax, where the second element is
387 assumed to be zero. The sigmoid function always returns a value between
388 0 and 1.
390 For example:
392 >>> a = tf.constant([-20, -1.0, 0.0, 1.0, 20], dtype = tf.float32)
393 >>> b = tf.keras.activations.sigmoid(a)
394 >>> b.numpy()
395 array([2.0611537e-09, 2.6894143e-01, 5.0000000e-01, 7.3105860e-01,
396 1.0000000e+00], dtype=float32)
398 Args:
399 x: Input tensor.
401 Returns:
402 Tensor with the sigmoid activation: `1 / (1 + exp(-x))`.
403 """
404 output = nn.sigmoid(x)
405 # Cache the logits to use for crossentropy loss.
406 output._keras_logits = x # pylint: disable=protected-access
407 return output
410@keras_export('keras.activations.exponential')
411@dispatch.add_dispatch_support
412def exponential(x):
413 """Exponential activation function.
415 For example:
417 >>> a = tf.constant([-3.0,-1.0, 0.0,1.0,3.0], dtype = tf.float32)
418 >>> b = tf.keras.activations.exponential(a)
419 >>> b.numpy()
420 array([0.04978707, 0.36787945, 1., 2.7182817 , 20.085537], dtype=float32)
422 Args:
423 x: Input tensor.
425 Returns:
426 Tensor with exponential activation: `exp(x)`.
427 """
428 return math_ops.exp(x)
431@keras_export('keras.activations.hard_sigmoid')
432@dispatch.add_dispatch_support
433def hard_sigmoid(x):
434 """Hard sigmoid activation function.
436 A faster approximation of the sigmoid activation.
437 Piecewise linear approximation of the sigmoid function.
438 Ref: 'https://en.wikipedia.org/wiki/Hard_sigmoid'
440 For example:
442 >>> a = tf.constant([-3.0,-1.0, 0.0,1.0,3.0], dtype = tf.float32)
443 >>> b = tf.keras.activations.hard_sigmoid(a)
444 >>> b.numpy()
445 array([0. , 0.3, 0.5, 0.7, 1. ], dtype=float32)
447 Args:
448 x: Input tensor.
450 Returns:
451 The hard sigmoid activation, defined as:
453 - `if x < -2.5: return 0`
454 - `if x > 2.5: return 1`
455 - `if -2.5 <= x <= 2.5: return 0.2 * x + 0.5`
456 """
457 return backend.hard_sigmoid(x)
460@keras_export('keras.activations.linear')
461@dispatch.add_dispatch_support
462def linear(x):
463 """Linear activation function (pass-through).
465 For example:
467 >>> a = tf.constant([-3.0,-1.0, 0.0,1.0,3.0], dtype = tf.float32)
468 >>> b = tf.keras.activations.linear(a)
469 >>> b.numpy()
470 array([-3., -1., 0., 1., 3.], dtype=float32)
472 Args:
473 x: Input tensor.
475 Returns:
476 The input, unmodified.
477 """
478 return x
481@keras_export('keras.activations.serialize')
482@dispatch.add_dispatch_support
483def serialize(activation):
484 """Returns the string identifier of an activation function.
486 Args:
487 activation : Function object.
489 Returns:
490 String denoting the name attribute of the input function
492 For example:
494 >>> tf.keras.activations.serialize(tf.keras.activations.tanh)
495 'tanh'
496 >>> tf.keras.activations.serialize(tf.keras.activations.sigmoid)
497 'sigmoid'
498 >>> tf.keras.activations.serialize('abcd')
499 Traceback (most recent call last):
500 ...
501 ValueError: ('Cannot serialize', 'abcd')
503 Raises:
504 ValueError: The input function is not a valid one.
505 """
506 if (hasattr(activation, '__name__') and
507 activation.__name__ in _TF_ACTIVATIONS_V2):
508 return _TF_ACTIVATIONS_V2[activation.__name__]
509 return serialize_keras_object(activation)
512# Add additional globals so that deserialize can find these common activation
513# functions
514leaky_relu = nn.leaky_relu
515log_softmax = nn.log_softmax
516relu6 = nn.relu6
517silu = nn.swish
520@keras_export('keras.activations.deserialize')
521@dispatch.add_dispatch_support
522def deserialize(name, custom_objects=None):
523 """Returns activation function given a string identifier.
525 Args:
526 name: The name of the activation function.
527 custom_objects: Optional `{function_name: function_obj}`
528 dictionary listing user-provided activation functions.
530 Returns:
531 Corresponding activation function.
533 For example:
535 >>> tf.keras.activations.deserialize('linear')
536 <function linear at 0x1239596a8>
537 >>> tf.keras.activations.deserialize('sigmoid')
538 <function sigmoid at 0x123959510>
539 >>> tf.keras.activations.deserialize('abcd')
540 Traceback (most recent call last):
541 ...
542 ValueError: Unknown activation function:abcd
544 Raises:
545 ValueError: `Unknown activation function` if the input string does not
546 denote any defined Tensorflow activation function.
547 """
548 globs = globals()
550 # only replace missing activations
551 advanced_activations_globs = advanced_activations.get_globals()
552 for key, val in advanced_activations_globs.items():
553 if key not in globs:
554 globs[key] = val
556 return deserialize_keras_object(
557 name,
558 module_objects=globs,
559 custom_objects=custom_objects,
560 printable_module_name='activation function')
563@keras_export('keras.activations.get')
564@dispatch.add_dispatch_support
565def get(identifier):
566 """Returns function.
568 Args:
569 identifier: Function or string
571 Returns:
572 Function corresponding to the input string or input function.
574 For example:
576 >>> tf.keras.activations.get('softmax')
577 <function softmax at 0x1222a3d90>
578 >>> tf.keras.activations.get(tf.keras.activations.softmax)
579 <function softmax at 0x1222a3d90>
580 >>> tf.keras.activations.get(None)
581 <function linear at 0x1239596a8>
582 >>> tf.keras.activations.get(abs)
583 <built-in function abs>
584 >>> tf.keras.activations.get('abcd')
585 Traceback (most recent call last):
586 ...
587 ValueError: Unknown activation function:abcd
589 Raises:
590 ValueError: Input is an unknown function or string, i.e., the input does
591 not denote any defined function.
592 """
593 if identifier is None:
594 return linear
595 if isinstance(identifier, str):
596 identifier = str(identifier)
597 return deserialize(identifier)
598 elif isinstance(identifier, dict):
599 return deserialize(identifier)
600 elif callable(identifier):
601 return identifier
602 else:
603 raise TypeError(
604 'Could not interpret activation function identifier: {}'.format(
605 identifier))