首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow负载预训练模型使用不同的优化器

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

Stack Overflow用户
提问于 2017-06-22 23:19:29
回答 3查看 2.4K关注 0票数 4

我想加载一个预先训练的模型(由AdadeltaOptimizer优化)并继续使用SGD (GradientDescentOptimizer)进行培训。使用张力层API保存并加载模型。

保存模式:

代码语言:javascript
复制
import tensorlayer as tl
tl.files.save_npz(network.all_params,
                  name=model_dir + "model-%d.npz" % global_step)

负荷模型:

代码语言:javascript
复制
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_npztl.files.save_npz文件。它只将所有模型参数保存为ndarray。我不知道优化器或学习率在这里是如何实现的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-23 02:11:29

您可能需要将张量导入一个变量中,这是损失函数/交叉熵,它输入到亚当优化器之前的中。现在,只需通过SGD优化器将其输入。

代码语言:javascript
复制
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这个名字标记了交叉熵张量。

代码语言:javascript
复制
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv), name = 'entropy')

如果您无法更改您的预训练模型,您可以从graph中获得模型中的张量列表(在导入它之后),并推断您需要哪个张量。我没有接触过Tensorlayer的经验,所以本指南将提供更多的理解。你可以看看感光层,他们应该解释如何获得你的张量。由于Tensorlayer构建在Tensorflow之上,大部分功能仍然可用。

票数 2
EN

Stack Overflow用户

发布于 2017-06-23 07:18:47

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

代码语言:javascript
复制
save_npz([save_list, name, sess])

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

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

代码语言:javascript
复制
save_npz(network.all_params.extend([learning_rate])

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

由于您希望更改优化器,我建议您只将learning_rate保存为优化器参数,而不保存优化器创建的任何其他变量。这样,您就可以更改优化器并恢复模型,否则(如果您在检查点中放置任何其他变量),您尝试还原的图形将找不到保存值所在的变量,也无法更改它。

票数 1
EN

Stack Overflow用户

发布于 2019-08-08 03:19:52

Advance.html#预训-cnn

代码语言:javascript
复制
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版本,请使用以下内容

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44710772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档