TensorFlow Custom Estimator - 在 model_fn 发生微小变化后恢复模型

2024-04-01

我在用tf.estimator.Estimator为了开发我的模型,

我写了一个model_fn并训练了 50,000 次迭代,现在我想对我的model_fn,例如添加一个新层。

我不想从头开始训练,我想恢复 50,000 个检查点的所有旧变量,并从这一点继续训练。当我尝试这样做时,我得到了NotFoundError

如何做到这一点tf.estimator.Estimator?


TL;DR从前一个检查点加载变量的最简单方法是使用该函数tf.train.init_from_checkpoint() https://www.tensorflow.org/api_docs/python/tf/train/init_from_checkpoint。只需调用一次该函数即可model_fn您的估算器将覆盖相应变量的初始值设定项。


第一个具有两个隐藏层的模型

更详细地说,假设您已经在 MNIST 上训练了第一个具有两个隐藏层的模型,名为model_fn_1。权重保存在目录中mnist_1.

def model_fn_1(features, labels, mode):
    images = features['image']

    h1 = tf.layers.dense(images, 100, activation=tf.nn.relu, name="h1")
    h2 = tf.layers.dense(h1, 100, activation=tf.nn.relu, name="h2")

    logits = tf.layers.dense(h2, 10, name="logits")

    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

    optimizer = tf.train.GradientDescentOptimizer(0.01)
    train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())

    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

# Estimator 1: two hidden layers
estimator_1 = tf.estimator.Estimator(model_fn_1, model_dir='mnist_1')

estimator_1.train(input_fn=train_input_fn, steps=1000)

具有三个隐藏层的第二个模型

现在我们要训练一个新模型model_fn_2具有三个隐藏层。我们要加载前两个隐藏层的权重h1and h2。我们用tf.train.init_from_checkpoint()去做这个:

def model_fn_2(features, labels, mode, params):
    images = features['image']

    h1 = tf.layers.dense(images, 100, activation=tf.nn.relu, name="h1")
    h2 = tf.layers.dense(h1, 100, activation=tf.nn.relu, name="h2")
    h3 = tf.layers.dense(h2, 100, activation=tf.nn.relu, name="h3")

    assignment_map = {
        'h1/': 'h1/',
        'h2/': 'h2/'
    }
    tf.train.init_from_checkpoint('mnist_1', assignment_map)

    logits = tf.layers.dense(h3, 10, name="logits")

    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

    optimizer = tf.train.GradientDescentOptimizer(0.01)
    train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())

    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

# Estimator 2: three hidden layers
estimator_2 = tf.estimator.Estimator(model_fn_2, model_dir='mnist_2')

estimator_2.train(input_fn=train_input_fn, steps=1000)

The assignment_map将从范围加载每个变量h1/在检查点进入新范围h1/,并且与相同h2/。不要忘记/最后让 TensorFlow 知道它是一个变量范围。


我找不到使用预制估算器进行这项工作的方法,因为你无法更改它们model_fn.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow Custom Estimator - 在 model_fn 发生微小变化后恢复模型 的相关文章

随机推荐