слой керас перезапускает часть весов каждую эпоху - PullRequest
0 голосов
/ 23 января 2019

Я ищу способ перезапустить случайную часть весов слоя каждую эпоху (или каждые n эпох), я нашел this , объясняющий, как повторно инициализировать слой. Я мог бы использовать

weights = layer.get_weights() 

, а затем с помощью операции numpy, чтобы повторно инициировать часть весов, или создать фиктивный слой, извлекая из него новые инициализированные веса и использовать их с set_weights. Я ищу более элегантный способ просто инициализировать определенную (или случайную) часть моих весов в слое.

Спасибо

1 Ответ

0 голосов
/ 23 января 2019

Keras имеет метод set_weights для установки веса слоя. Чтобы сбросить вес слоя в каждой эпохе, используйте обратные вызовы.

class My_Callback(keras.callbacks.Callback):

    def on_epoch_begin(self, logs={}):
        return

    def on_epoch_end(self, epoch, logs={}):
        layer_index = 0  ## index of the layer you want to change
        # random weights to reset the layer
        new_weights = numpy.random.randn(*self.model.layers[layer_index].get_weights().shape)

        self.model.layers[layer_index].set_weights(new_weights)

Edit:

Чтобы сбросить случайные n весов слоя, можно использовать numpy, чтобы получить случайные индексы для сброса. Теперь код будет

    def on_epoch_end(self, epoch, logs={}):
        layer_index = np.random.randint(len(self.model.layers)) # Random layer index to reset
        weights_shape = self.model.layers.get_weights().shape
        num = 10 # number of weights to reset
        indexes = np.random.choice(weights_shape[0], num, replace=False)   # indexes of the layer to reset
        reset_weights = numpy.random.randn(*weights_shape[1:]) # random weights to reset the layer

        layer_weights = self.model.layers[layer_index].get_weights()
        layer_weights[indexes] = reset_weights
        self.model.layers[layer_index].set_weights(layer_weights)

Аналогично для случайного сброса p % весов слоя, первая цифра может использоваться для выбора p % индексов весов слоя.

    def on_epoch_end(self, epoch, logs={}):
        layer_index = np.random.randint(len(self.model.layers)) # Random layer index to reset
        weights_shape = self.model.layers.get_weights().shape
        percent = 10 # Percentage of weights to reset
        indexes = np.random.choice(weights_shape[0], int(percent/100.) * weights_shape[0], replace=False)   # indexes of the layer  to reset
        reset_weights = numpy.random.randn(*weights_shape[1:]) # random weights to reset the layer

        layer_weights = self.model.layers[layer_index].get_weights()
        layer_weights[indexes] = reset_weights
        self.model.layers[layer_index].set_weights(layer_weights)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...