tf.keras.layers.Layer
| Просмотреть исходный код на GitHub |
Это класс, от которого наследуются все слои.
Наследуется от: Module
tf.keras.layers.Layer(
trainable=True, name=None, dtype=None, dynamic=False, **kwargs
)
Слой — это вызываемый объект, который принимает на вход один или несколько тензоров и возвращает один или несколько тензоров. Он включает в себя вычисления, определённые в методе call(), и состояние (переменные весов), определённые либо в конструкторе __init__(), либо в методе build().
Пользователи просто инициализируют слой и затем используют его как вызываемый объект.
| Аргументы | |
|---|---|
trainable | Булево значение, указывающее, должны ли переменные слоя быть обучаемыми. |
name | Строковое имя слоя. |
dtype | Тип данных вычислений и весов слоя. Также может быть tf.keras.mixed_precision.Policy, что позволяет использовать разные типы данных для вычислений и весов. Значение по умолчанию None означает использование tf.keras.mixed_precision.global_policy(), которое является политикой float32, если не задано иное. |
dynamic | Установите это значение в True, если ваш слой должен выполняться только в режиме eager и не должен использоваться для генерации статической вычислительной графы. Это будет необходимо для Tree-RNN или рекурсивных сетей, например, или для любого слоя, который манипулирует тензорами с помощью потоков управления Python. Если False, предполагается, что слой может безопасно использоваться для генерации статической вычислительной графы. |
Рекомендуется, чтобы потомки Layer реализовывали следующие методы:
-
__init__(): Определяет пользовательские атрибуты слоя и создаёт переменные состояния слоя, которые не зависят от формы входных данных, используяadd_weight(). -
build(self, input_shape): Этот метод может использоваться для создания весов, которые зависят от формы входных данных, используяadd_weight().__call__()автоматически построит слой (если он ещё не построен), вызвавbuild(). -
call(self, *args, **kwargs): Вызывается в__call__после того, как будет гарантировано, чтоbuild()был вызван.call()выполняет логику применения слоя к входным тензорам (которые должны передаваться как аргументы). Два зарезервированных ключевых аргумента, которые вы можете использовать по желанию вcall(), это:-
training(булево значение, указывающее, находится ли вызов в режиме предсказания или обучения) -
mask(булевый тензор, кодирующий замаскированные временные шаги на входе, используемый в слоях RNN)
-
-
get_config(self): Возвращает словарь, содержащий конфигурацию, используемую для инициализации этого слоя. Если ключи отличаются от аргументов в__init__, тогда переопределите такжеfrom_config(self). Этот метод используется при сохранении слоя или модели, содержащей этот слой.
Примеры:
Вот базовый пример: слой с двумя переменными, w и b, возвращающий y = w . x + b. Он демонстрирует, как реализовать build() и call(). Переменные, установленные в качестве атрибутов слоя, отслеживаются как веса слоёв (в layer.weights).
class SimpleDense(Layer):
def __init__(self, units=32):
super(SimpleDense, self).__init__()
self.units = units
def build(self, input_shape): # Create the state of the layer (weights)
w_init = tf.random_normal_initializer()
self.w = tf.Variable(
initial_value=w_init(shape=(input_shape[-1], self.units),
dtype='float32'),
trainable=True)
b_init = tf.zeros_initializer()
self.b = tf.Variable(
initial_value=b_init(shape=(self.units,), dtype='float32'),
trainable=True)
def call(self, inputs): # Defines the computation from inputs to outputs
return tf.matmul(inputs, self.w) + self.b
# Instantiates the layer.
linear_layer = SimpleDense(4)
# This will also call `build(input_shape)` and create the weights.
y = linear_layer(tf.ones((2, 2)))
assert len(linear_layer.weights) == 2
# These weights are trainable, so they're listed in `trainable_weights`:
assert len(linear_layer.trainable_weights) == 2
Обратите внимание, что метод add_weight() предлагает сокращённый способ создания весов:
class SimpleDense(Layer):
def __init__(self, units=32):
super(SimpleDense, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(shape=(input_shape[-1], self.units),
initializer='random_normal',
trainable=True)
self.b = self.add_weight(shape=(self.units,),
initializer='random_normal',
trainable=True)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
Помимо обучаемых весов, обновляемых во время обучения с помощью обратного распространения, слои также могут иметь необучаемые веса. Эти веса предназначены для ручного обновления во время call(). Вот пример слоя, вычисляющего текущую сумму своих входов:
class ComputeSum(Layer):
def __init__(self, input_dim):
super(ComputeSum, self).__init__()
# Create a non-trainable weight.
self.total = tf.Variable(initial_value=tf.zeros((input_dim,)),
trainable=False)
def call(self, inputs):
self.total.assign_add(tf.reduce_sum(inputs, axis=0))
return self.total
my_sum = ComputeSum(2)
x = tf.ones((2, 2))
y = my_sum(x)
print(y.numpy()) # [2. 2.]
y = my_sum(x)
print(y.numpy()) # [4. 4.]
assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []
Для получения дополнительной информации о создании слоёв см. руководство Создание пользовательских слоёв и моделей с помощью Keras
| Атрибуты | |
|---|---|
name | Имя слоя (строка). |
dtype | Тип данных весов слоя. |
variable_dtype | Псевдоним dtype. |
compute_dtype | Тип данных вычислений слоя. Слои автоматически преобразуют входные данные в этот тип данных, что приводит к тому, что вычисления и вывод также будут иметь этот тип данных. При использовании смешанной точности с tf.keras.mixed_precision.Policy это будет отличаться от variable_dtype. |
dtype_policy | Политика типа данных слоя. См. документацию по tf.keras.mixed_precision.Policy для получения подробностей. |
trainable_weights | Список переменных, которые необходимо включить в обратное распространение. |
non_trainable_weights | Список переменных, которые не должны включаться в обратное распространение. |
weights | Объединение списков trainable_weights и non_trainable_weights (в этом порядке). |
trainable | Следует ли обучать слой (булево значение), т.е. должны ли его потенциально-обучаемые веса возвращаться как часть layer.trainable_weights. |
input_spec | Необязательный(ые) объект(ы) ограничения на входные данные, которые может принять слой. |
activity_regularizer | Необязательная функция регуляризации для вывода этого слоя. |
dynamic | Является ли слой динамическим (только eager); задаётся в конструкторе. |
input | Извлекает тензор(ы) входных данных слоя. Применимо только если у слоя ровно один вход, т.е. если он соединён с одним входящим слоем. |
losses | Список потерь, добавленных с помощью API add_loss(). Тензоры регуляризации переменных создаются при обращении к этому свойству, поэтому оно является безопасным для режима eager: обращение к
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. len(model.losses) 0 model.add_loss(tf.abs(tf.reduce_mean(x))) len(model.losses) 1 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>] |
metrics | Список метрик, добавленных с помощью API add_metric(). 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'] |
output | Извлекает тензор(ы) выходных данных слоя. Применимо только если у слоя ровно один выход, т.е. если он соединён с одним входящим слоем. |
supports_masking | Поддерживает ли этот слой вычисление маски с помощью compute_mask. |
Методы
add_loss
add_loss(
losses, **kwargs
)
Добавляет тензор(ы) потерь, потенциально зависящие от входных данных слоя.
Некоторые потери (например, потери регуляризации активности) могут зависеть от входных данных, передаваемых при вызове слоя. Следовательно, при повторном использовании одного и того же слоя с разными входными данными a и b, некоторые элементы в layer.losses могут зависеть от a, а некоторые — от b. Этот метод автоматически отслеживает зависимости.
Этот метод может использоваться внутри функции call подклассированного слоя или модели, в этом случае losses должен быть тензором или списком тензоров.
Пример:
class MyLayer(tf.keras.layers.Layer):
def call(self, inputs):
self.add_loss(tf.abs(tf.reduce_mean(inputs)))
return inputs
Этот метод также может быть вызван напрямую на функциональной модели во время её построения. В этом случае любые тензоры потерь, переданные этой модели, должны быть символьными и должны быть прослеживаемы до входных данных модели Input. Эти потери становятся частью топологии модели и отслеживаются в get_config.
Пример:
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)))
Если это не так для ваших потерь (если, например, ваши потери ссылаются на Variable одного из слоёв модели), вы можете обернуть ваши потери в лямбду без аргументов. Эти потери не отслеживаются как часть топологии модели, поскольку они не могут быть сериализованы.
Пример:
inputs = tf.keras.Input(shape=(10,)) d = tf.keras.layers.Dense(10) 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))
| Аргументы | |
|---|---|
losses | Тензор потерь или список/кортеж тензоров. Вместо тензоров потери также могут быть вызываемыми объектами без аргументов, которые создают тензор потерь. |
**kwargs | Дополнительные ключевые аргументы для обратной совместимости. Допускаемые значения: inputs — устарело, будет автоматически выведено. |
add_metric
add_metric(
value, name=None, **kwargs
)
Добавляет метрический тензор в слой.
Этот метод может использоваться внутри метода call() подклассированного слоя или модели.
class MyMetricLayer(tf.keras.layers.Layer):
def __init__(self):
super(MyMetricLayer, self).__init__(name='my_metric_layer')
self.mean = tf.keras.metrics.Mean(name='metric_1')
def call(self, inputs):
self.add_metric(self.mean(x))
self.add_metric(tf.reduce_sum(x), name='metric_2')
return inputs
Этот метод также может быть вызван напрямую на функциональной модели во время её построения. В этом случае любой тензор, переданный этой модели, должен быть символьным и должен быть прослеживаем до входных данных модели Input. Эти метрики становятся частью топологии модели и отслеживаются при сохранении модели с помощью save().
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')
Примечание: Вызов add_metric() с результатом объекта метрики на функциональной модели, как показано в примере ниже, не поддерживается. Это связано с тем, что мы не можем проследить тензор результата метрики до входных данных модели.
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')
| Аргументы | |
|---|---|
value | Тензор метрики. |
name | Имя метрики. |
**kwargs | Дополнительные ключевые аргументы для обратной совместимости. Допустимые значения: aggregation — Если тензор value не является результатом вызова экземпляра keras.Metric, он будет агрегирован по умолчанию с помощью keras.Metric.Mean. |
add_weight
add_weight(
name=None, shape=None, dtype=None, initializer=None, regularizer=None,
trainable=None, constraint=None, use_resource=None,
synchronization=tf.VariableSynchronization.AUTO,
aggregation=tf.compat.v1.VariableAggregation.NONE, **kwargs
)
Добавляет новую переменную в слой.
| Аргументы | |
|---|---|
name | Имя переменной. |
shape | Форма переменной. По умолчанию скаляр, если не указано другое. |
dtype | Тип переменной. По умолчанию self.dtype. |
initializer | Экземпляр инициализатора (вызываемая функция). |
regularizer | Экземпляр регуляризатора (вызываемая функция). |
trainable | Булево значение, указывает, должна ли переменная входить в "trainable_variables" слоя (например, переменные, смещения) или "non_trainable_variables" (например, среднее и дисперсия BatchNorm). Обратите внимание, что trainable не может быть True, если synchronization установлено в ON_READ. |
constraint | Экземпляр ограничения (вызываемая функция). |
use_resource | Использовать ли ResourceVariable? |
synchronization | Указывает, когда распределённая переменная будет агрегирована. Допустимые значения — константы, определённые в классе tf.VariableSynchronization. По умолчанию синхронизация установлена в AUTO, и текущий DistributionStrategy выбирает, когда синхронизироваться. Если synchronization установлено в ON_READ, trainable не должно быть установлено в True. |
aggregation | Указывает, как распределённая переменная будет агрегирована. Допустимые значения — константы, определённые в классе tf.VariableAggregation. |
**kwargs | Дополнительные ключевые аргументы. Допустимые значения — getter, collections, experimental_autocast и caching_device. |
| Возвращаемое значение | |
|---|---|
| Созданная переменная. |
| Исключения | |
|---|---|
ValueError | При указании недопустимого типа данных без инициализатора или при установлении trainable в True с синхронизацией, установленной как ON_READ. |
build
build(
input_shape
)
Создаёт переменные слоя (необязательно, для реализации подклассов).
Это метод, который подклассы Layer или Model могут переопределить, если им требуется шаг создания состояния между созданием слоя и вызовом слоя.
Обычно используется для создания весов подклассов Layer.
| Аргументы | |
|---|---|
input_shape | Экземпляр TensorShape, или список экземпляров TensorShape, если слой ожидает список входных данных (по одному экземпляру на каждый вход). |
call
call(
inputs, **kwargs
)
Здесь находится логика слоя.
Обратите внимание, что метод call() в tf.keras немного отличается от API keras. В API keras вы можете передать поддержку маскирования для слоёв как дополнительные аргументы. В то время как tf.keras имеет метод compute_mask() для поддержки маскирования.
| Аргументы | |
|---|---|
inputs | Входной тензор или список/кортеж входных тензоров. |
**kwargs | Дополнительные ключевые аргументы. В настоящее время не используются. |
| Возвращаемое значение | |
|---|---|
| Тензор или список/кортеж тензоров. |
compute_mask
compute_mask(
inputs, mask=None
)
Вычисляет тензор маски выходных данных.
| Аргументы | |
|---|---|
inputs | Тензор или список тензоров. |
mask | Тензор или список тензоров. |
| Возвращаемое значение | |
|---|---|
| None или тензор (или список тензоров, по одному на каждый выходной тензор слоя). |
compute_output_shape
compute_output_shape(
input_shape
)
Вычисляет форму выходного тензора слоя.
Если слой еще не построен, этот метод вызовет build для слоя. Это предполагает, что слой впоследствии будет использован с входными данными, соответствующими указанной здесь форме входа.
| Аргументы | |
|---|---|
input_shape | Кортеж формы (кортеж целых чисел) или список кортежей формы (по одному для каждого выходного тензора слоя). Кортежи формы могут содержать None для свободных измерений вместо целого числа. |
| Возвращает | |
|---|---|
| Кортеж формы входа. |
compute_output_signature
compute_output_signature(
input_signature
)
Вычисляет форму выходного тензора слоя на основе входных данных.
В отличие от объекта TensorShape, объект TensorSpec содержит как информацию о форме, так и о типе данных для тензора. Этот метод позволяет слоям предоставлять информацию о типе данных вывода, если она отличается от типа данных входа. Для любого слоя, который не реализует эту функцию, фреймворк будет использовать compute_output_shape, и предполагать, что тип данных выхода совпадает с типом данных входа.
| Аргументы | |
|---|---|
input_signature | Один объект TensorSpec или вложенная структура объектов TensorSpec, описывающая потенциальный вход для слоя. |
| Возвращает | |
|---|---|
| Один объект TensorSpec или вложенная структура объектов TensorSpec, описывающие, как слой преобразует предоставленный вход. |
| Исключения | |
|---|---|
TypeError | Если input_signature содержит объект, не являющийся TensorSpec. |
count_params
count_params()
Подсчитывает общее количество скаляров, составляющих веса.
| Возвращает | |
|---|---|
| Целое число-счёт. |
| Исключения | |
|---|---|
ValueError | если слой ещё не построен (в этом случае его веса ещё не определены). |
from_config
@classmethod
from_config(
config
)
Создаёт слой по его конфигурации.
Этот метод — обратный get_config, позволяющий восстановить тот же слой по словарю конфигурации. Он не обрабатывает связность слоёв (обрабатывается Network), ни веса (обрабатывается set_weights).
| Аргументы | |
|---|---|
config | Словарь Python, обычно результат get_config. |
| Возвращает | |
|---|---|
| Экземпляр слоя. |
get_config
get_config()
Возвращает конфигурацию слоя.
Конфигурация слоя — словарь Python (сериализуемый), содержащий конфигурацию слоя. Тот же слой можно пересоздать позже (без его обученных весов) из этой конфигурации.
Конфигурация слоя не включает информацию о связности, а также имя класса слоя. Это обрабатывается Network (слой абстракции выше).
| Возвращаемое значение | |
|---|---|
| Словарь Python. |
get_weights
get_weights()
Возвращает текущие веса слоя.
Веса слоя представляют состояние слоя. Эта функция возвращает значения весов, как обучаемых, так и необучаемых, связанных с этим слоем, в виде списка массивов Numpy, которые в свою очередь могут быть использованы для загрузки состояния в аналогично параметризованные слои.
Например, слой Dense возвращает список из двух значений — весов на выходной сигнал и смещение. Их можно использовать для установки весов другого слоя Dense:
a = tf.keras.layers.Dense(1,
kernel_initializer=tf.constant_initializer(1.))
a_out = a(tf.convert_to_tensor([[1., 2., 3.]]))
a.get_weights()
[array([[1.],
[1.],
[1.]], dtype=float32), array([0.], dtype=float32)]
b = tf.keras.layers.Dense(1,
kernel_initializer=tf.constant_initializer(2.))
b_out = b(tf.convert_to_tensor([[10., 20., 30.]]))
b.get_weights()
[array([[2.],
[2.],
[2.]], dtype=float32), array([0.], dtype=float32)]
b.set_weights(a.get_weights())
b.get_weights()
[array([[1.],
[1.],
[1.]], dtype=float32), array([0.], dtype=float32)]
| Возвращаемое значение | |
|---|---|
| Значения весов в виде списка массивов numpy. |
set_weights
set_weights(
weights
)
Устанавливает веса слоя из массивов Numpy.
Веса слоя представляют состояние слоя. Эта функция устанавливает значения весов из массивов numpy. Значения весов должны быть переданы в порядке их создания слоем. Обратите внимание, что веса слоя должны быть инициализированы перед вызовом этой функции, вызвав сам слой.
Например, слой Dense возвращает список из двух значений — весов на выходной сигнал и смещения. Их можно использовать для установки весов другого слоя Dense:
a = tf.keras.layers.Dense(1,
kernel_initializer=tf.constant_initializer(1.))
a_out = a(tf.convert_to_tensor([[1., 2., 3.]]))
a.get_weights()
[array([[1.],
[1.],
[1.]], dtype=float32), array([0.], dtype=float32)]
b = tf.keras.layers.Dense(1,
kernel_initializer=tf.constant_initializer(2.))
b_out = b(tf.convert_to_tensor([[10., 20., 30.]]))
b.get_weights()
[array([[2.],
[2.],
[2.]], dtype=float32), array([0.], dtype=float32)]
b.set_weights(a.get_weights())
b.get_weights()
[array([[1.],
[1.],
[1.]], dtype=float32), array([0.], dtype=float32)]
| Аргументы | |
|---|---|
weights | список массивов Numpy. Количество массивов и их форма должны соответствовать количеству измерений весов слоя (т.е. должны соответствовать результату get_weights). |
| Исключения | |
|---|---|
ValueError | Если предоставленный список весов не соответствует спецификациям слоя. |
__call__
__call__(
*args, **kwargs
)
Оборачивает call, применяя предобработку и пост-обработку.
| Аргументы | |
|---|---|
*args | Позиционные аргументы, которые должны быть переданы в self.call. |
**kwargs | Именованные аргументы, которые должны быть переданы в self.call. |
| Возвращаемое значение | |
|---|---|
| Выходной(ые) тензор(ы). |
Примечание:
- Следующие необязательные именованные аргументы зарезервированы для конкретных применений:
-
training: Логический скалярный тензор Python, обозначающий, предназначен лиcallдля обучения или вывода. -
mask: Логическая маска ввода.
-
- Если метод
callслоя принимает аргументmask(как некоторые слои Keras), его значение по умолчанию будет установлено в маску, сгенерированную дляinputsпредыдущим слоем (еслиinputбыл получен из слоя, который сгенерировал соответствующую маску, то есть если он был получен из слоя Keras с поддержкой маскирования).
| Исключения | |
|---|---|
ValueError | если метод call слоя возвращает None (неверное значение). |
RuntimeError | если super().__init__() не был вызван в конструкторе. |
© 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/Layer