Braindecode 1.8.0.dev170432067__tar.gz → 1.8.0.dev173646312__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- braindecode-1.8.0.dev173646312/NOTICE.txt +65 -0
- {braindecode-1.8.0.dev170432067/braindecode.egg-info → braindecode-1.8.0.dev173646312}/PKG-INFO +7 -4
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/README.rst +6 -3
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/functional/functions.py +4 -3
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/base.py +25 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/brainmodule.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/ctnet.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/dance.py +2 -10
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegconformer.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegminer.py +2 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegsimpleconv.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/emg2qwerty.py +9 -133
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/ifnet.py +2 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/luna.py +2 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/medformer.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/meta_neuromotor.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/mvpformer.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/sstdpn.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/tcformer.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/zuna.py +1 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/__init__.py +14 -2
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/blocks.py +213 -0
- braindecode-1.8.0.dev173646312/braindecode/version.py +1 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/visualization/__init__.py +6 -0
- braindecode-1.8.0.dev173646312/braindecode/visualization/activations.py +77 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312/braindecode.egg-info}/PKG-INFO +7 -4
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode.egg-info/SOURCES.txt +1 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/api.rst +12 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/whats_new.rst +18 -0
- braindecode-1.8.0.dev170432067/NOTICE.txt +0 -25
- braindecode-1.8.0.dev170432067/braindecode/version.py +0 -1
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/LICENSE.txt +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/MANIFEST.in +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/augmentation/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/augmentation/base.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/augmentation/functional.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/augmentation/transforms.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/classifier.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/_notebook_viewer.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/base.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bbci.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bcicomp.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/datasets.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/format.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/hub.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/hub_format.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/hub_io.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/hub_validation.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/bids/iterable.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/chb_mit.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/collate.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/mne.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/moabb.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/nmt.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/registry.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/siena.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/sleep_physionet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/tuh.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/utils.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datasets/xy.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datautil/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datautil/channel_utils.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datautil/hub_formats.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datautil/serialization.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/datautil/util.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/eegneuralnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/functional/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/functional/initialization.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/atcnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/attentionbasenet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/attn_sleep.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/bendr.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/biot.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/cbramod.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/codebrain.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/config.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/contrawr.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/deep4.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/deepsleepnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/dgcnn.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegdino.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eeginception_erp.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eeginception_mi.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegitnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegnex.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegpt.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegsym.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegtcnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/fbcnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/fblightconvnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/fbmsnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/hybrid.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/interpolated.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/labram.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/msvtnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/patchedtransformer.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/reve.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/sccnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/shallow_fbcsp.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/signal_jepa.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/sinc_shallow.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/sparcnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/steegformer.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/summary.csv +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/syncnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/tcn.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/tidnet.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/tsinception.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/usleep.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/util.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/activation.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/attention.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/convolution.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/dance_modules.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/filter.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/interpolation.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/layers.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/linear.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/parametrization.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/stats.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/util.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/wrapper.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/preprocessing/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/preprocessing/mne_preprocess.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/preprocessing/preprocess.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/preprocessing/util.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/preprocessing/windowers.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/regressor.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/samplers/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/samplers/base.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/samplers/ssl.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/training/__init__.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/training/callbacks.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/training/losses.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/training/scoring.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/util.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/visualization/attribution.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/visualization/confusion_matrices.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/visualization/frequency.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/visualization/metrics.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/visualization/sanity.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/visualization/topology.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode.egg-info/dependency_links.txt +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode.egg-info/requires.txt +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode.egg-info/top_level.txt +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/Makefile +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/_templates/autosummary/class.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/_templates/autosummary/function.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/cite.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/conf.py +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/help.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/index.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/install/install.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/install/install_pip.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/install/install_source.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/attention.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/channel.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/convolution.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/filterbank.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/gnn.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/interpretable.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/lbm.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/recurrent.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/categorization/spd.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/models.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/models_categorization.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/models_table.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/models/models_visualization.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/docs/sg_execution_times.rst +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/pyproject.toml +0 -0
- {braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/setup.cfg +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# BRAINDECODE Notice
|
|
2
|
+
|
|
3
|
+
## Licensed Components
|
|
4
|
+
|
|
5
|
+
### BSD-3-Clause Licensed Files
|
|
6
|
+
|
|
7
|
+
All files within the `braindecode/` package are licensed under the BSD-3-Clause
|
|
8
|
+
License, except for those listed in the sections below.
|
|
9
|
+
|
|
10
|
+
### CC BY-NC 4.0 Licensed Files
|
|
11
|
+
|
|
12
|
+
The following components are licensed under the Creative Commons Attribution-NonCommercial 4.0 International License:
|
|
13
|
+
|
|
14
|
+
- `braindecode/models/eegminer.py`
|
|
15
|
+
- `braindecode/models/meta_neuromotor.py`
|
|
16
|
+
- `braindecode/models/brainmodule.py`
|
|
17
|
+
|
|
18
|
+
As well as class later imported into the `braindecode.models.module` named as GeneralizedGaussianFilter.
|
|
19
|
+
|
|
20
|
+
The `meta_neuromotor.py` file is a derivative of
|
|
21
|
+
`facebookresearch/generic-neuromotor-interface`, released by Meta Platforms,
|
|
22
|
+
Inc. under CC BY-NC 4.0, and inherits the same noncommercial terms.
|
|
23
|
+
|
|
24
|
+
### CC BY-NC-SA 4.0 Licensed Files
|
|
25
|
+
|
|
26
|
+
The following components are licensed under the Creative Commons
|
|
27
|
+
Attribution-NonCommercial-ShareAlike 4.0 International License:
|
|
28
|
+
|
|
29
|
+
- `braindecode/models/emg2qwerty.py`
|
|
30
|
+
|
|
31
|
+
The `emg2qwerty.py` file is a derivative of `facebookresearch/emg2qwerty`,
|
|
32
|
+
released by Meta Platforms, Inc. under CC BY-NC-SA 4.0, and inherits the
|
|
33
|
+
same noncommercial ShareAlike terms.
|
|
34
|
+
|
|
35
|
+
### MIT Licensed Files
|
|
36
|
+
|
|
37
|
+
The following components are licensed under the MIT License:
|
|
38
|
+
|
|
39
|
+
- `braindecode/models/ctnet.py`
|
|
40
|
+
- `braindecode/models/dance.py`
|
|
41
|
+
- `braindecode/models/medformer.py`
|
|
42
|
+
- `braindecode/models/tcformer.py`
|
|
43
|
+
- `braindecode/models/ifnet.py`
|
|
44
|
+
|
|
45
|
+
### Apache-2.0 Licensed Files
|
|
46
|
+
|
|
47
|
+
The following components are licensed under the Apache License 2.0:
|
|
48
|
+
|
|
49
|
+
- `braindecode/models/mvpformer.py`
|
|
50
|
+
- `braindecode/models/zuna.py`
|
|
51
|
+
- `braindecode/models/luna.py`
|
|
52
|
+
|
|
53
|
+
## License Links
|
|
54
|
+
|
|
55
|
+
- [BSD-3-Clause License](https://opensource.org/licenses/BSD-3-Clause)
|
|
56
|
+
- [CC BY-NC 4.0 License](https://creativecommons.org/licenses/by-nc/4.0/)
|
|
57
|
+
- [CC BY-NC-SA 4.0 License](https://creativecommons.org/licenses/by-nc-sa/4.0/)
|
|
58
|
+
- [MIT License](https://opensource.org/licenses/MIT)
|
|
59
|
+
- [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0)
|
|
60
|
+
|
|
61
|
+
## Note
|
|
62
|
+
|
|
63
|
+
This list covers files whose own headers declare a license other than
|
|
64
|
+
BSD-3-Clause. Per-file provenance review of the remaining models is
|
|
65
|
+
tracked separately.
|
{braindecode-1.8.0.dev170432067/braindecode.egg-info → braindecode-1.8.0.dev173646312}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: braindecode
|
|
3
|
-
Version: 1.8.0.
|
|
3
|
+
Version: 1.8.0.dev173646312
|
|
4
4
|
Summary: Deep learning software to decode EEG, ECG or MEG signals
|
|
5
5
|
Author-email: Robin Tibor Schirrmeister <robintibor@gmail.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Alexandre Gramfort <agramfort@meta.com>
|
|
6
6
|
Maintainer-email: Alexandre Gramfort <agramfort@meta.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Robin Tibor Schirrmeister <robintibor@gmail.com>
|
|
@@ -260,7 +260,10 @@ This project is primarily licensed under the BSD-3-Clause License.
|
|
|
260
260
|
Additional Components
|
|
261
261
|
=====================
|
|
262
262
|
|
|
263
|
-
Some components within this repository are licensed under
|
|
264
|
-
Attribution-NonCommercial 4.0 International
|
|
263
|
+
Some components within this repository are licensed under other licenses, including
|
|
264
|
+
Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0), Creative
|
|
265
|
+
Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0), MIT
|
|
266
|
+
and Apache-2.0.
|
|
265
267
|
|
|
266
|
-
Please refer to the ``LICENSE`` and ``NOTICE`` files for
|
|
268
|
+
Please refer to the ``LICENSE`` and ``NOTICE`` files for the per-file list and more
|
|
269
|
+
detailed information.
|
|
@@ -170,7 +170,10 @@ This project is primarily licensed under the BSD-3-Clause License.
|
|
|
170
170
|
Additional Components
|
|
171
171
|
=====================
|
|
172
172
|
|
|
173
|
-
Some components within this repository are licensed under
|
|
174
|
-
Attribution-NonCommercial 4.0 International
|
|
173
|
+
Some components within this repository are licensed under other licenses, including
|
|
174
|
+
Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0), Creative
|
|
175
|
+
Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0), MIT
|
|
176
|
+
and Apache-2.0.
|
|
175
177
|
|
|
176
|
-
Please refer to the ``LICENSE`` and ``NOTICE`` files for
|
|
178
|
+
Please refer to the ``LICENSE`` and ``NOTICE`` files for the per-file list and more
|
|
179
|
+
detailed information.
|
|
@@ -40,7 +40,7 @@ def drop_path(
|
|
|
40
40
|
x : torch.Tensor
|
|
41
41
|
input tensor
|
|
42
42
|
drop_prob : float, optional
|
|
43
|
-
|
|
43
|
+
probability of dropping a path, by default 0.0
|
|
44
44
|
training : bool, optional
|
|
45
45
|
whether the model is in training mode, by default False
|
|
46
46
|
scale_by_keep : bool, optional
|
|
@@ -68,9 +68,10 @@ def drop_path(
|
|
|
68
68
|
shape = (x.shape[0],) + (1,) * (
|
|
69
69
|
x.ndim - 1
|
|
70
70
|
) # work with diff dim tensors, not just 2D ConvNets
|
|
71
|
-
|
|
71
|
+
probabilities = torch.full(shape, keep_prob, dtype=torch.float32, device=x.device)
|
|
72
|
+
random_tensor = torch.bernoulli(probabilities).to(dtype=x.dtype)
|
|
72
73
|
if keep_prob > 0.0 and scale_by_keep:
|
|
73
|
-
random_tensor
|
|
74
|
+
random_tensor = random_tensor / keep_prob
|
|
74
75
|
return x * random_tensor
|
|
75
76
|
|
|
76
77
|
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/base.py
RENAMED
|
@@ -519,6 +519,31 @@ class EEGModuleMixin(_BaseHubMixin, metaclass=_BraindecodeDocstringMeta):
|
|
|
519
519
|
resolve_type_kwargs(cls, config)
|
|
520
520
|
return cls(**config)
|
|
521
521
|
|
|
522
|
+
def _set_n_outputs(self, n_outputs: int) -> None:
|
|
523
|
+
"""Record a new ``n_outputs`` on the model and its saved configs.
|
|
524
|
+
|
|
525
|
+
Helper for :meth:`reset_head` implementations: validates the value,
|
|
526
|
+
then keeps the ``n_outputs`` property, the braindecode init kwargs
|
|
527
|
+
and the Hugging Face hub config in sync, so a re-serialized model
|
|
528
|
+
reports the head it actually has.
|
|
529
|
+
|
|
530
|
+
Parameters
|
|
531
|
+
----------
|
|
532
|
+
n_outputs : int
|
|
533
|
+
New number of outputs. Must be positive.
|
|
534
|
+
|
|
535
|
+
.. versionadded:: 1.8
|
|
536
|
+
"""
|
|
537
|
+
if n_outputs <= 0:
|
|
538
|
+
raise ValueError(f"n_outputs must be positive; got {n_outputs}.")
|
|
539
|
+
self._n_outputs = n_outputs
|
|
540
|
+
for config in (
|
|
541
|
+
getattr(self, "_braindecode_init_kwargs", None),
|
|
542
|
+
getattr(self, "_hub_mixin_config", None),
|
|
543
|
+
):
|
|
544
|
+
if config is not None and "n_outputs" in config:
|
|
545
|
+
config["n_outputs"] = n_outputs
|
|
546
|
+
|
|
522
547
|
def reset_head(self, n_outputs):
|
|
523
548
|
"""Replace the classification head for a new number of outputs.
|
|
524
549
|
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/brainmodule.py
RENAMED
|
@@ -25,7 +25,7 @@ from braindecode.modules.layers import SubjectLayers
|
|
|
25
25
|
__all__ = ["BrainModule"]
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
class BrainModule(EEGModuleMixin, nn.Module):
|
|
28
|
+
class BrainModule(EEGModuleMixin, nn.Module, license="cc-by-nc-4.0"):
|
|
29
29
|
r"""BrainModule from [brainmagick]_, also known as SimpleConv.
|
|
30
30
|
|
|
31
31
|
A dilated convolutional encoder for EEG decoding, using residual
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/ctnet.py
RENAMED
|
@@ -24,7 +24,7 @@ from braindecode.modules import (
|
|
|
24
24
|
)
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
class CTNet(EEGModuleMixin, nn.Module):
|
|
27
|
+
class CTNet(EEGModuleMixin, nn.Module, license="mit"):
|
|
28
28
|
r"""CTNet from Zhao, W et al (2024) [ctnet]_.
|
|
29
29
|
|
|
30
30
|
:bdg-success:`Convolution` :bdg-info:`Attention/Transformer`
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/dance.py
RENAMED
|
@@ -22,7 +22,7 @@ from braindecode.modules import ChannelMerger, Perceiver, SimpleConv
|
|
|
22
22
|
from braindecode.modules.dance_modules import DanceDetrDecoder
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
class DANCE(EEGModuleMixin, nn.Module):
|
|
25
|
+
class DANCE(EEGModuleMixin, nn.Module, license="mit"):
|
|
26
26
|
r"""DANCE from Lévy et al (2026) [dance]_.
|
|
27
27
|
|
|
28
28
|
:bdg-success:`Convolution` :bdg-info:`Attention/Transformer` :bdg-dark-line:`Channel`
|
|
@@ -349,8 +349,7 @@ class DANCE(EEGModuleMixin, nn.Module):
|
|
|
349
349
|
|
|
350
350
|
def reset_head(self, n_outputs: int) -> None:
|
|
351
351
|
"""Replace the dense head and the DETR class head for a new ``n_outputs``."""
|
|
352
|
-
|
|
353
|
-
raise ValueError(f"n_outputs must be positive; got {n_outputs}.")
|
|
352
|
+
self._set_n_outputs(n_outputs)
|
|
354
353
|
old = self.final_layer
|
|
355
354
|
self.final_layer = nn.Linear(old.in_features, n_outputs).to(
|
|
356
355
|
device=old.weight.device, dtype=old.weight.dtype
|
|
@@ -359,10 +358,3 @@ class DANCE(EEGModuleMixin, nn.Module):
|
|
|
359
358
|
self.decoder.class_head = nn.Linear(ch.in_features, n_outputs).to(
|
|
360
359
|
device=ch.weight.device, dtype=ch.weight.dtype
|
|
361
360
|
)
|
|
362
|
-
self._n_outputs = n_outputs
|
|
363
|
-
init_kwargs = getattr(self, "_braindecode_init_kwargs", None)
|
|
364
|
-
if init_kwargs is not None and "n_outputs" in init_kwargs:
|
|
365
|
-
init_kwargs["n_outputs"] = n_outputs
|
|
366
|
-
hub_config = getattr(self, "_hub_mixin_config", None)
|
|
367
|
-
if hub_config is not None and "n_outputs" in hub_config:
|
|
368
|
-
hub_config["n_outputs"] = n_outputs
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegconformer.py
RENAMED
|
@@ -185,7 +185,7 @@ class EEGConformer(EEGModuleMixin, nn.Module):
|
|
|
185
185
|
31, pp.710-719. https://ieeexplore.ieee.org/document/9991178
|
|
186
186
|
.. [ConformerCode] Song, Y., Zheng, Q., Liu, B. and Gao, X., 2022. EEG
|
|
187
187
|
conformer: Convolutional transformer for EEG decoding and visualization.
|
|
188
|
-
https://github.com/eeyhsong/EEG-Conformer
|
|
188
|
+
https://github.com/eeyhsong/EEG-Conformer
|
|
189
189
|
"""
|
|
190
190
|
|
|
191
191
|
def __init__(
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/eegminer.py
RENAMED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
# Authors: Sarthak Tayal <sarthaktayal2@gmail.com>
|
|
9
|
+
# License: Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)
|
|
9
10
|
|
|
10
11
|
import torch
|
|
11
12
|
from torch import nn
|
|
@@ -48,7 +49,7 @@ class _EEGMinerFeatures(nn.Module):
|
|
|
48
49
|
return x[:, self.triu_row, self.triu_col, :]
|
|
49
50
|
|
|
50
51
|
|
|
51
|
-
class EEGMiner(EEGModuleMixin, nn.Module):
|
|
52
|
+
class EEGMiner(EEGModuleMixin, nn.Module, license="cc-by-nc-4.0"):
|
|
52
53
|
r"""EEGMiner from Ludwig et al (2024) [eegminer]_.
|
|
53
54
|
|
|
54
55
|
:bdg-success:`Convolution` :bdg-warning:`Interpretability`
|
|
@@ -93,7 +93,7 @@ class EEGSimpleConv(EEGModuleMixin, torch.nn.Module):
|
|
|
93
93
|
.. [Yassine2023Code] Yassine El Ouahidi, V. Gripon, B. Pasdeloup, G. Bouallegue
|
|
94
94
|
N. Farrugia, G. Lioi, 2023. A Strong and Simple Deep Learning Baseline for
|
|
95
95
|
BCI Motor Imagery Decoding. GitHub repository.
|
|
96
|
-
https://github.com/elouayas/EEGSimpleConv
|
|
96
|
+
https://github.com/elouayas/EEGSimpleConv
|
|
97
97
|
|
|
98
98
|
"""
|
|
99
99
|
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/emg2qwerty.py
RENAMED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# Authors: Meta Platforms, Inc. and affiliates (original emg2qwerty)
|
|
2
2
|
# Bruno Aristimunha <b.aristimunha@gmail.com> (Braindecode adaptation)
|
|
3
3
|
#
|
|
4
|
-
# License: Creative Commons Attribution-NonCommercial
|
|
4
|
+
# License: Creative Commons Attribution-NonCommercial-ShareAlike 4.0
|
|
5
|
+
# International (CC BY-NC-SA 4.0)
|
|
5
6
|
# Adapted from https://github.com/facebookresearch/emg2qwerty (NeurIPS 2024).
|
|
6
|
-
# Inherits CC BY-NC 4.0; not covered by braindecode's BSD-3 license.
|
|
7
|
+
# Inherits CC BY-NC-SA 4.0; not covered by braindecode's BSD-3 license.
|
|
7
8
|
"""``EMG2QwertyNet``: TDS-Conv-CTC for sEMG-to-keystroke decoding."""
|
|
8
9
|
|
|
9
10
|
from __future__ import annotations
|
|
@@ -16,9 +17,10 @@ import torchaudio.transforms as ta_transforms
|
|
|
16
17
|
from torch import nn
|
|
17
18
|
|
|
18
19
|
from braindecode.models.base import EEGModuleMixin
|
|
20
|
+
from braindecode.modules import TDSConvEncoder
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
class EMG2QwertyNet(EEGModuleMixin, nn.Module):
|
|
23
|
+
class EMG2QwertyNet(EEGModuleMixin, nn.Module, license="cc-by-nc-sa-4.0"):
|
|
22
24
|
r"""Decoder mapping surface electromyography (sEMG) to keystrokes
|
|
23
25
|
(emg2qwerty) [emg2qwerty2024]_.
|
|
24
26
|
|
|
@@ -89,7 +91,7 @@ class EMG2QwertyNet(EEGModuleMixin, nn.Module):
|
|
|
89
91
|
.. warning::
|
|
90
92
|
**License: noncommercial use only.** This module is a derivative
|
|
91
93
|
of Meta's reference implementation released under
|
|
92
|
-
`CC BY-NC 4.0 <https://creativecommons.org/licenses/by-nc/4.0/>`_,
|
|
94
|
+
`CC BY-NC-SA 4.0 <https://creativecommons.org/licenses/by-nc-sa/4.0/>`_,
|
|
93
95
|
the same license as the upstream repository. Not covered by
|
|
94
96
|
braindecode's BSD-3 license. Must not be used in commercial
|
|
95
97
|
products or services. Pretrained weights from the upstream release
|
|
@@ -345,7 +347,7 @@ class EMG2QwertyNet(EEGModuleMixin, nn.Module):
|
|
|
345
347
|
activation=activation,
|
|
346
348
|
),
|
|
347
349
|
nn.Flatten(start_dim=2),
|
|
348
|
-
|
|
350
|
+
TDSConvEncoder(
|
|
349
351
|
num_features=num_features,
|
|
350
352
|
block_channels=list(block_channels),
|
|
351
353
|
kernel_width=kernel_width,
|
|
@@ -356,9 +358,7 @@ class EMG2QwertyNet(EEGModuleMixin, nn.Module):
|
|
|
356
358
|
|
|
357
359
|
self.final_layer = nn.Linear(num_features, self.n_outputs)
|
|
358
360
|
|
|
359
|
-
self._n_conv_blocks =
|
|
360
|
-
isinstance(m, _TDSConv2dBlock) for m in self.model[3].tds_conv_blocks
|
|
361
|
-
)
|
|
361
|
+
self._n_conv_blocks = len(block_channels)
|
|
362
362
|
|
|
363
363
|
def forward(
|
|
364
364
|
self, x: torch.Tensor, return_features: bool = False
|
|
@@ -452,22 +452,11 @@ class EMG2QwertyNet(EEGModuleMixin, nn.Module):
|
|
|
452
452
|
captured init config (``get_config()``) is also kept in sync so
|
|
453
453
|
save/load round-trips rebuild the new head.
|
|
454
454
|
"""
|
|
455
|
-
|
|
456
|
-
raise ValueError(f"n_outputs must be positive; got {n_outputs}.")
|
|
455
|
+
self._set_n_outputs(n_outputs)
|
|
457
456
|
old_head = self.final_layer
|
|
458
457
|
self.final_layer = nn.Linear(old_head.in_features, n_outputs).to(
|
|
459
458
|
device=old_head.weight.device, dtype=old_head.weight.dtype
|
|
460
459
|
)
|
|
461
|
-
self._n_outputs = n_outputs
|
|
462
|
-
# Keep the init-kwargs snapshot used by ``get_config()`` aligned with
|
|
463
|
-
# the live head, so ``EMG2QwertyNet.from_config(m.get_config())``
|
|
464
|
-
# rebuilds the head with the new vocab size.
|
|
465
|
-
init_kwargs = getattr(self, "_braindecode_init_kwargs", None)
|
|
466
|
-
if init_kwargs is not None and "n_outputs" in init_kwargs:
|
|
467
|
-
init_kwargs["n_outputs"] = n_outputs
|
|
468
|
-
hub_config = getattr(self, "_hub_mixin_config", None)
|
|
469
|
-
if hub_config is not None and "n_outputs" in hub_config:
|
|
470
|
-
hub_config["n_outputs"] = n_outputs
|
|
471
460
|
|
|
472
461
|
def compute_output_lengths(self, input_lengths: torch.Tensor) -> torch.Tensor:
|
|
473
462
|
"""Map per-sample input lengths to CTC emission lengths.
|
|
@@ -799,116 +788,3 @@ class _MultiBandRotationInvariantMLP(nn.Module):
|
|
|
799
788
|
for band_idx, mlp in enumerate(self.mlps):
|
|
800
789
|
band_outputs.append(mlp(per_band_inputs[band_idx]))
|
|
801
790
|
return torch.stack(band_outputs, dim=self.stack_dim)
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
class _TDSConv2dBlock(nn.Module):
|
|
805
|
-
r"""Time-Depth-Separable 2-D conv block ([hannun2019tds]_).
|
|
806
|
-
|
|
807
|
-
1×``kernel_width`` conv + activation + residual + LayerNorm. No
|
|
808
|
-
temporal padding: strips ``kernel_width - 1`` frames per block.
|
|
809
|
-
"""
|
|
810
|
-
|
|
811
|
-
def __init__(
|
|
812
|
-
self,
|
|
813
|
-
channels: int,
|
|
814
|
-
width: int,
|
|
815
|
-
kernel_width: int,
|
|
816
|
-
activation: type[nn.Module] = nn.ReLU,
|
|
817
|
-
) -> None:
|
|
818
|
-
super().__init__()
|
|
819
|
-
self.channels = channels
|
|
820
|
-
self.width = width
|
|
821
|
-
self.conv2d = nn.Conv2d(
|
|
822
|
-
in_channels=channels,
|
|
823
|
-
out_channels=channels,
|
|
824
|
-
kernel_size=(1, kernel_width),
|
|
825
|
-
)
|
|
826
|
-
self.activation = activation()
|
|
827
|
-
self.layer_norm = nn.LayerNorm(channels * width)
|
|
828
|
-
|
|
829
|
-
def forward(self, inputs: torch.Tensor) -> torch.Tensor:
|
|
830
|
-
n_in_frames, batch_size, n_features = inputs.shape
|
|
831
|
-
folded = inputs.movedim(0, -1).reshape(
|
|
832
|
-
batch_size, self.channels, self.width, n_in_frames
|
|
833
|
-
)
|
|
834
|
-
conv_out = self.activation(self.conv2d(folded))
|
|
835
|
-
conv_out = conv_out.reshape(batch_size, n_features, -1).movedim(-1, 0)
|
|
836
|
-
n_out_frames = conv_out.shape[0]
|
|
837
|
-
# Output frame i aligns with input frame i+(kernel_width-1), so
|
|
838
|
-
# the residual is the LAST n_out_frames input frames.
|
|
839
|
-
residual_added = conv_out + inputs[-n_out_frames:]
|
|
840
|
-
return self.layer_norm(residual_added)
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
class _TDSFullyConnectedBlock(nn.Module):
|
|
844
|
-
r"""Two-layer FFN with residual skip, LayerNorm, and optional dropout."""
|
|
845
|
-
|
|
846
|
-
def __init__(
|
|
847
|
-
self,
|
|
848
|
-
num_features: int,
|
|
849
|
-
activation: type[nn.Module] = nn.ReLU,
|
|
850
|
-
drop_prob: float = 0.0,
|
|
851
|
-
) -> None:
|
|
852
|
-
super().__init__()
|
|
853
|
-
layers: list[nn.Module] = [
|
|
854
|
-
nn.Linear(num_features, num_features),
|
|
855
|
-
activation(),
|
|
856
|
-
]
|
|
857
|
-
if drop_prob > 0:
|
|
858
|
-
layers.append(nn.Dropout(drop_prob))
|
|
859
|
-
layers.append(nn.Linear(num_features, num_features))
|
|
860
|
-
if drop_prob > 0:
|
|
861
|
-
layers.append(nn.Dropout(drop_prob))
|
|
862
|
-
self.fc_block = nn.Sequential(*layers)
|
|
863
|
-
self.layer_norm = nn.LayerNorm(num_features)
|
|
864
|
-
|
|
865
|
-
def forward(self, inputs: torch.Tensor) -> torch.Tensor:
|
|
866
|
-
return self.layer_norm(self.fc_block(inputs) + inputs)
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
class _TDSConvEncoder(nn.Module):
|
|
870
|
-
r"""``_TDSConv2dBlock`` + ``_TDSFullyConnectedBlock`` stack.
|
|
871
|
-
|
|
872
|
-
With ``K = len(block_channels)`` blocks and no temporal padding, the
|
|
873
|
-
encoder strips ``K * (kernel_width - 1)`` frames in total. Each ``ch``
|
|
874
|
-
must evenly divide ``num_features`` so the conv block can fold features
|
|
875
|
-
as ``(channels=ch, width=num_features // ch)``.
|
|
876
|
-
"""
|
|
877
|
-
|
|
878
|
-
def __init__(
|
|
879
|
-
self,
|
|
880
|
-
num_features: int,
|
|
881
|
-
block_channels: Sequence[int] = (24, 24, 24, 24),
|
|
882
|
-
kernel_width: int = 32,
|
|
883
|
-
activation: type[nn.Module] = nn.ReLU,
|
|
884
|
-
drop_prob: float = 0.0,
|
|
885
|
-
) -> None:
|
|
886
|
-
super().__init__()
|
|
887
|
-
if not block_channels:
|
|
888
|
-
raise ValueError("block_channels must be non-empty.")
|
|
889
|
-
blocks: list[nn.Module] = []
|
|
890
|
-
for n_block_channels in block_channels:
|
|
891
|
-
if num_features % n_block_channels != 0:
|
|
892
|
-
raise ValueError(
|
|
893
|
-
f"block_channels entry {n_block_channels} does not evenly "
|
|
894
|
-
f"divide num_features={num_features}."
|
|
895
|
-
)
|
|
896
|
-
blocks.extend(
|
|
897
|
-
[
|
|
898
|
-
_TDSConv2dBlock(
|
|
899
|
-
n_block_channels,
|
|
900
|
-
num_features // n_block_channels,
|
|
901
|
-
kernel_width,
|
|
902
|
-
activation=activation,
|
|
903
|
-
),
|
|
904
|
-
_TDSFullyConnectedBlock(
|
|
905
|
-
num_features,
|
|
906
|
-
activation=activation,
|
|
907
|
-
drop_prob=drop_prob,
|
|
908
|
-
),
|
|
909
|
-
]
|
|
910
|
-
)
|
|
911
|
-
self.tds_conv_blocks = nn.Sequential(*blocks)
|
|
912
|
-
|
|
913
|
-
def forward(self, inputs: torch.Tensor) -> torch.Tensor:
|
|
914
|
-
return self.tds_conv_blocks(inputs)
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/ifnet.py
RENAMED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# License: MIT
|
|
1
2
|
"""IFNet Neural Network.
|
|
2
3
|
|
|
3
4
|
Authors: Jiaheng Wang
|
|
@@ -28,7 +29,7 @@ from braindecode.modules import (
|
|
|
28
29
|
)
|
|
29
30
|
|
|
30
31
|
|
|
31
|
-
class IFNet(EEGModuleMixin, nn.Module):
|
|
32
|
+
class IFNet(EEGModuleMixin, nn.Module, license="mit"):
|
|
32
33
|
r"""IFNetV2 from Wang J et al (2023) [ifnet]_.
|
|
33
34
|
|
|
34
35
|
:bdg-success:`Convolution` :bdg-primary:`Filterbank`
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/luna.py
RENAMED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# License: Apache-2.0
|
|
1
2
|
"""This implementation is adapted from ETH Zurich's BioFoundation repository.
|
|
2
3
|
|
|
3
4
|
Döner, B., Ingolfsson, T. M., Benini, L., & Li, Y. (2025).
|
|
@@ -26,7 +27,7 @@ from braindecode.models.util import extract_channel_locations_from_chs_info
|
|
|
26
27
|
from braindecode.modules.layers import DropPath
|
|
27
28
|
|
|
28
29
|
|
|
29
|
-
class LUNA(EEGModuleMixin, nn.Module):
|
|
30
|
+
class LUNA(EEGModuleMixin, nn.Module, license="apache-2.0"):
|
|
30
31
|
r"""LUNA from Döner et al [LUNA]_.
|
|
31
32
|
|
|
32
33
|
:bdg-success:`Convolution` :bdg-danger:`Foundation Model` :bdg-dark-line:`Channel`
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/medformer.py
RENAMED
|
@@ -17,7 +17,7 @@ from braindecode.functional import sinusoidal_positional_encoding
|
|
|
17
17
|
from braindecode.models.base import EEGModuleMixin
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
class MEDFormer(EEGModuleMixin, nn.Module):
|
|
20
|
+
class MEDFormer(EEGModuleMixin, nn.Module, license="mit"):
|
|
21
21
|
r"""
|
|
22
22
|
Medformer from Wang et al (2024) [Medformer2024]_.
|
|
23
23
|
|
|
@@ -31,7 +31,7 @@ _LPadType = int | Literal["none", "steady", "full"]
|
|
|
31
31
|
# ---------------------------------------------------------------------------
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
class MetaNeuromotorHand(EEGModuleMixin, nn.Module):
|
|
34
|
+
class MetaNeuromotorHand(EEGModuleMixin, nn.Module, license="cc-by-nc-4.0"):
|
|
35
35
|
r"""Generic neuromotor interface for handwriting from Meta (2025) [gni2025]_.
|
|
36
36
|
|
|
37
37
|
:bdg-info:`Attention/Transformer` :bdg-success:`Convolution`
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/mvpformer.py
RENAMED
|
@@ -26,7 +26,7 @@ from braindecode.models.base import EEGModuleMixin
|
|
|
26
26
|
from braindecode.modules import PatchTokenizer
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
class MVPFormer(EEGModuleMixin, nn.Module):
|
|
29
|
+
class MVPFormer(EEGModuleMixin, nn.Module, license="apache-2.0"):
|
|
30
30
|
r"""MVPFormer from Carzaniga et al. (2026) [Carzaniga2026]_.
|
|
31
31
|
|
|
32
32
|
:bdg-danger:`Foundation Model` :bdg-info:`Attention/Transformer`
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/sstdpn.py
RENAMED
|
@@ -216,7 +216,7 @@ class SSTDPN(EEGModuleMixin, nn.Module):
|
|
|
216
216
|
temporal dual prototype network for motor imagery
|
|
217
217
|
brain–computer interface. Knowledge-Based Systems,
|
|
218
218
|
315, 113315. GitHub repository.
|
|
219
|
-
https://github.com/hancan16/SST-DPN
|
|
219
|
+
https://github.com/hancan16/SST-DPN
|
|
220
220
|
"""
|
|
221
221
|
|
|
222
222
|
def __init__(
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/tcformer.py
RENAMED
|
@@ -14,7 +14,7 @@ from braindecode.models.base import EEGModuleMixin
|
|
|
14
14
|
from braindecode.modules import CausalConv1d, Conv1dWithConstraint, DropPath
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class TCFormer(EEGModuleMixin, nn.Module):
|
|
17
|
+
class TCFormer(EEGModuleMixin, nn.Module, license="mit"):
|
|
18
18
|
r"""TCFormer from Altaheri et al (2025) [tcformer]_.
|
|
19
19
|
|
|
20
20
|
:bdg-success:`Convolution` :bdg-info:`Attention/Transformer`
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/models/zuna.py
RENAMED
|
@@ -19,7 +19,7 @@ from braindecode.models.util import extract_channel_locations_from_chs_info
|
|
|
19
19
|
from braindecode.modules import PatchTokenizer
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
class ZUNA(EEGModuleMixin, nn.Module):
|
|
22
|
+
class ZUNA(EEGModuleMixin, nn.Module, license="apache-2.0"):
|
|
23
23
|
r"""ZUNA from Warner et al. (2026) [Warner2026ZUNA]_.
|
|
24
24
|
|
|
25
25
|
:bdg-danger:`Foundation Model` :bdg-dark-line:`Channel` :bdg-info:`Attention/Transformer`
|
{braindecode-1.8.0.dev170432067 → braindecode-1.8.0.dev173646312}/braindecode/modules/__init__.py
RENAMED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
from .activation import
|
|
1
|
+
from .activation import (
|
|
2
|
+
GatedLinearUnit,
|
|
3
|
+
LogActivation,
|
|
4
|
+
SafeLog,
|
|
5
|
+
Square,
|
|
6
|
+
)
|
|
2
7
|
from .attention import (
|
|
3
8
|
CAT,
|
|
4
9
|
CBAM,
|
|
@@ -14,7 +19,13 @@ from .attention import (
|
|
|
14
19
|
MultiHeadAttention,
|
|
15
20
|
SqueezeAndExcitation,
|
|
16
21
|
)
|
|
17
|
-
from .blocks import
|
|
22
|
+
from .blocks import (
|
|
23
|
+
MLP,
|
|
24
|
+
FeedForwardBlock,
|
|
25
|
+
InceptionBlock,
|
|
26
|
+
PatchTokenizer,
|
|
27
|
+
TDSConvEncoder,
|
|
28
|
+
)
|
|
18
29
|
from .convolution import (
|
|
19
30
|
AvgPool2dWithConv,
|
|
20
31
|
CausalConv1d,
|
|
@@ -73,6 +84,7 @@ __all__ = [
|
|
|
73
84
|
"FeedForwardBlock",
|
|
74
85
|
"InceptionBlock",
|
|
75
86
|
"PatchTokenizer",
|
|
87
|
+
"TDSConvEncoder",
|
|
76
88
|
"AvgPool2dWithConv",
|
|
77
89
|
"CausalConv1d",
|
|
78
90
|
"CombinedConv",
|