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 | Тип данных вычислений и весов слоя (по умолчанию None, что означает использование tf.keras.backend.floatx в TensorFlow 2 или типа первого входного тензора в TensorFlow 1). |
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
Об атрибуте dtype слоя:
Каждый слой имеет тип данных, который обычно является типом данных вычислений и переменных слоя. Тип данных слоя можно получить с помощью свойства Layer.dtype. Тип данных задаётся аргументом конструктора dtype. В TensorFlow 2 тип данных по умолчанию — tf.keras.backend.floatx(), если не указан другой тип. floatx() по умолчанию равен "float32". Кроме того, слои преобразуют свои входные данные в тип данных слоя в TensorFlow 2. При использовании смешанной точности слои могут иметь разные типы данных вычислений и переменных. Подробнее о типах данных слоёв см. tf.keras.mixed_precision.experimental.Policy.
| Атрибуты | |
|---|---|
name | Имя слоя (строка). |
dtype | Тип данных вычислений и весов слоя. Если используется смешанная точность с tf.keras.mixed_precision.experimental.Policy, то это вместо этого только тип данных весов слоя, так как вычисления выполняются в другом типе данных. |
trainable_weights | Список переменных, которые должны быть включены в обратное распространение. |
non_trainable_weights | Список переменных, которые не должны быть включены в обратное распространение. |
weights | Объединение списков trainable_weights и non_trainable_weights (в этом порядке). |
trainable | Должен ли слой обучаться (булево значение), т.е. должны ли его потенциально обучаемые веса возвращаться как часть layer.trainable_weights. |
input_spec | Необязательный(ые) объект(ы) InputSpec , определяющий(е) ограничения на входные данные, которые может принять слой. |
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. model.add_loss(tf.abs(tf.reduce_mean(x))) model.losses [<tf.Tensor 'Abs:0' shape=() dtype=float32>] 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 = metrics_module.Mean(name='metric_1')
def call(self, inputs):
self.add_metric(self.mean(x))
self.add_metric(math_ops.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, partitioner=None, use_resource=None,
synchronization=tf.VariableSynchronization.AUTO,
aggregation=tf.compat.v1.VariableAggregation.NONE, **kwargs
)
Добавляет новую переменную в слой.
| Аргументы | |
|---|---|
name | Имя переменной. |
shape | Форма переменной. По умолчанию скаляр, если не указано иное. |
dtype | Тип переменной. По умолчанию self.dtype или float32. |
initializer | Экземпляр инициализатора (вызываемый объект). |
regularizer | Экземпляр регуляризатора (вызываемый объект). |
trainable | Булево значение, указывающее, должна ли переменная входить в состав «trainable_variables» слоя (например, переменные, смещения) или «non_trainable_variables» (например, среднее и дисперсия BatchNorm). Обратите внимание, что trainable не может быть True, если synchronization установлено в значение ON_READ. |
constraint | Экземпляр ограничение (вызываемый объект). |
partitioner | Партиционер, передаваемый в API Trackable. |
use_resource | Использовать ли ResourceVariable? |
synchronization | Указывает, когда распределённая переменная будет агрегирована. Допустимые значения — константы, определённые в классе tf.VariableSynchronization. По умолчанию синхронизация установлена в AUTO, и текущий DistributionStrategy выбирает, когда синхронизировать. Если synchronization установлено в значение ON_READ, trainable не должно быть установлено в значение True. |
aggregation | Указывает, как распределённая переменная будет агрегирована. Допустимые значения — константы, определённые в классе tf.VariableAggregation. |
**kwargs | Дополнительные ключевые аргументы. Допустимые значения: getter, collections, experimental_autocast и caching_device. |
| Возвращает | |
|---|---|
Созданная переменная. Обычно экземпляр Variable или ResourceVariable. Если partitioner не None, возвращается экземпляр PartitionedVariable. |
| Возможные исключения | |
|---|---|
RuntimeError | При вызове с регуляризацией переменных с разбиением и включённым режимом eager execution. |
ValueError | При указании недопустимого типа данных dtype и отсутствии инициализатора или при установке 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, позволяя восстановить тот же слой из словаря конфигурации. Он не обрабатывает соединение слоёв (обрабатывается сетью) или веса (обрабатывается 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.3/api_docs/python/tf/keras/layers/Layer