Замораживание и размораживание сетевых слоев в TF Estimator

Я использую оценщик TF для обучения моей модели на наборе данных. Для первых нескольких итераций обучения я хочу заморозить определенные слои в сети. Для оставшихся итераций я хочу разморозить эти слои.

Я нашел несколько решений, в которых у нас есть два разных оптимизатора train_ops в файле model_fn оценщика.

def ModelFunction(features, labels, mode, params):
    if mode == tf.estimator.ModeKeys.TRAIN:
        layerTrainingVars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "LayerName")
        #Train Op for freezing layers
        freeze_train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step(), var_list=layerTrainingVars)
        #Train Op for training all layers
        train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
        #Based on whether we want to freeze or not, we send the corresponding train_op to the estimatorSpec. How do I do this?
        estimatorSpec = tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=freeze_train_op)

    return estimatorSpec

Для приведенного выше решения соответствующий EstimatorSpec может быть возвращен на основе train_op. Я попытался использовать freeze_train_op для нескольких итераций обучения, а затем убить процесс и изменить train_op, чтобы не было замораживания слоев в коде. После этого появляется ошибка контрольной точки, в которой говорится, что графики / переменные, сохраненные в контрольных точках, отличаются. Я предполагаю, что первая серия итераций не сохранила замороженные слои. Как программно переключить train_ops, чтобы контрольные точки тоже работали?

Есть ли лучший способ заморозить / разморозить слои для обучения в TF.Estmator?


person sskkgg    schedule 26.12.2018    source источник


Ответы (1)


Вы можете вернуть 2 train_op, сгруппировав их вместе.

def ModelFunction(features, labels, mode, params):
    if mode == tf.estimator.ModeKeys.TRAIN:
        layerTrainingVars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "LayerName")
        #Train Op for freezing layers
        freeze_train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step(), var_list=layerTrainingVars)
        #Train Op for training all layers
        train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
        estimatorSpec = tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=tf.group(freeze_train_op, train_op))

    return estimatorSpec

Но это не будет учитывать разные итерации. Если вы хотите обучать разный набор переменных на разных итерациях и не хотите останавливать обучение и загружать веса с контрольной точки, вам необходимо использовать сеанс. API-интерфейс оценщика не позволяет управлять сеансом.

person Sharky    schedule 21.02.2019