Как повторно инициализировать веса слоев существующей модели в Keras? - PullRequest
1 голос
/ 17 июня 2019

Актуальной проблемой является генерация случайных весов слоя для существующей (уже построенной) модели в Керасе.Есть некоторые решения, использующие Numpy [2], но не стоит выбирать такие решения.Потому что в Keras есть специальные инициализаторы, использующие разные распределения для каждого типа слоя.Когда вместо инициализаторов используется Numpy, сгенерированные веса имеют распределение, отличное от исходного.Давайте приведем пример:

Второй слой моей модели - это сверточный (1D) слой, и его инициализатором является GlorotUniform [1].Если вы генерируете случайные веса с использованием Numpy, распределение сгенерированных весов не будет GlorotUniform.

У меня есть решение этой проблемы, но у него есть некоторые проблемы.Вот что у меня есть:

def set_random_weights(self, tokenizer, config):
    temp_model = build_model(tokenizer, config)
    self.model.set_weights(temp_model.get_weights())

Я строю существующую модель.После процесса построения веса модели повторно инициализируются.Затем я получаю повторно инициализированные веса и устанавливаю их для другой модели.Построение модели для генерации новых весов имеет избыточные процессы.Итак, мне нужно новое решение без построения модели и Numpy.

  1. https://keras.io/initializers/
  2. https://www.codementor.io/nitinsurya/how-to-re-initialize-keras-model-weights-et41zre2g

1 Ответ

1 голос
/ 17 июня 2019

Смотрите предыдущие ответы на этот вопрос здесь .В частности, если вы хотите использовать исходный инициализатор весов слоя Keras, вы можете сделать следующее:

import tensorflow as tf
import keras.backend as K

def init_layer(layer):
    session = K.get_session()
    weights_initializer = tf.variables_initializer(layer.weights)
    session.run(weights_initializer)


layer = model.get_layer('conv2d_1')
init_layer(layer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...