首页 Paddle框架 帖子详情
无法动态调整训练过程中的学习率
收藏
快速回复
Paddle框架 问答深度学习模型训练 1947 6
无法动态调整训练过程中的学习率
收藏
快速回复
Paddle框架 问答深度学习模型训练 1947 6

试图在训练过程中动态的调整学习率, 但是失败了,实验方式如下:

lr_layer = fluid.layers.piecewise_decay(boundaries=bd, values=lr)
optimizer = fluid.optimizer.Momentum(
learning_rate=lr_layer,
momentum=0.9,
regularization=fluid.regularizer.L2Decay(1e-4))

#通过find_var(lr_name).get_tensor 获取到学习率变量并重置
lr_tensor = fluid.global_scope().find_var(lr_name).get_tensor()
print 'before', np.array(lr_tensor)
cur_lr = 3000
cur_lr_np = np.array([cur_lr])
lr_tensor.set(cur_lr_np, place)
print 'set lr', lr_name, cur_lr_np
#这里显示设置成功了
print 'after', np.array(lr_tensor)

#但是实际通过optimizer._global_learning_rate() 得到的还是之前的值

print optimizer._global_learning_rate()

0
收藏
回复
全部评论(6)
时间顺序
AIStudio791597
#2 回复于2019-12

lr_tensor = fluid.global_scope().find_var(lr_name).get_tensor() 这种是静态图获取lr的办法,
你可以通过 lr_layer.step() 来获取到lr的值

0
回复
AIStudio791375
#3 回复于2019-12

lr_tensor = fluid.global_scope().find_var(lr_name).get_tensor() 这种是静态图获取lr的办法,
你可以通过 lr_layer.step() 来获取到lr的值

对,我是想在静态图中训练过程中去设置 lr, 而不是训练开始就预设好整个训练流程的 lr

0
回复
AIStudio791421
#4 回复于2019-12

您的设置方法应该是没有问题的,您可以在每步训练后exe.run(fetch_list=[lr_name, ...])把学习率fetch出来看,应该是设置成功的。

0
回复
AIStudio791375
#5 回复于2019-12
@sneaxiy

您的设置方法应该是没有问题的,您可以在每步训练后exe.run(fetch_list=[lr_name, ...])把学习率fetch出来看,应该是设置成功的。

事实上并没有起作用, fetch出来的结果还是设置之前的值
image

0
回复
AIStudio791421
#6 回复于2019-12
@xuzhm

您的代码里为什么要写 fluid.layers.piecewise_decay()?这个LR Decay会覆盖你设置的学习率。您尝试使用以下代码试试:

import paddle.fluid as fluid
import numpy as np

lr_layer = fluid.data(shape=[1], dtype='float32', name='lr_decay')
lr_layer.persistable = True

optimizer = fluid.optimizer.Momentum(
	learning_rate=lr_layer,
	momentum=0.9,
	regularization=fluid.regularizer.L2Decay(1e-4))

lr_name = lr_layer.name

place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

for idx in range(10):
    lr_val = np.array([(idx + 1)* 100]).astype('float32')
    if idx == 0:
        lr_val,  = exe.run(fluid.default_main_program(), feed={lr_name: lr_val}, fetch_list=[lr_name])
    else:
        lr_val,  = exe.run(fluid.default_main_program(), fetch_list=[lr_name])

    print(lr_val)
    lr_tensor = fluid.global_scope().find_var(lr_name).get_tensor()
    lr_tensor.set(np.array([(idx + 2)* 100]).astype('float32'), place)
0
回复
AIStudio791375
#7 回复于2019-12
@sneaxiy

ok , 现在正常了,tks.

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户