Согласно этой странице документации , мы можем реализовать пользовательский инициализатор, определив функцию, которая возвращает начальное значение. Затем мы передаем этот объект функции (т.е. вы не вызываете функцию) инициализатору.
Вот пример (в TensorFlow 2.1), который делает то, что я хочу.
import tensorflow as tf
def random_half_normal(shape, **kwargs):
return tf.abs(tf.keras.backend.random_normal(shape, **kwargs))
class MyLayer(tf.keras.layers.Layer):
def build(self, input_shape):
self.my_var = self.add_weight(initializer=random_half_normal,
trainable=False)
def call(self, inputs):
tf.print("\nself.my_var =", self.my_var)
return inputs
def get_model():
inp = tf.keras.layers.Input(shape=(1,))
out = MyLayer(8)(inp)
model = tf.keras.Model(inputs=inp, outputs=out)
model.summary()
return model
def train():
model = get_model()
model.compile(optimizer="adam", loss="mae")
x_train = [2, 3, 4, 1, 2, 6]
y_train = [1, 0, 1, 0, 1, 1]
model.fit(x_train, y_train)
if __name__ == '__main__':
train()