提交 38515281 authored 作者: Ian Goodfellow's avatar Ian Goodfellow

rearranged _traverse to be easier to read

上级 d9df2be5
...@@ -213,67 +213,68 @@ def Rop(f, wrt, eval_points): ...@@ -213,67 +213,68 @@ def Rop(f, wrt, eval_points):
def _traverse(node): def _traverse(node):
""" TODO: writeme """ """ TODO: writeme """
if node is None: if node is None:
return None return
else:
op = node.op
inputs = node.inputs
# Compute the evaluation points corresponding to each of the op = node.op
# inputs of the node inputs = node.inputs
local_eval_points = []
for inp in inputs:
if inp in wrt:
local_eval_points.append(eval_points[wrt.index(inp)])
elif inp.owner is None:
try:
local_eval_points.append(inp.zeros_like())
except:
# None should be used for non-differentiable
# arguments, like for example random states
local_eval_points.append(None)
elif inp.owner in seen_nodes:
local_eval_points.append(
seen_nodes[inp.owner][inp.owner.outputs.index(inp)])
else: # Compute the evaluation points corresponding to each of the
# We actually need to compute the R_op for this node # inputs of the node
local_eval_points = []
_traverse(inp.owner) for inp in inputs:
local_eval_points.append( if inp in wrt:
seen_nodes[inp.owner][inp.owner.outputs.index(inp)]) local_eval_points.append(eval_points[wrt.index(inp)])
same_type_eval_points = [] elif inp.owner is None:
for x, y in zip(inputs, local_eval_points): try:
if y is not None: local_eval_points.append(inp.zeros_like())
if not isinstance(x, gof.Variable): except:
x = as_tensor_variable(x) # None should be used for non-differentiable
if not isinstance(y, gof.Variable): # arguments, like for example random states
y = as_tensor_variable(y) local_eval_points.append(None)
try: elif inp.owner in seen_nodes:
y = x.type.filter_variable(y)
except TypeError: local_eval_points.append(
# This is a hack seen_nodes[inp.owner][inp.owner.outputs.index(inp)])
# Originally both grad and Rop were written
# with the assumption that a variable and the else:
# gradient wrt that variable would have the same # We actually need to compute the R_op for this node
# dtype. This was a bad assumption because the
# gradient wrt an integer can take on non-integer _traverse(inp.owner)
# values. local_eval_points.append(
# grad is now fixed, but Rop is not, so when grad seen_nodes[inp.owner][inp.owner.outputs.index(inp)])
# does the right thing and violates this assumption same_type_eval_points = []
# we have to make it be wrong for Rop to keep working for x, y in zip(inputs, local_eval_points):
# Rop should eventually be upgraded to handle integers if y is not None:
# correctly, the same as grad if not isinstance(x, gof.Variable):
y = theano.tensor.cast(y,x.type.dtype) x = as_tensor_variable(x)
y = x.type.filter_variable(y) if not isinstance(y, gof.Variable):
assert x.type == y.type y = as_tensor_variable(y)
same_type_eval_points.append(y) try:
else: y = x.type.filter_variable(y)
same_type_eval_points.append(y) except TypeError:
# This is a hack
# Originally both grad and Rop were written
# with the assumption that a variable and the
# gradient wrt that variable would have the same
# dtype. This was a bad assumption because the
# gradient wrt an integer can take on non-integer
# values.
# grad is now fixed, but Rop is not, so when grad
# does the right thing and violates this assumption
# we have to make it be wrong for Rop to keep working
# Rop should eventually be upgraded to handle integers
# correctly, the same as grad
y = theano.tensor.cast(y,x.type.dtype)
y = x.type.filter_variable(y)
assert x.type == y.type
same_type_eval_points.append(y)
else:
same_type_eval_points.append(y)
seen_nodes[node] = op.R_op(node.inputs, same_type_eval_points) seen_nodes[node] = op.R_op(node.inputs, same_type_eval_points)
return None #end _traverse
# Populate the dictionary # Populate the dictionary
for out in f: for out in f:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论