tf.keras.layers.Lambda
| Просмотреть исходный код на GitHub |
Оборачивает произвольные выражения как объект Layer.
tf.keras.layers.Lambda(
function, output_shape=None, mask=None, arguments=None, **kwargs
)
Слои Lambda существуют для того, чтобы произвольные выражения можно было использовать в качестве Layer при построении моделей Sequential и функционального API. Lambda слои лучше всего подходят для простых операций или быстрых экспериментов. Для более сложных случаев используйте это руководство для наследования от tf.keras.layers.Layer.
Основная причина использования наследования от tf.keras.layers.Layer вместо Lambda слоев заключается в сохранении и инспектировании модели. Lambda слои сохраняются путем сериализации байт-кода Python, что по своей природе не переносимо. Их следует загружать только в той же среде, где они были сохранены. Наследуемые слои можно сохранить более переносимым способом, переопределяя метод get_config. Модели, которые полагаются на наследуемые слои, также часто проще визуализировать и понять.
Примеры:
# add a x -> x^2 layer model.add(Lambda(lambda x: x ** 2))
# add a layer that returns the concatenation
# of the positive part of the input and
# the opposite of the negative part
def antirectifier(x):
x -= K.mean(x, axis=1, keepdims=True)
x = K.l2_normalize(x, axis=1)
pos = K.relu(x)
neg = K.relu(-x)
return K.concatenate([pos, neg], axis=1)
model.add(Lambda(antirectifier))
Переменные:
Хотя использование переменных со слоями Lambda возможно, эта практика не рекомендуется, так как она может легко привести к ошибкам. Например, рассмотрите следующий слой:
scale = tf.Variable(1.) scale_layer = tf.keras.layers.Lambda(lambda x: x * scale)
Поскольку слой scale_layer не отслеживает переменную scale, она не будет отображаться в scale_layer.trainable_weights и, следовательно, не будет обучаться, если scale_layer используется в модели.
Более подходящий подход — создание наследуемого слоя:
class ScaleLayer(tf.keras.layers.Layer):
def __init__(self):
super(ScaleLayer, self).__init__()
self.scale = tf.Variable(1.)
def call(self, inputs):
return inputs * self.scale
В общем случае слои Lambda могут быть удобны для простых бессостоятельных вычислений, но для более сложных случаев следует использовать наследуемый слой.
| Аргументы | |
|---|---|
function | Функция, которая должна быть вычислена. Принимает входной тензор в качестве первого аргумента. |
output_shape | Ожидаемая форма выходного значения из функции. Этот аргумент можно вывести, если он не указан явно. Может быть кортежем или функцией. Если кортежем, он указывает только размерность с первого измерения и далее; размерность выборки предполагается такой же, как входная: output_shape = (input_shape[0], ) + output_shape или, вход является None, и размерность выборки также None: output_shape = (None, ) + output_shape Если функцией, она указывает полную форму в виде функции от формы входных данных: output_shape = f(input_shape) |
mask | Либо None (указывающий отсутствие маскирования), либо вызываемая функция с таким же сигнатура, как у метода compute_mask слоя, или тензор, который будет возвращён как маска независимо от ввода. |
arguments | Необязательный словарь ключевых аргументов, которые должны быть переданы в функцию. |
Входная форма: произвольная. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включая ось образцов) при использовании этого слоя в качестве первого слоя в модели. Выходная форма: Указывается аргументом output_shape
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/keras/layers/Lambda