解开 Theano 错误的原因

Untangling the cause of an error in Theano

我的代码中有一个错误,但由于 theano 的工作方式,很难找到它的确切原因。

按照异常详细信息中的提示,我设置了 theano.config.optimizer='None'theano.config.exception_verbosity='high',但这还不够。

例如,在我的例子中,两个张量之间的点积存在问题。堆栈跟踪引导我完成了很多工作,并引导我找到了一个似乎包含在其中的特定函数,在某个地方,对 theano.tensor.dot 的有问题的调用,但我找不到那部分代码的确切位置,因为我'我试图通过keras实现一些东西,它变得更加复杂和纠结。

有什么方法可以获取有关应用节点的更多详细信息?我试过使用 StepMode,因为它似乎附加到节点上,但如果有办法让该工具打印出执行节点中代码的确切行,我不知道这是什么。我尝试在问题发生时使用它来打印堆栈跟踪,但它打印的堆栈跟踪与异常几乎相同。

如果您想在代码中找到使用 theano.tensor.dot 的位置,您可以使用使用 traceback.print_stack:

的包装代码对其进行猴子修补
import traceback
original_dot = theano.tensor.dot

def debug_wrapper(*args,**kw):
    traceback.print_stack()
    return original_dot(*args,**kw)
theano.tensor.dot = debug_wrapper

这样,任何时候 theano.tensor.dot 被调用时(在它被修补之后)它都会像回溯消息中的那样向您显示堆栈,并且仍然执行它的工作。请注意,我对 theano 不是很熟悉,所以这是一个通用的 python 调试解决方案,可能有特定于 theano 的方法可以让你做类似的事情。

你应该尝试使用 theano test_values。这样,异常将在错误发生的行上引发,而不是在图形编译之后。

您需要将 theano.config.compute_test_value 标志更改为 'raise' 以便在输入张量没有 test_value 时出现错误,以确保所有测试计算将传播到发生错误的位置。