tf.keras.Layer
Это класс, от которого наследуются все слои.
Наследуется от: Operation
tf.keras.Layer(
*,
activity_regularizer=None,
trainable=True,
dtype=None,
autocast=True,
name=None,
**kwargs
)
Используется в блокнотах
| Используется в руководстве | Используется в учебниках |
|---|---|
Слой — это вызываемый объект, принимающий на вход один или несколько тензоров и возвращающий один или несколько тензоров. Он включает в себя вычисления, определенные в методе call(), и состояние (переменные весов). Состояние может быть создано:
- в
__init__(), например, с помощьюself.add_weight(); - в необязательном методе
build(), который вызывается первым__call__()слоем и предоставляет форму(ы) ввода(ов), которая(ые) могут быть неизвестны на момент инициализации.
Слои являются рекурсивно композируемыми: если вы присваиваете экземпляр Layer в качестве атрибута другого Layer, внешний слой начнёт отслеживать веса, созданные внутренним слоем. Вложенные слои должны создаваться в методе __init__() или методе build().
Пользователи просто создают слой и затем обращаются к нему как к вызываемому объекту.
| Аргументы | |
|---|---|
trainable | Булево значение, указывающее, должны ли переменные слоя быть обучаемыми. |
name | Имя слоя (строка). |
dtype | Тип данных вычислений и весов слоя. Также может быть keras.DTypePolicy, что позволяет разным типам данных вычислений и весов. По умолчанию None. None означает использование keras.config.dtype_policy(), которая является политикой float32, если не установлено иное значение (через keras.config.set_dtype_policy()). |
Мы рекомендуем потомкам Layer реализовывать следующие методы:
-
__init__(): Определяет пользовательские атрибуты слоя и создает веса слоя, не зависящие от формы ввода, используяadd_weight()или другое состояние. -
build(self, input_shape): Этот метод можно использовать для создания весов, зависящих от формы(ов) ввода(ов), используяadd_weight()или другое состояние.__call__()автоматически построит слой (если он ещё не построен), вызвавbuild(). -
call(self, *args, **kwargs): Вызывается в__call__после проверки, чтоbuild()был вызван.call()выполняет логику применения слоя к аргументам ввода. Два зарезервированных ключевых аргумента, которые вы можете использовать вcall(), это: 1.training(логическое значение, указывает ли вызов на режим вывода или режим обучения). 2.mask(булевский тензор, кодирующий замаскированные временные шаги в вводе, используемый, например, в слоях RNN). Типичная сигнатура этого метода —call(self, inputs), и пользователь может дополнительно добавитьtrainingиmask, если слой их требует. -
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().__init__()
self.units = units
# Create the state of the layer (weights)
def build(self, input_shape):
self.kernel = self.add_weight(
shape=(input_shape[-1], self.units),
initializer="glorot_uniform",
trainable=True,
name="kernel",
)
self.bias = self.add_weight(
shape=(self.units,),
initializer="zeros",
trainable=True,
name="bias",
)
# Defines the computation
def call(self, inputs):
return ops.matmul(inputs, self.kernel) + self.bias
# Instantiates the layer.
linear_layer = SimpleDense(4)
# This will also call `build(input_shape)` and create the weights.
y = linear_layer(ops.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
Помимо обучаемых весов, обновляемых с помощью обратного распространения во время обучения, слои также могут иметь необучаемые веса. Эти веса предназначены для ручного обновления во время call(). Вот пример слоя, вычисляющего текущую сумму своих входов:
class ComputeSum(Layer):
def __init__(self, input_dim):
super(ComputeSum, self).__init__()
# Create a non-trainable weight.
self.total = self.add_weight(
shape=(),
initializer="zeros",
trainable=False,
name="total",
)
def call(self, inputs):
self.total.assign(self.total + ops.sum(inputs))
return self.total
my_sum = ComputeSum(2)
x = ops.ones((2, 2))
y = my_sum(x)
assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []
| Атрибуты | |
|---|---|
name | Имя слоя (строка). |
dtype | Тип данных весов слоя. Псевдоним layer.variable_dtype. |
variable_dtype | Тип данных весов слоя. |
compute_dtype | Тип данных вычислений слоя. Слои автоматически преобразуют ввод в этот тип данных, что также приводит к тому, что вычисления и вывод будут в этом типе данных. При использовании смешанной точности с keras.DTypePolicy это будет отличаться от variable_dtype. |
trainable_weights | Список переменных, которые следует включать в обратное распространение. |
non_trainable_weights | Список переменных, которые не следует включать в обратное распространение. |
weights | Объединение списков trainable_weights и non_trainable_weights (в этом порядке). |
trainable | Должен ли слой обучаться (булево значение), т. е. должны ли его потенциально обучаемые веса возвращаться как часть layer.trainable_weights. |
input_spec | Необязательный (список) InputSpec объект(ов), определяющий ограничения на ввод, который может принять слой. |
dtype_policy | |
input | Извлекает тензор(ы) ввода символической операции. Возвращает только тензор(ы), соответствующие первому вызову операции. |
input_dtype | Тип данных, в который должны быть преобразованы входные данные слоя. |
losses | Список скалярных потерь из add_loss, регуляризаторов и подслоёв. |
metrics | Список всех метрик. |
metrics_variables | Список всех переменных метрик. |
non_trainable_variables | Список всего необучаемого состояния слоя. Это расширяет |
output | Извлекает тензор(ы) вывода слоя. Возвращает только тензор(ы), соответствующие первому вызову операции. |
supports_masking | Поддерживает ли этот слой вычисление маски с помощью compute_mask. |
trainable_variables | Список всего обучаемого состояния слоя. Это эквивалентно |
variables | Список всего состояния слоя, включая случайные зерна. Это расширяет Обратите внимание, что переменные метрик здесь не включены, используйте |
Методы
add_loss
add_loss(
loss
)
Можно вызвать внутри метода call(), чтобы добавить скалярную потерю.
Пример:
class MyLayer(Layer):
...
def call(self, x):
self.add_loss(ops.sum(x))
return x
add_metric
add_metric()
add_variable
add_variable(
shape,
initializer,
dtype=None,
trainable=True,
autocast=True,
regularizer=None,
constraint=None,
name=None
)
Добавить переменную веса в слой.
Псевдоним add_weight().
add_weight
add_weight(
shape=None,
initializer=None,
dtype=None,
trainable=True,
autocast=True,
regularizer=None,
constraint=None,
aggregation='mean',
name=None
)
Добавить переменную веса в слой.
| Аргументы | |
|---|---|
shape | Кортеж формы для переменной. Должен быть полностью определён (без None элементов). По умолчанию () (скаляр), если не указано. |
initializer | Объект инициализатора, используемый для заполнения начального значения переменной, или строковое имя встроенного инициализатора (например, "random_normal"). Если не указано, по умолчанию используется "glorot_uniform" для переменных с плавающей запятой и "zeros" для всех других типов (например, int, bool). |
dtype | Тип данных переменной, например "float32". Если не указано, по умолчанию используется тип данных переменных слоя (который сам по умолчанию равен "float32", если не указан). |
trainable | Логическое значение, указывающее, должна ли переменная быть обученной с помощью обратного распространения, или ли её обновления управляются вручную. По умолчанию True. |
autocast | Логическое значение, указывает ли нужно ли автоматически преобразовывать типы переменных слоев при их обращении. По умолчанию True. |
regularizer | Объект регуляризации, вызываемый для применения штрафа к весу. Эти штрафы суммируются в функцию потерь во время оптимизации. По умолчанию None. |
constraint | Объект ограничения, вызываемый для переменной после любого обновления оптимизатора, или строковое имя встроенного ограничения. По умолчанию None. |
aggregation | Строка, одна из 'mean', 'sum', 'only_first_replica'. Анотирует переменную типом агрегации для нескольких реплик, который будет использоваться для этой переменной при написании пользовательских петель обучения с параллельной обработкой данных. |
name | Имя переменной. Полезно для отладки. |
build
build(
input_shape
)
build_from_config
build_from_config(
config
)
Создаёт состояния слоя с помощью переданного словаря конфигурации.
По умолчанию этот метод вызывает метод build(config["input_shape"]), который создаёт веса на основе формы входных данных слоя в переданной конфигурации. Если ваша конфигурация содержит другую информацию, необходимую для загрузки состояния слоя, вы должны переопределить этот метод.
| Аргументы | |
|---|---|
config | Словарь, содержащий форму входных данных, связанную с этим слоем. |
call
call(
*args, **kwargs
)
compute_mask
compute_mask(
inputs, previous_mask
)
compute_output_shape
compute_output_shape(
*args, **kwargs
)
compute_output_spec
compute_output_spec(
*args, **kwargs
)
count_params
count_params()
Подсчёт общего количества скаляров, составляющих веса.
| Возвращает | |
|---|---|
| Целое число. |
from_config
@classmethod
from_config(
config
)
Создаёт слой из его конфигурации.
Этот метод является обратным get_config, способным создать тот же самый слой из словаря конфигурации. Он не обрабатывает соединение слоёв (это обрабатывает Network), а также веса (это обрабатывает set_weights).
| Аргументы | |
|---|---|
config | Словарь Python, обычно результат get_config. |
| Возвращает | |
|---|---|
| Экземпляр слоя. |
get_build_config
get_build_config()
Возвращает словарь с формой входных данных слоя.
Этот метод возвращает словарь конфигурации, который может быть использован build_from_config(config) для создания всех состояний (например, переменных и таблиц поиска), необходимых слою.
По умолчанию конфигурация содержит только форму входных данных, с которой был построен слой. Если вы пишете пользовательский слой, который создаёт состояние необычным образом, вы должны переопределить этот метод, чтобы убедиться, что это состояние уже создано, когда Keras пытается загрузить его значение при загрузке модели.
| Возвращает | |
|---|---|
| Словарь, содержащий форму входных данных, связанную со слоем. |
get_config
get_config()
Возвращает конфигурацию объекта.
Конфигурация объекта — это словарь Python (сериализуемый), содержащий информацию, необходимую для его повторного создания.
get_weights
get_weights()
Возвращает значения layer.weights в виде списка NumPy-массивов.
load_own_variables
load_own_variables(
store
)
Загружает состояние слоя.
Вы можете переопределить этот метод, чтобы полностью контролировать, как загружается состояние слоя при вызове keras.models.load_model().
| Аргументы | |
|---|---|
store | Словарь, из которого будет загружено состояние модели. |
quantize
quantize(
mode
)
quantized_call
quantized_call(
*args, **kwargs
)
save_own_variables
save_own_variables(
store
)
Сохраняет состояние слоя.
Вы можете переопределить этот метод, чтобы полностью контролировать, как сохраняется состояние слоя при вызове model.save().
| Аргументы | |
|---|---|
store | Словарь, куда будет сохранено состояние модели. |
set_weights
set_weights(
weights
)
Устанавливает значения layer.weights из списка NumPy-массивов.
stateless_call
stateless_call(
trainable_variables,
non_trainable_variables,
*args,
return_losses=False,
**kwargs
)
Вызвать слой без побочных эффектов.
| Аргументы | |
|---|---|
trainable_variables | Список обучаемых переменных модели. |
non_trainable_variables | Список необучаемых переменных модели. |
*args | Позиционные аргументы, которые нужно передать в call(). |
return_losses | Если True, то stateless_call() вернёт список потерь, созданных во время call(), в качестве части возвращаемых значений. |
**kwargs | Ключевые аргументы, которые нужно передать в call(). |
| Возвращаемое значение | |
|---|---|
Кортеж. По умолчанию, возвращает (outputs, non_trainable_variables). Если return_losses = True, то возвращает (outputs, non_trainable_variables, losses). |
Примечание:non_trainable_variablesвключают не только необучаемые веса, такие какBatchNormalizationстатистики, но и состояние генератора случайных чисел (если в слое есть случайные операции, такие как dropout), и состояниеMetric(если к слою прикреплены какие-либо метрики). Все это — элементы состояния слоя.
Пример:
model = ...
data = ...
trainable_variables = model.trainable_variables
non_trainable_variables = model.non_trainable_variables
# Call the model with zero side effects
outputs, non_trainable_variables = model.stateless_call(
trainable_variables,
non_trainable_variables,
data,
)
# Attach the updated state to the model
# (until you do this, the model is still in its pre-call state).
for ref_var, value in zip(
model.non_trainable_variables, non_trainable_variables
):
ref_var.assign(value)
symbolic_call
symbolic_call(
*args, **kwargs
)
__call__
__call__(
*args, **kwargs
)
Вызов себя как функции.
© 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/api_docs/python/tf/keras/layers/Layer