Вот код Python, который реализует вычисление в скользящем окне для двух 3D-матриц X и Y .
import numpy
def sliding_dot( X,Y ) :
assert X.ndim == Y.ndim == 3
iw,ih,id = X.shape
fw,fh,fd = Y.shape
assert id == fd
assert fw < iw and fh < ih
ow,oh = iw-fw+1,ih-fh+1
out = numpy.zeros( [ow,oh] )
for x in xrange(ow) :
for y in xrange(oh) :
window = X[x:x+fw,y:y+fh,:]
out[x,y] = numpy.dot( window.flatten(),Y.flatten() )
return out
#################
A_dims = (640,480,32)
B_dims = (6,6,32)
A = numpy.random.rand(*A_dims)
B = numpy.random.rand(*B_dims)
sliding_dot(A,B)
В общем, Y всегда намного меньше X по первому и второму измерениям, но они равны в третьем измерении.
Обратите внимание, что мы можем заменить numpy.dot () любой функцией Y и окна. Это немного отличается от свертки в том, что Y скользит только по первому и второму измерениям X. Я ищу эффективную стратегию для эффективной реализации такого типа вычислений скользящего окна с использованием CUDA. Кто-нибудь хочет предложить мне какое-нибудь направление? Ваше здоровье!
Обновление : вы можете посмотреть, как я работаю над процессом оптимизации с помощью других пользователей в моем ответе ниже.