Метод add_weight
Метод add_weight класса Layer создает новую переменную веса и добавляет ее в список весов слоя. Первым параметром метод принимает имя веса. Вторым параметром можно передать форму тензора. Третьим параметром задается тип данных. Также можно указать начальное значение, флаг обучения и регулярізаторы.
Синтаксис
layer.add_weight(name, [shape], [dtype], [initializer], [trainable])
Пример
Давайте создадим простой слой и добавим в него вес с именем 'my_weight' и формой (3,):
import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
def __init__(self):
super(MyLayer, self).__init__()
self.w = self.add_weight(name='my_weight', shape=(3,))
layer = MyLayer()
print(layer.w)
Результат выполнения кода:
<tf.Variable 'my_weight:0' shape=(3,) dtype=float32, numpy=array([-0.04089421, 0.03652837, -0.04684317], dtype=float32)>
Пример
Давайте добавим вес с начальным значением из тензора:
import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
def __init__(self):
super(MyLayer, self).__init__()
initial = tf.constant([1.0, 2.0, 3.0])
self.w = self.add_weight(
name='my_weight',
shape=(3,),
initializer=tf.keras.initializers.Constant(initial)
)
layer = MyLayer()
print(layer.w)
Результат выполнения кода:
<tf.Variable 'my_weight:0' shape=(3,) dtype=float32, numpy=array([1., 2., 3.], dtype=float32)>
Пример
Давайте создадим вес, который не будет обучаться:
import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
def __init__(self):
super(MyLayer, self).__init__()
self.w = self.add_weight(
name='my_weight',
shape=(3,),
trainable=False
)
layer = MyLayer()
print(layer.trainable_weights)
print(layer.non_trainable_weights)
Результат выполнения кода:
[]
[<tf.Variable 'my_weight:0' shape=(3,) dtype=float32, numpy=array([-0.04089421, 0.03652837, -0.04684317], dtype=float32)>]
Пример
Давайте используем метод add_weight внутри метода build для создания веса, зависящего от входной формы:
<+python+>
import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
def build(self, input_shape):
self.w = self.add_weight(
name='my_weight',
shape=(input_shape[-1],)
)
layer = MyLayer()
layer.build((None, 5))
print(layer.w)
<-python+>
Результат выполнения кода:
<tf.Variable 'my_weight:0' shape=(5,) dtype=float32, numpy=array([-0.04089421, 0.03652837, -0.04684317, 0.03652837, -0.04684317], dtype=float32)>
Смотрите также
-
класс
Layer,
который является базовым классом для всех слоев -
метод
build,
который вызывается при первом использовании слоя -
атрибут
trainable_weights,
который содержит список обучаемых весов -
атрибут
non_trainable_weights,
который содержит список необучаемых весов