реализация conv2d в домене Фурье с использованием einsum -> ValueError: строка подписчиков суммы einstein содержит слишком много подписок для операнда 0 - PullRequest
2 голосов
/ 31 марта 2019

Согласно теореме о свертке операция свертки меняется на точечное умножение в области Фурье - здесь у меня есть «fft_x» формы (размер пакета, высота, ширина, in_channels), который является FFT входных данных и аналогично 'fft_kernel' формы (высота, ширина, in_channels, out_channels), которая является fft ядра после того, как она добавлена ​​к размеру изображения. Для точного умножения их я использовал einsum следующим образом -

...
    print(fft_x)
    print(fft_kernel)
    output = 0
    n=int(self.no_of_kernels/2)+1      # n = out_channels here
    for i in range(n):
        output += np.einsum('ijkl,jkl->ijk', fft_x, fft_kernel[i])
    return output 
...

Это дает следующий вывод -

Tensor("input_11:0", shape=(?, 28, 28, 1), dtype=complex64)
Tensor("fourier__conv2d_11/transpose:0", shape=(28, 28, 1, 17), dtype=complex64)
...
...
ValueError: einstein sum subscripts string contains too many subscripts for operand 0

Может кто-нибудь объяснить, почему возникает эта ошибка? Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 01 апреля 2019

Я использовал tf.einsum вместо np.einsum, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...