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)