tf.keras.layers.Lambda
| Просмотреть исходный код на GitHub |
Оборачивает произвольные выражения как объект Layer.
tf.keras.layers.Lambda(
function, output_shape=None, mask=None, arguments=None, **kwargs
)
Слой Lambda существует для того, чтобы произвольные функции TensorFlow можно было использовать при построении моделей Sequential и Functional 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
© 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.4/api_docs/python/tf/keras/layers/Lambda