Tensorflow负载预训练模型使用不同的优化器

时间:2017-06-22 23:19:30

标签: optimization tensorflow pre-trained-model

我想加载预训练模型(由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.npz的{​​{1}}文件。它只将所有模型参数保存为ndarray。我不确定这里是如何涉及优化器或学习速率的。

3 个答案:

答案 0 :(得分: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)

在这种情况下,我在训练我的前列车模型之前标记了交叉熵Tensor,名称为entropy,因此

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

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

答案 1 :(得分:1)

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

save_npz([save_list, name, sess])

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

如果您想保存当前的学习率(为了在恢复模型时使用相同的学习率),您必须将其添加到save_list,如下所示:

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

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

由于您要更改优化程序,我建议您仅将learning_rate保存为优化程序参数,而不是优化程序创建的任何其他变量。 这样,您就可以更改优化器并恢复模型,否则(如果您将检查点放入任何其他变量),您尝试恢复的图形将无法找到变量在哪个地方保存了价值而你却无法改变它。

答案 2 :(得分: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版,请使用此