Я пытаюсь вычислить circular cross-correlation двух сигналов с помощью Theano, чтобы использовать его для дальнейшего расчета потерь, которые я бы оптимизировал. Но я не совсем уверен, как это сделать.Циркулярная корреляция в Theano
Она определяется следующим образом:
(f * g)[n] = sum_k f[k]g[k+n]
ccc[n] = \sum_k (f*g)[n-kN]
- "периодическим" суммирование или как "для каждого к-го компонента".
я мог бы сделать обычную корреляцию, а затем выполнять периодическое суммирование, но это не совсем понятно, как это сделать (периодическое суммирование) символически (с помощью сканирования, возможно?)
conv2d = T.signal.conv.conv2d
x = T.dmatrix()
y = T.dmatrix()
veclen = x.shape[1]
corr_expr = conv2d(x, y[:, ::-1], image_shape=(1, veclen), border_mode='full')
# circ_corr = T.sum([corr_expr[k::veclen] for k in T.arange(veclen)])
corr = theano.function([x, y], outputs=circ_corr)
corr(np.array([[2, 3, 5]]), np.array([[7, 11, 13]]))
или использовать круговой крест декорреляции теоремы и вычислить как Иффт (FFT (х) * FFT (у)):
import theano.sandbox.fourier as dft
x = T.dmatrix()
y = T.dvector()
veclen = x.shape[1]
exp = T.real(
dft.ifft(
dft.fft(x, veclen, axis=1)
* dft.fft(y[::-1], y.shape[0], axis=1).reshape((1, -1)),
veclen, axis=1
)
)[:, ::-1]
f = theano.function([x, y], outputs=exp)
f(np.array([[2, 3, 5], [3, 4, 4], [5, 6, 7]]), np.array([7, 11, 13]))
, но в этом случае я не могу на самом деле вычислить градиент, поскольку градиент для ОБПФА (и все функции, которые есть что-то делать с комплексными числами в гене аль, AFAIK) еще не реализована, я думаю (прерывается с ошибкой: Elemwise{real,no_inplace}.grad illegally returned an integer-valued variable. (Input index 0, dtype complex128)
)
StackOverflow - это сайт вопросов и ответов, но вы не задали вопрос. Неясно, чего вы и ваш код пытаетесь достичь. В чем смысл? Что не так с этим кодом? Какие сообщения об ошибках вы получаете, если это применимо? Каковы примерные входы и ожидаемые результаты? –
@ DanielRenshaw, ладно, я думал, что название «Circular Correlation in theanano» вполне объяснимо :) –
Я думаю, что шансы найти кого-то на StackOverflow, знакомый с круговой корреляцией, знакомый с Theano, и имеет время для чтения и интерпретировать ваш код, довольно тонкий! Предоставление большего количества поддерживающих материалов/ссылок/и т. Д. будет помогать людям, которые лишь частично отвечают этим требованиям, чтобы внести свой вклад. –