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
个赞
请登录后评论
TOP
切换版块
第一个问题已经解决
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