我的代码中有一个错误,但由于theano的工作方式很难找到确切的原因。
根据例外详细信息中的提示,我设置了theano.config.optimizer='None'
和theano.config.exception_verbosity='high'
,但这并不足以告诉我。
在我的情况下,例如,两个张量之间的点积存在问题。堆栈跟踪引导我经历了很多并且到了一个特定的函数,它似乎包含在其中某个地方,对theano.tensor.dot
的有问题的调用,但是我找不到代码的确切部分,因为我'在尝试通过keras实现事情时,它变得更加复杂和纠结。
有没有办法获得有关应用节点的更多详细信息?我已经尝试使用StepMode,因为它似乎附加到节点上,但如果有一种方法可以使该工具打印出执行节点中代码的确切行,我不知道这是什么。当问题发生时,我尝试使用它来打印堆栈跟踪,但它打印的异常堆栈跟踪与异常相同。
答案 0 :(得分:1)
如果您想在代码中找到使用theano.tensor.dot
的位置,可以使用traceback.print_stack
的包装代码对其进行monkeypatch:
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的方法可以让你做类似的事情。
答案 1 :(得分:0)
你应该尝试使用theano test_values。这样,异常将在错误发生的行上准确引发,而不是在编译图形之后引发。
您需要将theano.config.compute_test_value
标志更改为'raise'
,以便在没有test_value的输入张量时出现错误,以确保所有测试计算都将传播到发生错误的地方。