发新帖

keras优化算法过程中参数打印

[复制链接]
961 3

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x

想在keras Adadelta优化算法代码处增加一些print信息 打印出过程中参数的变化情况
但print new_p的时候提示如下错误, 应该怎么打印出new_p呢

yunhai_luo已获得悬赏 10 金币+30 金币

最佳答案

new_p是tensor而不是variable,keras.backend.get_value主要针对的是variable。对于计算图而言,终端输出可以优先考虑使用特定的print函数,对于tensorflow来说是tf.Print,对于keras来说是keras.backend.print_tens ...

Keras Adadelta中增加print

Keras Adadelta中增加print

程序报错

程序报错
本楼点评(1) 收起

精彩评论3

yunhai_luo  TF豆豆  发表于 2018-5-9 06:32:24 | 显示全部楼层
本帖最后由 yunhai_luo 于 2018-5-9 06:44 编辑

new_p是tensor而不是variable,keras.backend.get_value主要针对的是variable。对于计算图而言,终端输出可以优先考虑使用特定的print函数,对于tensorflow来说是tf.Print,对于keras来说是keras.backend.print_tensor。按照你的做法使用print(K.get_value(p))得到的是计算图计算前的变量值,也就是构建模型时初始化的值,应该不会得到你所说的“过程中参数的变化情况”。就你想要写的代码而言,你可以使用下面的方法,在每一次训练时得到当次训练的参数(p)和下次训练的参数(即优化后的new_p):
  1. class Adadelta(Optimizer):
  2.     """Adadelta optimizer.
  3.     ...
  4.     """

  5.     ...

  6.     def get_updates(self, loss, params):
  7.         ...

  8.         for p, g, a, d_a in zip(params, grads, accumulators, delta_accumulators):
  9.             old_p = K.print_tensor(p, message='{}: '.format(p.name))
  10.             self.updates.append(K.update(p, old_p))

  11.             # update accumulator
  12.             ...

  13.             # Apply constraints.
  14.             if getattr(p, 'constraint', None) is not None:
  15.                 new_p = p.constraint(new_p)

  16.             new_p = K.print_tensor(new_p, message='{}: '.format(new_p.name))
  17.             self.updates.append(K.update(p, new_p))

  18.             # update delta_accumulator
  19.             new_d_a = self.rho * d_a + (1 - self.rho) * K.square(update)
  20.             self.updates.append(K.update(d_a, new_d_a))
  21.         return self.updates
复制代码

多说一句,我不是很确定你想要做什么,但我的这个做法仅供参考。这种做法(尤其是增加对p的自我赋值)虽然对于模型本身应该并没有影响,但并不好;当然,我的代码逻辑也不是很强,可能还有更优美的做法,希望高人出手指教。就我的这个做法而言,把print加入优化器中会导致每一步都输出模型中所有的可训练变量一次,特别是当你需要训练上千上万次时,输出量极大,可读性不高。取决于你的目的,感觉可以考虑其他做法。


本楼点评(2) 收起
  • Myy非常感谢您的回答,目前答案已经满足我的需求。
    我这边这样做的原因是:
    我自己实现了Adadelta算法,在和keras结果对比时发现有一定差距,因此我想打印出keras Adadelta函数每一步的计算结果和我自己的结果对比下看看问题出在哪里,打印的信息包括p, g, a,d_a以及他们更新后的数值。我现在控制训练数据只有一条,所以打印出来的结果可以一一对比。
    2018-5-9 11:13 回复
  • yunhai_luo回复 Myy :谢谢你的解释!明白了,如果是这样那恐怕改keras源代码还比较方便,其他方法确实很难涵盖你想要看的所有参变量。
    2018-5-9 12:27 回复
jka  TF荚荚  发表于 2018-7-4 11:10:20 | 显示全部楼层
学习一下
本楼点评(0) 收起
neverchange  TF豆豆  发表于 2018-7-4 15:55:54 | 显示全部楼层
keras只测试的话,用keras.backend.print_tensor,需要避免太多的打印
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

主题

帖子

11

积分
快速回复 返回顶部 返回列表