4

我想加载一个预训练模型(由 AdadeltaOptimizer 优化)并继续使用 SGD(GradientDescentOptimizer)进行训练。模型使用tensorlayer API保存和加载:

保存模型:

import tensorlayer as tl
tl.files.save_npz(network.all_params,
                  name=model_dir + "model-%d.npz" % global_step)

负载模型:

load_params = tl.files.load_npz(path=resume_dir + '/', name=model_name)
tl.files.assign_params(sess, load_params, network)

如果我继续使用 adadelta 进行训练,训练损失(交叉熵)看起来很正常(从加载模型的接近值开始)。但是,如果我将优化器更改为 SGD,训练损失将与新初始化的模型一样大。

model-xxx.npztl.files.save_npz. 它仅将所有模型参数保存为 ndarray。我不确定优化器或学习率是如何在这里涉及的。

4

3 回答 3

2

您可能必须将张量导入一个变量,该变量是先前输入 Adam Optimizer 的损失函数/交叉熵。现在,只需通过您的 SGD 优化器提供它。

saver = tf.train.import_meta_graph('filename.meta')
saver.restore(sess,tf.train.latest_checkpoint('./'))
graph = tf.get_default_graph()
cross_entropy = graph.get_tensor_by_name("entropy:0") #Tensor to import

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)

在这种情况下,我在使用名称训练我的预训练模型之前标记了交叉熵张量entropy,因此

tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv), name = 'entropy')

如果您无法对预训练模型进行更改,您可以从中获取模型中的张量列表(在您导入之后)graph并推断出您需要的张量。我没有使用 Tensorlayer 的经验,因此本指南旨在提供更多的理解。你可以看看Tensorlayer-Layers,他们应该解释如何获得你的张量。由于 Tensorlayer 建立在 Tensorflow 之上,因此大部分功能应该仍然可用。

于 2017-06-23T02:11:29.277 回答
1

您可以指定要保存在检查点文件中的参数。

save_npz([save_list, name, sess])

save_list您仅指定不包含优化器参数的网络参数中,因此没有学习率或任何其他优化器参数。

如果要保存当前的学习率(以便在恢复模型时使用相同的准确学习率),则必须将其添加到 中save_list,如下所示:

save_npz(network.all_params.extend([learning_rate])

(我想那all_params是一个数组,我想我的假设是正确的。

由于您想更改优化器,我建议您将learning_rate唯一保存为优化器参数,而不是优化器创建的任何其他变量。这样,您将能够更改优化器并恢复模型,否则(如果您将检查点放入任何其他变量)您将尝试恢复的图形将找不到放置保存值的变量你将无法改变它。

于 2017-06-23T07:18:47.123 回答
0

https://tensorlayer.readthedocs.io/en/latest/user/get_start_advance.html#pre-trained-cnn

vgg = tl.models.vgg16(pretrained=True)
img = tl.vis.read_image('data/tiger.jpeg')
img = tl.prepro.imresize(img, (224, 224)).astype(np.float32) / 255
output = vgg(img, is_train=False)

对于 2.0 版本,使用这个

于 2019-08-08T03:19:52.157 回答