TLDR:是否有一种方法可以在运行时在时间t1冻结Tensorflow模型,以便从时间0到t2> t1运行网络会导致与从t1到t2运行网络完全相同的结果?
我已经搜索了很多,却找不到确切的情况:
我有一个tensorflow模型,该模型正在通过Datasets API从TFRecords列表中接收输入。在非常随机的时刻,我得到关于张量形状不兼容的错误,并且我试图找出原因。我已经更改了种子,以便代码可重现,但是大约需要30分钟才能发生可重现的错误。在这种情况下,更快地调试代码的最佳策略是什么?
我一直在尝试在每次迭代中保存一个检查点,希望通过恢复最后一个(在错误之前)我可以在以后快速重现错误并进行故障排除。不幸的是,当我这样做时,随机状态和数据集api指针会重置。有什么方法可以在运行时完全存储网络状态(包括其随机数生成器状态和Dataset API指针),以便在恢复网络时可以重现相同的输出?
答案 0 :(得分:1)
根据我的个人经验,我将通过以下方式进行处理。
运行带有-i
标志(python -i
)的代码,该脚本在脚本停止时将您带到具有保留状态的解释器,或者(甚至更好)从jupyter调用有问题的代码部分笔记本计算机,该笔记本计算机在出现异常后也将保留状态,您可以更轻松地调查问题所在。如果问题出在函数内部,则可以捕获异常并返回所有相关对象。或者,您也可以将函数放入类中以具有单个对象,从jupyter实例化并运行它,当问题发生时,您将在该类对象中包含所有变量。
为数据的形状和模型变量/占位符的形状添加assert
的语句。例如,如果您要进行一些预处理/增强,请在预处理/增强之前和之后添加assert
,以确保形状符合预期。
休息一下。有时您会花很多时间和精力去做一些没有成功的事情,但是休息一会后,您会立即解决问题。
祝你好运!