#tensorflow #pytorch #tensorflow2.0 #batch-normalization #momentum
#tensorflow #pytorch #tensorflow2.0 #пакетная нормализация #momentum
Вопрос:
Я нашел реализацию PyTorch, которая momentum
уменьшает параметр пакетной нормы с 0.1
первой эпохи до 0.001
последней эпохи. Любые предложения о том, как это сделать с параметром пакетной нормы momentum
в TF2? (т. Е. Начинать 0.9
и заканчивать 0.999
) Например, это то, что делается в коде PyTorch:
# in training script
momentum = initial_momentum * np.exp(-epoch/args.epochs * np.log(initial_momentum/final_momentum))
model_pos_train.set_bn_momentum(momentum)
# model class function
def set_bn_momentum(self, momentum):
self.expand_bn.momentum = momentum
for bn in self.layers_bn:
bn.momentum = momentum
РЕШЕНИЕ:
Выбранный ниже ответ обеспечивает жизнеспособное решение при использовании tf.keras.Model.fit()
API. Тем не менее, я использовал пользовательский цикл обучения. Вот что я сделал вместо этого:
После каждой эпохи:
mi = 1 - initial_momentum # i.e., inital_momentum = 0.9, mi = 0.1
mf = 1 - final_momentum # i.e., final_momentum = 0.999, mf = 0.001
momentum = 1 - mi * np.exp(-epoch / epochs * np.log(mi / mf))
model = set_bn_momentum(model, momentum)
функция set_bn_momentum (ссылка на эту статью):
def set_bn_momentum(model, momentum):
for layer in model.layers:
if hasattr(layer, 'momentum'):
print(layer.name, layer.momentum)
setattr(layer, 'momentum', momentum)
# When we change the layers attributes, the change only happens in the model config file
model_json = model.to_json()
# Save the weights before reloading the model.
tmp_weights_path = os.path.join(tempfile.gettempdir(), 'tmp_weights.h5')
model.save_weights(tmp_weights_path)
# load the model from the config
model = tf.keras.models.model_from_json(model_json)
# Reload the model weights
model.load_weights(tmp_weights_path, by_name=True)
return model
Этот метод не добавлял значительных накладных расходов к процедуре обучения.
Комментарии:
1. Непонятно, что вы задумали. Можете ли вы точно показать код pytorch, который делает то, что вы хотите?
Ответ №1:
Вы можете установить действие в начале / конце каждой партии, чтобы вы могли управлять любым параметром в течение эпохи.
Ниже приведены параметры для обратных вызовов:
class CustomCallback(keras.callbacks.Callback):
def on_epoch_begin(self, epoch, logs=None):
keys = list(logs.keys())
print("Start epoch {} of training; got log keys: {}".format(epoch, keys))
def on_epoch_end(self, epoch, logs=None):
keys = list(logs.keys())
print("End epoch {} of training; got log keys: {}".format(epoch, keys))
def on_train_batch_begin(self, batch, logs=None):
keys = list(logs.keys())
print("...Training: start of batch {}; got log keys: {}".format(batch, keys))
def on_train_batch_end(self, batch, logs=None):
keys = list(logs.keys())
print("...Training: end of batch {}; got log keys: {}".format(batch, keys))
def on_test_batch_begin(self, batch, logs=None):
keys = list(logs.keys())
print("...Evaluating: start of batch {}; got log keys: {}".format(batch, keys))
def on_test_batch_end(self, batch, logs=None):
keys = list(logs.keys())
print("...Evaluating: end of batch {}; got log keys: {}".format(batch, keys))
Вы можете получить доступ к импульсу
batch = tf.keras.layers.BatchNormalization()
batch.momentum = 0.001
Внутри модели вы должны указать правильный слой
model.layers[1].momentum = 0.001
Вы можете найти более подробную информацию и пример в writing_your_own_callbacks
Комментарии:
1. Спасибо. Знаете ли вы, как получить доступ к параметру batch norm momentum вашей модели или, что еще лучше, к конкретным слоям в обратном вызове?
2. Я думаю, вы можете получить доступ через
self.model.layers
3. Извините, я прочитал импульс, но я написал скорость обучения, я обновил свой ответ