tf.keras.layers.Layer
| Просмотреть исходный код на GitHub |
Базовый класс слоя.
Наследуется от: Module
tf.keras.layers.Layer(
trainable=True, name=None, dtype=None, dynamic=False, **kwargs
)
Это класс, от которого наследуются все слои.
Слой — это класс, реализующий общие операции нейронных сетей, такие как свёртка, батч-нормализация и т. д. Эти операции требуют управления весами, потерями, обновлениями и межслойными связями.
Пользователи просто создают слой, а затем используют его как вызываемую функцию.
Мы рекомендуем потомкам Layer реализовать следующие методы:
-
__init__(): Сохранение конфигурации в переменных члена -
build(): Вызывается один раз из__call__, когда нам известны формы входных данных иdtype. Должен содержать вызовыadd_weight(), а затем вызывать метод суперклассаbuild()(который устанавливаетself.built = True, что удобно, если пользователь хочет вызватьbuild()вручную перед первым вызовом__call__). -
call(): Вызывается в__call__после проверки того, чтоbuild()был вызван один раз. Должен фактически выполнять логику применения слоя к тензорам входных данных (которые должны передаваться в качестве первого аргумента).
| Аргументы | |
|---|---|
trainable | Булево значение, указывающее, должны ли переменные слоя быть обучимыми. |
name | Имя слоя в виде строки. |
dtype | Тип данных вычислений и весов слоя (по умолчанию None означает использование tf.keras.backend.floatx в TensorFlow 2 или типа первого входного тензора в TensorFlow 1). |
dynamic | Установите это значение в True, если ваш слой должен выполняться только в режиме eager и не должен использоваться для генерации статического вычислительного графа. Это будет справедливо для Tree-RNN или рекурсивной сети, например, или в общем для любого слоя, который манипулирует тензорами с помощью потоков управления Python. Если False, мы предполагаем, что слой можно безопасно использовать для генерации статического вычислительного графа. |
Только для чтения свойства: name: Имя слоя (строка). dtype: Тип данных вычислений и весов слоя. Если используется смешанная точность с tf.keras.mixed_precision.experimental.Policy, это вместо этого просто тип данных весов слоя, так как вычисления выполняются в другом типе данных. updates: Список обновляющих операций этого слоя. losses: Список потерь, добавленных этим слоем. trainable_weights: Список переменных, которые должны включаться в обратное распространение. non_trainable_weights: Список переменных, которые не должны включаться в обратное распространение. weights: Конкатенация списков trainable_weights и non_trainable_weights (в этом порядке).
Изменяемые свойства:
-
trainable: Должен ли слой обучаться (булево значение). -
input_spec: Необязательный(ые) объект(ы) constraints, определяющий ограничения на входные данные, которые может принять слой.
Типы данных и приведение типов
Каждый слой имеет тип данных, который обычно является типом данных вычислений и переменных слоя. Тип данных слоя можно запросить через свойство Layer.dtype. Тип данных задаётся аргументом конструктора dtype. В TensorFlow 2 тип данных по умолчанию — tf.keras.backend.floatx(), если тип данных не указан. floatx() сам по себе по умолчанию равен "float32". Кроме того, слои будут приводить входные данные к типу данных слоя в TensorFlow 2. Например:
x = tf.ones((4, 4, 4, 4), dtype='float64') layer = tf.keras.layers.Conv2D(filters=4, kernel_size=2) print(layer.dtype) # float32 # `layer` casts it's inputs to layer.dtype, which is float32, and does # computations in float32. y = layer(x)
В настоящее время приведение типов выполняется только для тензоров в первом аргументе метода call слоя. Например:
class MyLayer(tf.keras.layers.Layer):
# Bug! `b` will not be casted.
def call(self, a, b):
return a + 1., b + 1.
a = tf.constant(1., dtype="float32")
b = tf.constant(1., dtype="float32")
layer = MyLayer(dtype="float64")
x, y = layer(a, b)
print(x.dtype) # float64
print(y.dtype) # float32. Not casted since `b` was not passed to first input
Рекомендуется принимать тензоры только в первом аргументе. Таким образом, все тензоры приводятся к типу данных слоя. MyLayer следовательно, должно быть написано так:
class MyLayer(tf.keras.layers.Layer):
# Now, all tensor inputs will be casted.
def call(self, inputs):
a, b = inputs
return a + 1., b + 1.
a = tf.constant(1., dtype="float32")
b = tf.constant(1., dtype="float32")
layer = MyLayer(dtype="float64")
x, y = layer((a, b))
print(x.dtype) # float64
print(y.dtype) # float64.
В будущей небольшой версии, возможно, будут приводиться к типу данных и тензоры в других аргументах.
В настоящее время другие аргументы не приводятся к типу данных автоматически по техническим причинам, но это может измениться в будущей небольшой версии.
Подкласс слоя может предотвратить автоматическое приведение входных данных, передав autocast=False конструктору слоя. Например:
class MyLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
kwargs['autocast']=False
super(MyLayer, self).__init__(**kwargs)
def call(self, inp):
return inp
x = tf.ones((4, 4, 4, 4), dtype='float64')
layer = MyLayer()
print(layer.dtype) # float32.
y = layer(x) # MyLayer will not cast inputs to it's dtype of float32
print(y.dtype) # float64
Запуск моделей в float64 в TensorFlow 2
Если вы хотите запустить модель в float64, вы можете установить floatx в float64, вызвав tf.keras.backend.set_floatx('float64'). Это заставит все слои использовать float64 по умолчанию вместо float32:
tf.keras.backend.set_floatx('float64')
layer1 = tf.keras.layers.Dense(4)
layer2 = tf.keras.layers.Dense(4)
x = tf.ones((4, 4))
y = layer2(layer1(x)) # Both layers run in float64
В качестве альтернативы вы можете передать dtype='float64' каждому отдельному слою. Обратите внимание, что если у вас есть слои, которые содержат другие слои в качестве элементов, вы должны убедиться, что каждый дочерний слой получает dtype='float64' также в конструктор:
layer1 = tf.keras.layers.Dense(4, dtype='float64')
layer2 = tf.keras.layers.Dense(4, dtype='float64')
x = tf.ones((4, 4))
y = layer2(layer1(x)) # Both layers run in float64
class NestedLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super(NestedLayer, self).__init__(**kwargs)
self.dense = tf.keras.layers.Dense(4, dtype=kwargs.get('dtype'))
def call(self, inp):
return self.dense(inp)
layer3 = NestedLayer(dtype='float64')
z = layer3(x) # layer3's dense layer runs in float64, since NestedLayer
# correcty passed it's dtype to it's dense layer
| Атрибуты | |
|---|---|
activity_regularizer | Необязательная функция регуляризации для вывода этого слоя. |
dtype | |
dynamic | |
input | Получает тензор(ы) входных данных слоя. Применимо только если у слоя ровно один вход, т.е. если он подключен к одному входящему слою. |
input_mask | Получает тензор(ы) маски входных данных слоя. Применимо только если у слоя ровно один входной узел, т.е. если он подключен к одному входящему слою. |
input_shape | Получает форму(ы) входных данных слоя. Применимо только если у слоя ровно один вход, т.е. если он подключен к одному входящему слою, или если все входы имеют одинаковую форму. |
input_spec | |
losses | Потери, связанные с этим Layer. Тензоры регуляризации переменных создаются при доступе к этому свойству, поэтому он безопасен в eager режиме: доступ к |
metrics | |
name | Возвращает имя модуля, переданное или определенное в конструкторе.
Примечание: Это не то же самое, что
|
non_trainable_variables | |
non_trainable_weights | |
output | Получает тензор(ы) выходных данных слоя. Применимо только если у слоя ровно один выход, т.е. если он подключен к одному входящему слою. |
output_mask | Получает тензор(ы) маски выходных данных слоя. Применимо только если у слоя ровно один входной узел, т.е. если он подключен к одному входящему слою. |
output_shape | Получает форму(ы) выходных данных слоя. Применимо только если у слоя один выход, или если все выходы имеют одинаковую форму. |
trainable | |
trainable_variables | Последовательность переменных, принадлежащих этому модулю и его подмодулям. Примечание: Этот метод использует рефлексию для поиска переменных на текущем экземпляре и подмодулях. По соображениям производительности, вы можете кэшировать результат вызова этого метода, если не ожидаете, что возвращаемое значение изменится. |
trainable_weights | |
updates | |
variables | Возвращает список всех переменных/весов слоя. Псевдоним |
weights | Возвращает список всех переменных/весов слоя. |
Методы
add_loss
add_loss(
losses, inputs=None
)
Добавление тензора(ов) потерь, потенциально зависящих от входных данных слоя.
Некоторые потери (например, потери регуляризации активности) могут зависеть от входных данных, переданных при вызове слоя. Поэтому при повторном использовании одного и того же слоя на разных входных данных a и b, некоторые записи в layer.losses могут зависеть от a, а некоторые — от b. Этот метод автоматически отслеживает зависимости.
Этот метод можно использовать внутри подклассированного слоя или функции модели call, в этом случае losses должен быть тензором или списком тензоров.
Пример:
class MyLayer(tf.keras.layers.Layer):
def call(inputs, self):
self.add_loss(tf.abs(tf.reduce_mean(inputs)), inputs=True)
return inputs
Этот метод также можно вызвать непосредственно на модели Functional Model во время её создания. В этом случае любые тензоры потерь, переданные этой модели, должны быть символическими и должны иметь возможность прослеживаться обратно до тензоров 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) # Actvity regularization. model.add_loss(tf.abs(tf.reduce_mean(x)))
Если это не так для ваших потерь (если, например, ваши потери ссылаются на Variable одного из слоёв модели), вы можете обернуть свои потери в лямбда-функцию без аргументов. Эти потери не отслеживаются как часть топологии модели, поскольку они не могут быть сериализованы.
Пример:
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) # Weight regularization. model.add_loss(lambda: tf.reduce_mean(x.kernel))
Метод get_losses_for позволяет извлечь потери, относящиеся к определённому набору входных данных.
| Аргументы | |
|---|---|
losses | Тензор потерь или список/кортеж тензоров. Вместо тензоров, потери также могут быть нуль-аргументными вызовами, которые создают тензор потерь. |
inputs | Игнорируется при выполнении в режиме eager. Если передано значение отличное от None, это указывает, что потери зависят от некоторых входных данных слоя, и поэтому они должны выполняться только там, где эти входы доступны. Это относится, например, к потерям регуляризации активности. Если передано None, потери считаются безусловными и будут применяться ко всем потокам данных слоя (например, потери регуляризации весов). |
add_metric
add_metric(
value, aggregation=None, name=None
)
Добавляет тензор метрики в слой.
| Аргументы | |
|---|---|
value | Тензор метрики. |
aggregation | Функция редукции метрики на уровне образца. Если aggregation=None, это указывает, что предоставленный тензор метрики уже был агрегирован. Например, bin_acc = BinaryAccuracy(name='acc') за которым следует model.add_metric(bin_acc(y_true, y_pred)). Если aggregation='mean', предоставленный тензор метрики будет уменьшен на уровне образца с использованием функции mean. Например, model.add_metric(tf.reduce_sum(outputs), name='output_mean', aggregation='mean'). |
name | Имя метрики (строка). |
| Исключения | |
|---|---|
ValueError | Если aggregation имеет значение отличное от None или mean. |
add_update
add_update(
updates, inputs=None
)
Добавляет операцию(и) обновления, потенциально зависящую(ие) от входных данных слоя. (устаревшие аргументы)
Обновления весов (например, обновления скользящего среднего и дисперсии в слое BatchNormalization) могут зависеть от входных данных, переданных при вызове слоя. Следовательно, при повторном использовании одного и того же слоя с разными входами a и b, некоторые записи в layer.updates могут зависеть от a, а некоторые — от b. Этот метод автоматически отслеживает зависимости.
Этот вызов игнорируется при включенном режиме eager execution (в этом случае обновления переменных выполняются на лету и, следовательно, не нуждаются в отслеживании для последующего выполнения).
| Аргументы | |
|---|---|
updates | Операция обновления или список/кортеж операций обновления или нуль-аргументная вызываемая функция, которая возвращает операцию обновления. Нуль-аргументную вызываемую функцию следует передавать для отключения выполнения обновлений, установив trainable=False в этом слое при выполнении в режиме Eager. |
inputs | Устаревший, будет автоматически вычисляться. |
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.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. |
| Возвращает | |
|---|---|
Созданная переменная. Обычно экземпляр Variable или ResourceVariable. Если partitioner не None, возвращается экземпляр PartitionedVariable. |
| Исключения | |
|---|---|
RuntimeError | Если вызван с регуляризацией распределённой переменной и режим eager execution включен. |
ValueError | При указании недопустимого типа данных без инициализатора или при установлении trainable в True со синхронизацией, установленной как ON_READ. |
build
build(
input_shape
)
Создаёт переменные слоя (необязательно, для реализации подклассов).
Это метод, который реализующие подклассы Layer или Model могут переопределить, если им нужен шаг создания состояния между созданием слоя и вызовом слоя.
Обычно используется для создания весов подклассов Layer.
| Аргументы | |
|---|---|
input_shape | Экземпляр TensorShape, или список экземпляров TensorShape если слой ожидает список входов (по одному экземпляру на вход). |
call
call(
inputs, **kwargs
)
Здесь находится логика слоя.
| Аргументы | |
|---|---|
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_input_at
get_input_at(
node_index
)
Возвращает тензор(ы) входа слоя в указанном узле.
| Аргументы | |
|---|---|
node_index | Целое число, индекс узла, из которого извлекается атрибут. Например, node_index=0 соответствует первому вызову слоя. |
| Возвращает | |
|---|---|
| Тензор (или список тензоров, если у слоя несколько входов). |
| Возможные исключения | |
|---|---|
RuntimeError | Если вызов осуществляется в режиме Eager. |
get_input_mask_at
get_input_mask_at(
node_index
)
Возвращает маску тензора(ов) входа слоя в указанном узле.
| Аргументы | |
|---|---|
node_index | Целое число, индекс узла, из которого извлекается атрибут. Например, node_index=0 соответствует первому вызову слоя. |
| Возвращает | |
|---|---|
| Маска тензора (или список тензоров, если у слоя несколько входов). |
get_input_shape_at
get_input_shape_at(
node_index
)
Возвращает форму(ы) входных данных слоя в заданном узле.
| Аргументы | |
|---|---|
node_index | Целое число, индекс узла, из которого необходимо извлечь атрибут. Например, node_index=0 соответствует первому вызову слоя. |
| Возвращаемое значение | |
|---|---|
| Кортеж формы (или список кортежей форм, если у слоя несколько входов). |
| Исключения | |
|---|---|
RuntimeError | Если вызов осуществляется в режиме Eager. |
get_losses_for
get_losses_for(
inputs
)
Возвращает потери, относящиеся к определенному набору входов.
| Аргументы | |
|---|---|
inputs | Входной тензор или список/кортеж входных тензоров. |
| Возвращаемое значение | |
|---|---|
Список тензоров потерь слоя, зависящих от inputs. |
get_output_at
get_output_at(
node_index
)
Возвращает выходной(ые) тензор(ы) слоя в заданном узле.
| Аргументы | |
|---|---|
node_index | Целое число, индекс узла, из которого необходимо извлечь атрибут. Например, node_index=0 соответствует первому вызову слоя. |
| Возвращаемое значение | |
|---|---|
| Тензор (или список тензоров, если у слоя несколько выходов). |
| Исключения | |
|---|---|
RuntimeError | Если вызов осуществляется в режиме Eager. |
get_output_mask_at
get_output_mask_at(
node_index
)
Возвращает выходной(ые) маску(и) тензора слоя в заданном узле.
| Аргументы | |
|---|---|
node_index | Целое число, индекс узла, из которого необходимо извлечь атрибут. Например, node_index=0 соответствует первому вызову слоя. |
| Возвращаемое значение | |
|---|---|
| Маска тензора (или список тензоров, если у слоя несколько выходов). |
get_output_shape_at
get_output_shape_at(
node_index
)
Возвращает форму(ы) выходных данных слоя в заданном узле.
| Аргументы | |
|---|---|
node_index | Целое число, индекс узла, из которого необходимо извлечь атрибут. Например, node_index=0 соответствует первому вызову слоя. |
| Возвращаемое значение | |
|---|---|
| Кортеж формы (или список кортежей форм, если у слоя несколько выходов). |
| Исключения | |
|---|---|
RuntimeError | Если вызов осуществляется в режиме Eager. |
get_updates_for
get_updates_for(
inputs
)
Возвращает обновления, относящиеся к определенному набору входов.
| Аргументы | |
|---|---|
inputs | Входной тензор или список/кортеж входных тензоров. |
| Возвращаемое значение | |
|---|---|
Список операций обновления слоя, зависящих от inputs. |
get_weights
get_weights()
Возвращает текущие веса слоя.
| Возвращаемое значение | |
|---|---|
| Значения весов в виде списка массивов NumPy. |
set_weights
set_weights(
weights
)
Устанавливает веса слоя из массивов NumPy.
| Аргументы | |
|---|---|
weights | список массивов NumPy. Количество массивов и их размерность должны соответствовать количеству измерений весов слоя (т.е. должны совпадать с результатом get_weights). |
| Исключения | |
|---|---|
ValueError | Если предоставленный список весов не соответствует спецификациям слоя. |
__call__
__call__(
inputs, *args, **kwargs
)
Оборачивает call, применяя этапы предобработки и пост-обработки.
| Аргументы | |
|---|---|
inputs | входной(ые) тензор(ы). |
*args | дополнительные позиционные аргументы, которые нужно передать в self.call. |
**kwargs | дополнительные именованные аргументы, которые нужно передать в self.call. |
| Возвращаемое значение | |
|---|---|
| Выходной(ые) тензор(ы). |
Примечание:
- Следующие необязательные именованные аргументы зарезервированы для определенных целей:
-
training: Булевый скалярный тензор Python-булева типа, указывающий, предназначен лиcallдля обучения или предсказания. -
mask: Булевый входной массив маски.
-
- Если метод
callслоя принимает аргументmask(как это делают некоторые слои Keras), его значение по умолчанию будет установлено в маску, сгенерированную дляinputsпредыдущим слоем (еслиinputпоступает со слоя, который сгенерировал соответствующую маску, то есть, если он поступает от слоя Keras с поддержкой маскирования).
| Исключения | |
|---|---|
ValueError | если метод call слоя возвращает None (неверное значение). |
© 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/r1.15/api_docs/python/tf/keras/layers/Layer