def get_output_for(self, upscaled, **kwargs):
a, b = self.scale_factor
# get output for pooling and pre-pooling layer
inp, out =\
lasagne.layers.get_output([self.pool2d_layer_in,
self.pool2d_layer])
# upscale the input feature map by scale_factor
if b > 1:
upscaled = T.extra_ops.repeat(upscaled, b, 3)
if a > 1:
upscaled = T.extra_ops.repeat(upscaled, a, 2)
# get the shapes for pre-pooling layer and upscaled layer
sh_pool2d_in = T.shape(inp)
sh_upscaled = T.shape(upscaled)
# in case the shape is different left-bottom-pad with zero
tmp = T.zeros(sh_pool2d_in)
indx = (slice(None),
slice(None),
slice(0, sh_upscaled[2]),
slice(0, sh_upscaled[3]))
upscaled = T.set_subtensor(tmp[indx], upscaled)
# get max pool indices
indices_pool = T.grad(None, wrt=inp,
known_grads={out: T.ones_like(out)})
# mask values using indices_pool
f = indices_pool * upscaled
return f
评论列表
文章目录