提交 577f8920 authored 作者: Ian Goodfellow's avatar Ian Goodfellow

fix for infer_shape of ConvTransp3D earlier today was not correct, this is the correct fix

added feature where Conv3D ops give names to their gradients
上级 5caaeb82
......@@ -81,6 +81,33 @@ class Conv3D(theano.Op):
dCdW = ConvGrad3D.convGrad3D(V,d,WShape,dCdH)
dCdb = T.sum(dCdH, axis=(0,1,2,3))
dCdd = None #not differentiable, since d is not continuous
if 'name' in dir(dCdH) and dCdH.name != None:
dCdH_name = dCdH.name
else:
dCdH_name = 'anon'
if 'name' in dir(V) and V.name != None:
V_name = V.name
else:
V_name = 'anon'
if 'name' in dir(W) and W.name != None:
W_name = W.name
else:
W_name = 'anon'
if 'name' in dir(b) and b.name != None:
b_name = b.name
else:
b_name = 'anon'
dCdV.name = 'Conv3D_dCdV.dCdH='+dCdH_name+',V='+V_name
dCdW.name = 'Conv3D_dCdW.dCdH='+dCdH_name+',V='+V_name+',W='+W_name
dCdb.name = 'Conv3D_dCdb.dCdH='+dCdH_name+',V='+V_name+',W='+W_name+',b='+b_name
return [ dCdV, dCdW, dCdb, dCdd ]
def perform(self, node, inputs, output_storage):
......@@ -181,7 +208,7 @@ class Conv3D(theano.Op):
if (%(W)s->dimensions[4] != inputChannels)
{
PyErr_Format(PyExc_ValueError, "Conv3D: W operates on a %%ld channel image but the image has %%d channels.",%(W)s->dimensions[4],inputChannels);
PyErr_Format(PyExc_ValueError, "Conv3D: W operates on a %%ld channel image but the image has %%d channels. Overall shape of input: (%%ld,%%ld,%%ld,%%ld,%%ld)",%(W)s->dimensions[4],inputChannels, %(V)s->dimensions[0], %(V)s->dimensions[1], %(V)s->dimensions[2], %(V)s->dimensions[3], %(V)s->dimensions[4]);
%(fail)s
}
......
......@@ -37,18 +37,45 @@ class ConvTransp3D(theano.Op):
def infer_shape(self, node, input_shapes):
W,b,d,H,RShape = node.inputs
W_shape, b_shape, d_shape, H_shape, RShape_shape = input_shapes
return [(H_shape[0], RShape[0], RShape[1], RShape[2], W_shape[1])]
return [(H_shape[0], RShape[0], RShape[1], RShape[2], W_shape[4])]
def grad(self,inputs, output_gradients):
W,b,d,H, RShape = inputs
dCdR ,= output_gradients
dCdH = conv3D( dCdR, W, T.zeros_like(H[0,0,0,0,:]), d)
WShape = W.shape
dCdW = convGrad3D(dCdR,d,WShape,H)
dCdb = T.sum(dCdR,axis=(0,1,2,3))
dCdd = None #not differentiable, since d is not continuous
dCdRShape = None #not differentiable, since RShape is not continuous
return [ dCdW, dCdb, dCdd, dCdH, RShape ]
W,b,d,H, RShape = inputs
dCdR ,= output_gradients
dCdH = conv3D( dCdR, W, T.zeros_like(H[0,0,0,0,:]), d)
WShape = W.shape
dCdW = convGrad3D(dCdR,d,WShape,H)
dCdb = T.sum(dCdR,axis=(0,1,2,3))
dCdd = None #not differentiable, since d is not continuous
dCdRShape = None #not differentiable, since RShape is not continuous
if 'name' in dir(dCdR) and dCdR.name != None:
dCdR_name = dCdR.name
else:
dCdR_name = 'anon'
if 'name' in dir(H) and H.name != None:
H_name = H.name
else:
H_name = 'anon'
if 'name' in dir(W) and W.name != None:
W_name = W.name
else:
W_name = 'anon'
if 'name' in dir(b) and b.name != None:
b_name = b.name
else:
b_name = 'anon'
dCdW.name = 'ConvTransp3D_dCdW.H='+H_name+',dCdR='+dCdR_name+',W='+W_name
dCdb.name = 'ConvTransp3D_dCdb.H='+H_name+',dCdR='+dCdR_name+',W='+W_name+',b='+b_name
dCdH.name = 'ConvTransp3D_dCdH.H='+H_name+',dCdR='+dCdR_name
return [ dCdW, dCdb, dCdd, dCdH, dCdRShape ]
def perform(self, node, inputs, output_storage):
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论