2017-06-22 609 views
4

我想加载预先训练的模型(由AdadeltaOptimizer优化)并继续使用SGD(GradientDescentOptimizer)进行培训。该模型被保存,加载tensorlayer APITensorflow加载预先训练的模型使用不同的优化器

保存模型:

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,则培训损失将与新初始化的模型一样大。

我看了一下tl.files.save_npzmodel-xxx.npz文件。它只会将所有模型参数保存为ndarray。我不确定优化程序或学习率如何涉及此处。

回答

1

您可能不得不将张量导入变量中,该变量是损失函数/交叉熵,它馈送给您的Adam优化器以前的。现在,只需通过您的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) 

在这种情况下,我已标记的训练我pretrain模型名称entropy前交叉熵张量,因此

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

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

+0

感谢您的回答。但我很困惑,为什么我必须导入张量,“它计算以前在Adam Optimizer上的损失”。无论优化器如何,在相同的模型参数下,损失应该是相同的,对吧? –

+0

我对我的答案做了修改,希望这个更清楚。实际上,我只是将优化器的类型从Adam更改为SGD。 –

0

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

save_npz([save_list, name, sess]) 

save_list你指定唯一不包含的优化参数,因此没有学习率或任何其他优化参数的网络参数。

如果你想保存当前学习率(以使用完全相同的学习速度在恢复模式),你必须把它添加到save_list,这样的:

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

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

既然你想改变优化,我建议你保存learning_rate仅作为优化参数,而不是任何其他变量的优化造成的。 以这种方式,你将能够改变优化器并恢复模型,否则(如果您将任何其他变量放入您的检查点),您尝试恢复的图形将无法找到保存的值所在的变量,您将无法更改它。

+0

面对我只保存了'network.all_params',它不包含adadelta创建的任何其他变量,对吗?我也没有保存学习率,但在恢复模型后为SGD分配初始学习率。 –

相关问题