Класс Layer
Класс Layer - это фундаментальный строительный блок для
создания нейронных сетей в TensorFlow. Все слои, такие как
Dense, Conv2D или Embedding, наследуются от этого
класса. Он отвечает за создание и хранение весов, отслеживание
потерь и метрик, а также за вызов вычислений на входных данных.
При создании собственного слоя необходимо наследоваться от
Layer и реализовать метод call, в котором описывается
логика прямого прохода. Метод build используется для
создания весов на основе формы входных данных. Параметры
trainable, name и dtype задают основные свойства
слоя при инициализации.
Синтаксис
tf.keras.layers.Layer(trainable=True, name=None, dtype=None, **kwargs)
Пример
Давайте создадим простой пользовательский слой, который умножает входные данные на обучаемый скаляр:
import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.multiplier = None
def build(self, input_shape):
self.multiplier = self.add_weight(
name="multiplier",
shape=(),
initializer="ones",
trainable=True
)
def call(self, inputs):
return inputs * self.multiplier
layer = MyLayer(name="my_layer")
t = tf.constant([1, 2, 3, 4, 5], dtype=tf.float32)
res = layer(t)
print(res)
Результат выполнения кода:
tf.Tensor([1. 2. 3. 4. 5.], shape=(5,), dtype=float32)
Пример
Давайте проверим атрибуты созданного слоя - имя, наличие весов и признак обучаемости:
import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.multiplier = None
def build(self, input_shape):
self.multiplier = self.add_weight(
name="multiplier",
shape=(),
initializer="ones",
trainable=True
)
def call(self, inputs):
return inputs * self.multiplier
layer = MyLayer(name="my_layer")
t = tf.constant([1, 2, 3, 4, 5], dtype=tf.float32)
res = layer(t)
print(layer.name)
print(layer.trainable)
print(len(layer.weights))
Результат выполнения кода:
"my_layer"
True
1
Пример
Давайте создадим слой с замороженными (необучаемыми) весами:
import tensorflow as tf
class FrozenLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.scale = None
def build(self, input_shape):
self.scale = self.add_weight(
name="scale",
shape=(),
initializer="ones",
trainable=False
)
def call(self, inputs):
return inputs * self.scale
layer = FrozenLayer(name="frozen_layer")
t = tf.constant([1, 2, 3, 4, 5], dtype=tf.float32)
res = layer(t)
print(layer.trainable)
print(len(layer.trainable_weights))
print(len(layer.non_trainable_weights))
Результат выполнения кода:
True
0
1
Смотрите также
-
метод
call,
который описывает логику прямого прохода слоя -
метод
build,
который создает веса слоя на основе формы входа -
метод
add_weight,
который добавляет обучаемый вес в слой -
атрибут
trainable_weights,
который хранит список обучаемых весов слоя