Peter O'Connor
2017-10-19 16:48:55 UTC
Hi. Did anyone figure this out? I really need this op. In my case I want
to compute the per-channel cross correlation of two (512, 20, 20) feature
maps.
Currently, I can't see any way to do this without using scan. My current
solution is:
class ChannelwiseCrossCorr(object):
def __init__(self, border_mode='full', subsample=(1, 1)):
self.border_mode = border_mode
self.subsample = subsample
def __call__(self, (x1, x2)):
"""
:param (x1, x2): are each (n_samples, n_channels, size_y, size_x) images
:return: A (n_samples, n_channels, size_y*2-1, size_x*2-1) image representing the channelwise cross-correlation between
each pair of images.
"""
from theano.tensor.signal.conv import conv2d as sconv2d
x1_flat = x1.reshape((x1.shape[0]*x1.shape[1], x2.shape[2], x2.shape[3]))
x2_flat = x2.reshape((x2.shape[0]*x2.shape[1], x2.shape[2], x2.shape[3]))[:, ::-1, ::-1]
map_flat, _ = theano.scan(partial(sconv2d, border_mode=self.border_mode, subsample=self.subsample), sequences=[x1_flat, x2_flat])
conv_maps = map_flat.reshape((x1.shape[0], x1.shape[1], map_flat.shape[1], map_flat.shape[2]))
return conv_maps
But it runs much slower than I expected, presumably due to the scan op.
to compute the per-channel cross correlation of two (512, 20, 20) feature
maps.
Currently, I can't see any way to do this without using scan. My current
solution is:
class ChannelwiseCrossCorr(object):
def __init__(self, border_mode='full', subsample=(1, 1)):
self.border_mode = border_mode
self.subsample = subsample
def __call__(self, (x1, x2)):
"""
:param (x1, x2): are each (n_samples, n_channels, size_y, size_x) images
:return: A (n_samples, n_channels, size_y*2-1, size_x*2-1) image representing the channelwise cross-correlation between
each pair of images.
"""
from theano.tensor.signal.conv import conv2d as sconv2d
x1_flat = x1.reshape((x1.shape[0]*x1.shape[1], x2.shape[2], x2.shape[3]))
x2_flat = x2.reshape((x2.shape[0]*x2.shape[1], x2.shape[2], x2.shape[3]))[:, ::-1, ::-1]
map_flat, _ = theano.scan(partial(sconv2d, border_mode=self.border_mode, subsample=self.subsample), sequences=[x1_flat, x2_flat])
conv_maps = map_flat.reshape((x1.shape[0], x1.shape[1], map_flat.shape[1], map_flat.shape[2]))
return conv_maps
But it runs much slower than I expected, presumably due to the scan op.
--
---
You received this message because you are subscribed to the Google Groups "theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to theano-users+***@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
---
You received this message because you are subscribed to the Google Groups "theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to theano-users+***@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.