tf.keras.layers.Lambda
| Просмотреть исходный код на GitHub |
Оборачивает произвольные выражения как объект Layer.
Наследуется от: Layer
tf.keras.layers.Lambda(
function, output_shape=None, mask=None, arguments=None, **kwargs
)
Слой Lambda существует для того, чтобы произвольные функции TensorFlow можно было использовать при построении моделей Sequential и функционального API. Lambda слои лучше всего подходят для простых операций или быстрых экспериментов. Для более сложных случаев используйте это руководство для наследования от tf.keras.layers.Layer.
Основная причина наследования от tf.keras.layers.Layer вместо использования слоя Lambda — это сохранение и инспектирование модели. Lambda слои сохраняются путем сериализации байткода Python, в то время как наследовавшиеся слои можно сохранить, переопределив метод get_config. Переопределение 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
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/keras/layers/Lambda