Метод call класса Layer
Метод call класса Layer является главным
методом любого слоя в TensorFlow. Именно в этом методе
описывается логика прямого распространения: какие операции
применяются к входным данным, чтобы получить выходные.
Первым параметром метод принимает входной тензор inputs,
вторым необязательным параметром - флаг training,
который указывает, работает ли слой в режиме обучения.
При создании собственного слоя метод call обязательно
переопределяется.
Синтаксис
class MyLayer(tf.keras.layers.Layer):
def call(self, inputs, training=None):
# logic here
return outputs
Пример
Давайте создадим простой слой, который умножает входной тензор на заданный коэффициент:
import tensorflow as tf
class MultiplyLayer(tf.keras.layers.Layer):
def __init__(self, factor=2.0, **kwargs):
super().__init__(**kwargs)
self.factor = factor
def call(self, inputs, training=None):
return inputs * self.factor
layer = MultiplyLayer(factor=3.0)
t = tf.constant([1, 2, 3, 4, 5])
res = layer(t)
print(res)
Результат выполнения кода:
tf.Tensor([ 3. 6. 9. 12. 15.], shape=(5,), dtype=float32)
Пример
Давайте рассмотрим слой, который использует флаг
training для разного поведения при обучении
и при выводе:
Результат выполнения кода:
tf.Tensor([ 2. 4. 6. 8. 10.], shape=(5,), dtype=float32)
tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)
Пример
Давайте создадим слой с обучаемым весом внутри метода
call и применим его к двумерному тензору:
import tensorflow as tf
tf.random.set_seed(0)
class DenseSimple(tf.keras.layers.Layer):
def __init__(self, units=3, **kwargs):
super().__init__(**kwargs)
self.units = units
def build(self, input_shape):
self.w = self.add_weight(
shape=(input_shape[-1], self.units),
initializer='ones',
trainable=True
)
super().build(input_shape)
def call(self, inputs, training=None):
return tf.matmul(inputs, self.w)
layer = DenseSimple(units=2)
t = tf.constant([[1, 2, 3], [4, 5, 6]])
res = layer(t)
print(res)
Результат выполнения кода:
tf.Tensor(
[[ 6. 6.]
[15. 15.]], shape=(2, 2), dtype=float32)
Смотрите также
-
класс
Layer,
который является базовым классом для всех слоев -
метод
build,
который создает веса слоя при первом вызове -
метод
compute_output_shape,
который вычисляет форму выходного тензора -
метод
add_weight,
который добавляет обучаемый вес в слой