paddle如何获取参数梯度?
Kangkung888 发布于2019-08 浏览:3373 回复:1
0
收藏

1) paddle中获取到所有layer的训练参数及其梯度. 类似于tensorflow中的

    trainable_vars = tf.trainable_variables()

    grads = tf.gradients(self.loss, trainable_vars)
   grads_value = self.session.run(grads,feed_dict={self.X_input: X,self.t_input: y,self.keep_prop: float(keeps)})

2)paddle中是否由类似于tensorflow的eval函数,使用更方便

   使用fluid.global_scop().find_var('global_step').get_tensor()貌似存在如下问题:

   self.global_step = fluid.layers.create_global_var(shape=[1],value=0,dtype='int64',persistable=True,name='global_step')
   self.global_step = fluid.layers.sums([self.global_step,fluid.layers.fill_constant([1],dtype='int64',value=1)])

   在第二步赋值后,因为self.global_step的name已经变化了,所以用find_var('global_step')时,得到的是初始值0!

收藏
点赞
0
个赞
共1条回复 最后由用户已被禁言回复于2022-04
#2Kangkung888回复于2019-08

第一个问题已经解决

trainable_vars = list(filter(self.is_trainable, self.main_program.list_vars()))
vars,grads = self.run_gradient(trainable_vars,X,y,self.keeps)
for trainable_var,var,grad in zip(trainable_vars,vars,grads):
print('\tdebug:%s'%trainable_var.name,
'\tshape=',trainable_var.shape,
'\tdata.mean=%.6f'%var.mean(),
'\tgrad.mean=%.6f' % grad.mean(),
'\tdata.std=%.6f'%var.std(),
'\tgrad.std=%.6f'%grad.std())

def run_gradient(self,trainable_vars,X,y,keeps):
    vars_value = []
    for var in trainable_vars :
        var_value = fluid.global_scope().find_var(var.name).get_tensor()  
        vars_value.append(np.array(var_value))
    grads = fluid.gradients(self.loss, trainable_vars)
    grads = self.executor.run(self.main_program,feed={self.X_input.name:X,self.t_input.name:y},
               fetch_list=grads)
    return vars_value,grads

1
TOP
切换版块