Package: ptwt
Welcome to the PyTorch wavelet toolbox. This package implements:the fast wavelet transform (fwt) viawavedecand its inverse by providing thewaverecfunction,the two-dimensional fwt is calledwavedec2the synthesis counterpartwaverec2,wavedec3andwaverec3cover the three-dimensional analysis and synthesis case,fswavedec2,fswavedec3,fswaverec2andfswaverec3support separable transformations.MatrixWavedecandMatrixWaverecimplement sparse-matrix-based fast wavelet transforms with boundary filters,2d sparse-matrix transforms with separable & non-separable boundary filters are available,MatrixWavedec3andMatrixWaverec3allow separable 3D-fwt’s with boundary filters.cwtcomputes a one-dimensional continuous forward transform,single and two-dimensional wavelet packet forward and backward transforms are available via theWaveletPacketandWaveletPacket2Dobjects,finally, this package provides adaptive wavelet support (experimental).This toolbox extendsPyWavelets. In addition to boundary wavelets, we provide GPU and gradient support via a PyTorch backend.
Complete documentation is available at:https://pytorch-wavelet-toolbox.readthedocs.io/en/latest/ptwt.htmlInstallationInstall the toolbox via pip or clone this repository. In order to usepip, type:$pipinstallptwtYou can remove it later by typingpip uninstall ptwt.Example usage:Single dimensional transformOne way to compute fast wavelet transforms is to rely on padding and
convolution. Consider the following example:importtorchimportnumpyasnpimportpywtimportptwt# use "from src import ptwt" for a cloned the repo# generate an input of even length.data=np.array([0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0])data_torch=torch.from_numpy(data.astype(np.float32))wavelet=pywt.Wavelet('haar')# compare the forward fwt coefficientsprint(pywt.wavedec(data,wavelet,mode='zero',level=2))print(ptwt.wavedec(data_torch,wavelet,mode='zero',level=2))# invert the fwt.print(ptwt.waverec(ptwt.wavedec(data_torch,wavelet,mode='zero'),wavelet))The functionswavedecandwavereccompute the 1d-fwt and its inverse.
Internally both rely onconv1d, and its transposed counterpartconv_transpose1dfrom thetorch.nn.functionalmodule. This toolbox also supports discrete wavelets
seepywt.wavelist(kind='discrete'). I have tested
Daubechies-Waveletsdb-xand symletssym-x, are usually a good starting point.Two-dimensional transformAnalog to the 1d-casewavedec2andwaverec2rely onconv2d, and its transposed counterpartconv_transpose2d.
To test an example, run:importptwt,pywt,torchimportnumpyasnpimportscipy.miscface=np.transpose(scipy.datasets.face(),[2,0,1]).astype(np.float64)pytorch_face=torch.tensor(face)coefficients=ptwt.wavedec2(pytorch_face,pywt.Wavelet("haar"),level=2,mode="constant")reconstruction=ptwt.waverec2(coefficients,pywt.Wavelet("haar"))np.max(np.abs(face-reconstruction.squeeze(1).numpy()))Speed testsSpeed tests comparing our tools to related libraries areavailable.Boundary Wavelets with Sparse-MatricesIn addition to convolution and padding approaches,
sparse-matrix-based code with boundary wavelet support is available.
In contrast to padding, boundary wavelets do not add extra pixels at
the edges.
Internally, boundary wavelet support relies ontorch.sparse.mm.
Generate 1d sparse matrix forward and backward transforms with theMatrixWavedecandMatrixWaverecclasses.
Reconsidering the 1d case, try:importtorchimportnumpyasnpimportpywtimportptwt# use "from src import ptwt" for a cloned the repo# generate an input of even length.data=np.array([0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0])data_torch=torch.from_numpy(data.astype(np.float32))# forwardmatrix_wavedec=ptwt.MatrixWavedec(pywt.Wavelet("haar"),level=2)coeff=matrix_wavedec(data_torch)print(coeff)# backwardmatrix_waverec=ptwt.MatrixWaverec(pywt.Wavelet("haar"))rec=matrix_waverec(coeff)print(rec)The process for the 2d transformsMatrixWavedec2,MatrixWaverec2works similarly.
By default, a separable transformation is used.
To use a non-separable transformation, passseparable=FalsetoMatrixWavedec2andMatrixWaverec2.
Separable transformations use a 1d transformation along both axes, which might be faster since fewer matrix entries
have to be orthogonalized.AdaptiveWaveletsExperimental code to train an adaptive wavelet layer in PyTorch is available in theexamplesfolder. In addition to static wavelets
from pywt,Adaptive product-filtersand optimizable orthogonal-wavelets are supported.Seehttps://github.com/v0lta/PyTorch-Wavelet-Toolbox/tree/main/examples/network_compression/for a complete implementation.TestingThetestsfolder contains multiple tests to allow independent verification of this toolbox.
The GitHub workflow executes a subset of all tests for efficiency reasons.
After cloning the repository, moving into the main directory, and installingnoxwithpip install noxrun$nox--sessiontestto run all existing tests.CitationIf you use this work in a scientific context, please cite the following:@phdthesis{handle:20.500.11811/9245,
  urn: https://nbn-resolving.org/urn:nbn:de:hbz:5-63361,
  author = {{Moritz Wolter}},
  title = {Frequency Domain Methods in Recurrent Neural Networks for Sequential Data Processing},
  school = {Rheinische Friedrich-Wilhelms-Universität Bonn},
  year = 2021,
  month = jul,
  url = {https://hdl.handle.net/20.500.11811/9245}
}If you use the boundary wavelet support, please additionally cite:@thesis{Blanke2021,
  author = {Felix Blanke},
  title = {{Randbehandlung bei Wavelets für Faltungsnetzwerke}},
  type = {Bachelor's Thesis},
  annote = {Gbachelor},
  year = {2021},
  school = {Institut f\"ur Numerische Simulation, Universit\"at Bonn}
}