Я хочу оценить преобразование Фурье для изображения заданного размера BxCxWxH
В предыдущей версии факела выполнялось следующее:
fft_im = torch.rfft(img, signal_ndim=2, onesided=False)
и выход был размером:
BxCxWxHx2
Однако с новой версией rfft:
fft_im = torch.fft.rfft2(img, dim=2, norm=None)
Я не получаю таких же результатов. Я что-то пропустил?
Несколько вопросов
dim
имеет недопустимый тип, он должен быть кортежем из двух чисел или должен быть опущен. На самом деле PyTorch должен вызывать исключение. Я бы сказал, что тот факт, что это работало без исключения, является ошибкой в PyTorch (я открыл тикет, в котором говорилось об этом).complex
типы тензоров, поэтому функции БПФ возвращают их вместо добавления нового измерения для реальных/мнимых частей. Вы можете использовать torch.view_as_real
для преобразования в старое представление. Также стоит отметить, что view_as_real
не копирует данные, поскольку возвращает представление, поэтому не должно заметно замедлять работу.torch.fft.fft2
, что противоречит 13-му афоризму PEP 20. Весь смысл предоставления специальной версии БПФ с действительным знаком заключается в том, что вам нужно вычислить только половину значений для каждого измерение, так как остальное можно вывести через свойство симметрии Эрмитиона.Итак, из всего, что вы должны уметь использовать
fft_im = torch.view_as_real(torch.fft.fft2(img))
Важный Если вы собираетесь передать fft_im
другим функциям в torch.fft
(например, fft.ifft
или fft.fftshift
), вам нужно будет преобразовать обратно в сложное представление, используя torch.view_as_complex
, чтобы эти функции не интерпретировали последнее измерение как измерение сигнала.
@ singa1994 Я внимательно изучил ваш вопрос и понял, что пропустил некоторые части. Переписал ответ, надеюсь, это поможет.
Спасибо за ваш ответ. Следуя вашему решению, я все еще не получаю результат BxCxHxWx2, как ожидалось. Я скорее получаю выходной размер BxCxHx(w/2).