Я использую оценщик 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?