现在大家应该用的都是tensorflow 2.0 以上版本, 这个笔记针对的就是tf2的调试。
之前全网搜了很多keras的调试方法, 根本不得要领, 把简单的事情弄复杂, 很是误人子弟。

其实, 只需要一句话, 就可以把keras当成pytorch了,极易调试。
tf.config.experimental_run_functions_eagerly(True) 什么是调试? 比如我想自定义一个损失函数, 比如:

def my_loss(y_true, y_pred):
    return 10000 * (y_true - y_pred) ** 2

显然,很多时候我并不能一次就写对, 因此我希望能进入到函数中去, 用一例实际的y_true 和 y_pred, 进行调试,通过数值帮助我验证我代码逻辑的准确性。

理想很丰满, 现实很骨感。
如果你直接使用以下的代码

model.compile(optimizer=opt, loss=my_loss)
model.fit(data, data)

然后你这样的打上断点进行debug:

将keras迁移到pytorch keras模型转pytorch_tensorflow


虽然你可以成功的进入到函数中,但结果是:

将keras迁移到pytorch keras模型转pytorch_tensorflow_02


所有数据都是None, 这是因为你只建立了一个图, 没有实际的数据, 而面对一堆None数据, 你如何调试? 你都不知道错误在哪, 这断点不如不打。这就是我想强调的问题所在!tf2.0号称默认动态图, 但其实调试的时候还是以类似静态图的方式进行的

所以, 需要手动在代码开始的时候加入一句:

tf.config.experimental_run_functions_eagerly(True) 就可以了!

将keras迁移到pytorch keras模型转pytorch_tensorflow_03


可以看到, 同样的断点, 在加了使用动态图的上面这句代码后, 每次调试的时候, 就不再是None, 而是具体的数值了!

同时,你可以随意的在debug console里进行各种交互:

将keras迁移到pytorch keras模型转pytorch_数据_04


点击console 和 debug按钮, 就可以进入交互模式, 这个的效果是和 matlab的断点后在命令行进行调试是完全一样, 我觉得是做数据研究必备的!

什么? 动态图影响了运行速度? 你调试完代码成功后注释掉不就行了!

不够pytorch? 想看哪一层的输出, 在那一层后面插一个lambda层, 然后断点在lambda层里就可以了!
觉得太轻松?
参考下tensorflow的这个例程吧, 配合这个动态图调试, 和pytorch几乎一模一样了!