Debugging

While it is often the case that a network works perfectly on the first try, bugs do happen.

Gradient checking

If you add your own expression operations, you can debug the automatic differentiation using:

check_gradients(e)

Printing expressions

If you print out an Expression object, you’ll see the top-level operation in the expression. You won’t see its value, or even its shape/dtype:

>>> print constant(1)+constant(1)
add(<0>, <0>)

However, there’s (usually) no harm in calling compute_value in the middle of your code:

>>> print compute_value(constant(1)+constant(1))
2

This will compute the value of x and all its subexpressions, and return the value of x.

Tracing

debug.trace = True

This lets you see the value and gradient of every subexpression:

>>> compute_value(constant(1)+constant(1))
<0> = constant(1) = array(1)
<1> = constant(1) = array(1)
<2> = add(<0>, <1>) = 2
2

Expression tracebacks

debug.stack = True

If an exception is raised while computing a value or gradient, the usual traceback is not very helpful. This option turns on an “expression traceback” that shows you the line that created the offending expression.