gpt4 book ai didi

TensorFlow 自定义估算器 - 在 model_fn 中进行小幅更改后恢复模型

转载 作者:行者123 更新时间:2023-12-04 11:47:29 24 4
gpt4 key购买 nike

我正在使用 tf.estimator.Estimator用于开发我的模型,

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

我不想从头开始训练,我想从50,000个检查点恢复所有旧变量,并从这一点继续训练。当我尝试这样做时,我得到了 NotFoundError
如何使用 tf.estimator.Estimator 完成此操作?

最佳答案

TL;博士 从前一个检查点加载变量的最简单方法是使用函数 tf.train.init_from_checkpoint() .只需在 model_fn 中调用此函数一次您的 Estimator 将覆盖相应变量的初始值设定项。

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

更详细地说,假设您已经在 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带有三个隐藏层。我们要加载前两个隐藏层的权重 h1h2 .我们使用 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)
assignment_map将从作用域中加载每个变量 h1/在检查点进入新的作用域 h1/ , 与 h2/ 相同.不要忘记 /最后让 TensorFlow 知道它是一个可变范围。

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

关于TensorFlow 自定义估算器 - 在 model_fn 中进行小幅更改后恢复模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48067677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com