提交 db0bc6ca authored 作者: Pierre-Antoine Manzagol's avatar Pierre-Antoine Manzagol

Merge.

...@@ -94,6 +94,10 @@ def conv2d_offset(input, filters, image_shape=None, filter_shape=None, ...@@ -94,6 +94,10 @@ def conv2d_offset(input, filters, image_shape=None, filter_shape=None,
if not (subsample[0] > 1 or subsample[1] > 1): if not (subsample[0] > 1 or subsample[1] > 1):
raise ValueError('conv2d_offset requires subsampling.') raise ValueError('conv2d_offset requires subsampling.')
# Haven't thought about this case.
if numpy.any(numpy.array(subsample) > filter_shape[2:]):
raise ValueError('conv2d_offset subsample greater than filter shape. Not supported?')
# No offsets specified is interpreted as all offsets. # No offsets specified is interpreted as all offsets.
if len(offsets) == 0: if len(offsets) == 0:
offsets = [] offsets = []
...@@ -122,6 +126,7 @@ def conv2d_offset(input, filters, image_shape=None, filter_shape=None, ...@@ -122,6 +126,7 @@ def conv2d_offset(input, filters, image_shape=None, filter_shape=None,
# Determine number of filters per offset position. # Determine number of filters per offset position.
if (filter_shape[0] % len(offsets)) != 0: if (filter_shape[0] % len(offsets)) != 0:
print 'nfilts ', filter_shape[0], ' noffsets ', len(offsets)
raise ValueError('conv2d_offset: invalid number of filters wrt offsets.') raise ValueError('conv2d_offset: invalid number of filters wrt offsets.')
n_filters = filter_shape[0] / len(offsets) n_filters = filter_shape[0] / len(offsets)
sub_filter_shape = list(filter_shape) sub_filter_shape = list(filter_shape)
...@@ -144,7 +149,11 @@ def conv2d_offset(input, filters, image_shape=None, filter_shape=None, ...@@ -144,7 +149,11 @@ def conv2d_offset(input, filters, image_shape=None, filter_shape=None,
outputs.append(out) outputs.append(out)
# Join the outputs on the leading axis. # Join the outputs on the leading axis.
return tensor.join(1, *outputs) output = tensor.join(1, *outputs)
outshp = ConvOp.getOutputShape(sub_image_shape[2:], filter_shape[2:], subsample, border_mode)
return [output, outshp]
...@@ -204,7 +213,7 @@ class ConvOp(Op): ...@@ -204,7 +213,7 @@ class ConvOp(Op):
if mode=='valid': s = -1 if mode=='valid': s = -1
else: s = 1 else: s = 1
inshp, kshp = numpy.array(inshp), numpy.array(kshp) inshp, kshp = numpy.array(inshp), numpy.array(kshp)
return numpy.int64(numpy.ceil((inshp[1:] + s*kshp - s*1)/\ return numpy.int64(numpy.ceil((inshp + s*kshp - s*1)/\
numpy.array([dx,dy], dtype='float'))) numpy.array([dx,dy], dtype='float')))
...@@ -365,8 +374,8 @@ class ConvOp(Op): ...@@ -365,8 +374,8 @@ class ConvOp(Op):
self.unroll_kern=new self.unroll_kern=new
if all_shape: if all_shape:
self.outshp = ConvOp.getOutputShape(self.imshp_logical, self.kshp_logical, (dx,dy), output_mode) self.outshp = ConvOp.getOutputShape(self.imshp_logical[1:], self.kshp_logical, (dx,dy), output_mode)
self.fulloutshp = ConvOp.getOutputShape(self.imshp_logical, self.kshp_logical, (1,1), output_mode) self.fulloutshp = ConvOp.getOutputShape(self.imshp_logical[1:], self.kshp_logical, (1,1), output_mode)
else: else:
self.outshp = None self.outshp = None
self.fulloutshp = None self.fulloutshp = None
...@@ -502,7 +511,7 @@ class ConvOp(Op): ...@@ -502,7 +511,7 @@ class ConvOp(Op):
if self.fulloutshp is not None: if self.fulloutshp is not None:
fulloutshp = tuple(self.fulloutshp) fulloutshp = tuple(self.fulloutshp)
else: else:
fulloutshp = tuple(ConvOp.getOutputShape(imshp_logical, kshp_logical, (1,1), self.out_mode)) fulloutshp = tuple(ConvOp.getOutputShape(imshp_logical[1:], kshp_logical, (1,1), self.out_mode))
if z[0] is None or z[0].shape!=(bsize,)+(nkern,)+fulloutshp: if z[0] is None or z[0].shape!=(bsize,)+(nkern,)+fulloutshp:
z[0] = numpy.zeros((bsize,)+(nkern,)+fulloutshp, z[0] = numpy.zeros((bsize,)+(nkern,)+fulloutshp,
......
...@@ -79,7 +79,7 @@ def exec_multilayer_conv_nnet(conv_mode, ss, bsize, imshp, kshps, nkerns, ...@@ -79,7 +79,7 @@ def exec_multilayer_conv_nnet(conv_mode, ss, bsize, imshp, kshps, nkerns,
padimg[:, :, kshp[0]-1:-kshp[0]+1, padimg[:, :, kshp[0]-1:-kshp[0]+1,
kshp[1]-1:-kshp[1]+1] = imgval kshp[1]-1:-kshp[1]+1] = imgval
outshp = N.hstack((nkern, ConvOp.getOutputShape(imshp, kshp, ss, conv_mode))) outshp = N.hstack((nkern, ConvOp.getOutputShape(imshp[1:], kshp, ss, conv_mode)))
time1 = time.time() time1 = time.time()
outval = N.zeros(N.r_[bsize,outshp]) outval = N.zeros(N.r_[bsize,outshp])
...@@ -104,7 +104,7 @@ def exec_multilayer_conv_nnet(conv_mode, ss, bsize, imshp, kshps, nkerns, ...@@ -104,7 +104,7 @@ def exec_multilayer_conv_nnet(conv_mode, ss, bsize, imshp, kshps, nkerns,
conv_op = ConvOp(imshp, kshp, nkern, bsize, ss[0],ss[1], conv_mode, conv_op = ConvOp(imshp, kshp, nkern, bsize, ss[0],ss[1], conv_mode,
unroll_batch=unroll_batch, unroll_kern=unroll_kern, unroll_patch=unroll_patch, verbose=verbose)(inputs4, kerns4) unroll_batch=unroll_batch, unroll_kern=unroll_kern, unroll_patch=unroll_patch, verbose=verbose)(inputs4, kerns4)
l1shp=N.hstack((nkern, l1shp=N.hstack((nkern,
ConvOp.getOutputShape(imshp, kshp, ss, conv_mode))) ConvOp.getOutputShape(imshp[1:], kshp, ss, conv_mode)))
propup2 = function([inputs4, kerns4], conv_op) propup2 = function([inputs4, kerns4], conv_op)
propup3 = function([inputs4, kerns4], conv_op, mode=Mode(linker="py")) propup3 = function([inputs4, kerns4], conv_op, mode=Mode(linker="py"))
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论