Braindecode 1.3.0.dev169126795__tar.gz → 1.3.0.dev169361694__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.3.0.dev169126795/braindecode.egg-info → braindecode-1.3.0.dev169361694}/PKG-INFO +1 -1
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/atcnet.py +9 -9
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/biot.py +21 -21
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/ctnet.py +28 -28
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegconformer.py +17 -17
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/labram.py +34 -34
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/medformer.py +12 -12
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/msvtnet.py +9 -9
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/patchedtransformer.py +42 -42
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/summary.csv +1 -1
- braindecode-1.3.0.dev169361694/braindecode/version.py +1 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694/braindecode.egg-info}/PKG-INFO +1 -1
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/whats_new.rst +0 -1
- braindecode-1.3.0.dev169126795/braindecode/version.py +0 -1
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/LICENSE.txt +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/MANIFEST.in +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/NOTICE.txt +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/README.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/augmentation/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/augmentation/base.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/augmentation/functional.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/augmentation/transforms.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/classifier.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/base.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/bbci.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/bcicomp.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/bids.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/experimental.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/hub.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/hub_validation.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/mne.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/moabb.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/nmt.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/registry.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/sleep_physionet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/tuh.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datasets/xy.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datautil/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datautil/channel_utils.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datautil/hub_formats.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datautil/serialization.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/datautil/util.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/eegneuralnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/functional/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/functional/functions.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/functional/initialization.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/attentionbasenet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/attn_sleep.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/base.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/bendr.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/contrawr.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/deep4.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/deepsleepnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eeginception_erp.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eeginception_mi.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegitnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegminer.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegnex.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegsimpleconv.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegsym.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegtcnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/fbcnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/fblightconvnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/fbmsnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/hybrid.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/ifnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/luna.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/sccnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/shallow_fbcsp.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/signal_jepa.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/sinc_shallow.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/sparcnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/sstdpn.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/syncnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/tcn.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/tidnet.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/tsinception.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/usleep.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/util.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/activation.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/attention.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/blocks.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/convolution.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/filter.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/layers.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/linear.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/parametrization.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/stats.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/util.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/modules/wrapper.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/preprocessing/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/preprocessing/mne_preprocess.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/preprocessing/preprocess.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/preprocessing/util.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/preprocessing/windowers.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/regressor.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/samplers/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/samplers/base.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/samplers/ssl.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/training/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/training/callbacks.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/training/losses.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/training/scoring.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/util.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/visualization/__init__.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/visualization/confusion_matrices.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/visualization/gradients.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode.egg-info/SOURCES.txt +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode.egg-info/dependency_links.txt +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode.egg-info/requires.txt +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode.egg-info/top_level.txt +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/Makefile +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/_templates/autosummary/class.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/_templates/autosummary/function.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/api.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/cite.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/conf.py +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/help.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/index.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/install/install.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/install/install_pip.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/install/install_source.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/attention.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/channel.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/convolution.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/filterbank.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/gnn.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/interpretable.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/lbm.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/recurrent.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/categorization/spd.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/models.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/models_categorization.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/models_table.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/models/models_visualization.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/docs/sg_execution_times.rst +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/pyproject.toml +0 -0
- {braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/setup.cfg +0 -0
{braindecode-1.3.0.dev169126795/braindecode.egg-info → braindecode-1.3.0.dev169361694}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: braindecode
|
|
3
|
-
Version: 1.3.0.
|
|
3
|
+
Version: 1.3.0.dev169361694
|
|
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>
|
{braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/atcnet.py
RENAMED
|
@@ -141,7 +141,7 @@ class ATCNet(EEGModuleMixin, nn.Module):
|
|
|
141
141
|
- Pool sizes ``P1,P2`` trade temporal resolution for stability/compute; they set
|
|
142
142
|
``T_c = T/(P1·P2)`` and thus window width ``T_w``.
|
|
143
143
|
- ``n_windows`` controls the ensemble over shifts (compute ∝ windows).
|
|
144
|
-
- ``
|
|
144
|
+
- ``att_num_heads``, ``att_head_dim`` set attention capacity; keep ``H·d_h ≈ F2``.
|
|
145
145
|
- ``tcn_depth``, ``tcn_kernel_size`` govern receptive field; larger values demand
|
|
146
146
|
longer inputs (see minimum length above). The implementation warns and *rescales*
|
|
147
147
|
kernels/pools/windows if inputs are too short.
|
|
@@ -194,10 +194,10 @@ class ATCNet(EEGModuleMixin, nn.Module):
|
|
|
194
194
|
table 1 of the paper [1]_. Defaults to 0.3 as in [1]_.
|
|
195
195
|
n_windows : int
|
|
196
196
|
Number of sliding windows, denoted n in [1]_. Defaults to 5 as in [1]_.
|
|
197
|
-
|
|
197
|
+
att_head_dim : int
|
|
198
198
|
Embedding dimension used in each self-attention head, denoted dh in
|
|
199
199
|
table 1 of the paper [1]_. Defaults to 8 as in [1]_.
|
|
200
|
-
|
|
200
|
+
att_num_heads : int
|
|
201
201
|
Number of attention heads, denoted H in table 1 of the paper [1]_.
|
|
202
202
|
Defaults to 2 as in [1]_.
|
|
203
203
|
att_dropout : float
|
|
@@ -248,8 +248,8 @@ class ATCNet(EEGModuleMixin, nn.Module):
|
|
|
248
248
|
conv_block_depth_mult=2,
|
|
249
249
|
conv_block_dropout=0.3,
|
|
250
250
|
n_windows=5,
|
|
251
|
-
|
|
252
|
-
|
|
251
|
+
att_head_dim=8,
|
|
252
|
+
att_num_heads=2,
|
|
253
253
|
att_drop_prob=0.5,
|
|
254
254
|
tcn_depth=2,
|
|
255
255
|
tcn_kernel_size=4,
|
|
@@ -316,8 +316,8 @@ class ATCNet(EEGModuleMixin, nn.Module):
|
|
|
316
316
|
self.conv_block_depth_mult = conv_block_depth_mult
|
|
317
317
|
self.conv_block_dropout = conv_block_dropout
|
|
318
318
|
self.n_windows = n_windows
|
|
319
|
-
self.
|
|
320
|
-
self.
|
|
319
|
+
self.att_head_dim = att_head_dim
|
|
320
|
+
self.att_num_heads = att_num_heads
|
|
321
321
|
self.att_dropout = att_drop_prob
|
|
322
322
|
self.tcn_depth = tcn_depth
|
|
323
323
|
self.tcn_kernel_size = tcn_kernel_size
|
|
@@ -356,8 +356,8 @@ class ATCNet(EEGModuleMixin, nn.Module):
|
|
|
356
356
|
[
|
|
357
357
|
_AttentionBlock(
|
|
358
358
|
in_shape=self.F2,
|
|
359
|
-
head_dim=self.
|
|
360
|
-
num_heads=
|
|
359
|
+
head_dim=self.att_head_dim,
|
|
360
|
+
num_heads=att_num_heads,
|
|
361
361
|
dropout=att_drop_prob,
|
|
362
362
|
)
|
|
363
363
|
for _ in range(self.n_windows)
|
{braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/biot.py
RENAMED
|
@@ -45,11 +45,11 @@ class BIOT(EEGModuleMixin, nn.Module):
|
|
|
45
45
|
|
|
46
46
|
Parameters
|
|
47
47
|
----------
|
|
48
|
-
|
|
48
|
+
emb_size : int, optional
|
|
49
49
|
The size of the embedding layer, by default 256
|
|
50
|
-
|
|
50
|
+
att_num_heads : int, optional
|
|
51
51
|
The number of attention heads, by default 8
|
|
52
|
-
|
|
52
|
+
n_layers : int, optional
|
|
53
53
|
The number of transformer layers, by default 4
|
|
54
54
|
activation: nn.Module, default=nn.ELU
|
|
55
55
|
Activation function class to apply. Should be a PyTorch activation
|
|
@@ -76,9 +76,9 @@ class BIOT(EEGModuleMixin, nn.Module):
|
|
|
76
76
|
|
|
77
77
|
def __init__(
|
|
78
78
|
self,
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
emb_size=256,
|
|
80
|
+
att_num_heads=8,
|
|
81
|
+
n_layers=4,
|
|
82
82
|
sfreq=200,
|
|
83
83
|
hop_length=100,
|
|
84
84
|
return_feature=False,
|
|
@@ -91,8 +91,8 @@ class BIOT(EEGModuleMixin, nn.Module):
|
|
|
91
91
|
drop_prob: float = 0.5,
|
|
92
92
|
# Parameters for the encoder
|
|
93
93
|
max_seq_len: int = 1024,
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
attn_dropout=0.2,
|
|
95
|
+
attn_layer_dropout=0.2,
|
|
96
96
|
):
|
|
97
97
|
super().__init__(
|
|
98
98
|
n_outputs=n_outputs,
|
|
@@ -103,10 +103,10 @@ class BIOT(EEGModuleMixin, nn.Module):
|
|
|
103
103
|
sfreq=sfreq,
|
|
104
104
|
)
|
|
105
105
|
del n_outputs, n_chans, chs_info, n_times, sfreq
|
|
106
|
-
self.
|
|
106
|
+
self.emb_size = emb_size
|
|
107
107
|
self.hop_length = hop_length
|
|
108
|
-
self.
|
|
109
|
-
self.
|
|
108
|
+
self.att_num_heads = att_num_heads
|
|
109
|
+
self.n_layers = n_layers
|
|
110
110
|
self.return_feature = return_feature
|
|
111
111
|
if (self.sfreq != 200) & (self.sfreq is not None):
|
|
112
112
|
warn(
|
|
@@ -114,7 +114,7 @@ class BIOT(EEGModuleMixin, nn.Module):
|
|
|
114
114
|
+ "no guarantee to generalize well with the default parameters",
|
|
115
115
|
UserWarning,
|
|
116
116
|
)
|
|
117
|
-
if self.n_chans >
|
|
117
|
+
if self.n_chans > emb_size:
|
|
118
118
|
warn(
|
|
119
119
|
"The number of channels is larger than the embedding size. "
|
|
120
120
|
+ "This may cause overfitting. Consider using a larger "
|
|
@@ -142,20 +142,20 @@ class BIOT(EEGModuleMixin, nn.Module):
|
|
|
142
142
|
self.n_fft = int(self.sfreq)
|
|
143
143
|
|
|
144
144
|
self.encoder = _BIOTEncoder(
|
|
145
|
-
emb_size=
|
|
146
|
-
|
|
147
|
-
n_layers=
|
|
145
|
+
emb_size=emb_size,
|
|
146
|
+
att_num_heads=att_num_heads,
|
|
147
|
+
n_layers=n_layers,
|
|
148
148
|
n_chans=self.n_chans,
|
|
149
149
|
n_fft=self.n_fft,
|
|
150
150
|
hop_length=hop_length,
|
|
151
151
|
drop_prob=drop_prob,
|
|
152
152
|
max_seq_len=max_seq_len,
|
|
153
|
-
attn_dropout=
|
|
154
|
-
attn_layer_dropout=
|
|
153
|
+
attn_dropout=attn_dropout,
|
|
154
|
+
attn_layer_dropout=attn_layer_dropout,
|
|
155
155
|
)
|
|
156
156
|
|
|
157
157
|
self.final_layer = _ClassificationHead(
|
|
158
|
-
emb_size=
|
|
158
|
+
emb_size=emb_size,
|
|
159
159
|
n_outputs=self.n_outputs,
|
|
160
160
|
activation=activation,
|
|
161
161
|
)
|
|
@@ -345,7 +345,7 @@ class _BIOTEncoder(nn.Module):
|
|
|
345
345
|
The number of channels
|
|
346
346
|
emb_size: int
|
|
347
347
|
The size of the embedding layer
|
|
348
|
-
|
|
348
|
+
att_num_heads: int
|
|
349
349
|
The number of attention heads
|
|
350
350
|
n_layers: int
|
|
351
351
|
The number of transformer layers
|
|
@@ -358,7 +358,7 @@ class _BIOTEncoder(nn.Module):
|
|
|
358
358
|
def __init__(
|
|
359
359
|
self,
|
|
360
360
|
emb_size=256, # The size of the embedding layer
|
|
361
|
-
|
|
361
|
+
att_num_heads=8, # The number of attention heads
|
|
362
362
|
n_chans=16, # The number of channels
|
|
363
363
|
n_layers=4, # The number of transformer layers
|
|
364
364
|
n_fft=200, # Related with the frequency resolution
|
|
@@ -378,7 +378,7 @@ class _BIOTEncoder(nn.Module):
|
|
|
378
378
|
)
|
|
379
379
|
self.transformer = LinearAttentionTransformer(
|
|
380
380
|
dim=emb_size,
|
|
381
|
-
heads=
|
|
381
|
+
heads=att_num_heads,
|
|
382
382
|
depth=n_layers,
|
|
383
383
|
max_seq_len=max_seq_len,
|
|
384
384
|
attn_layer_dropout=attn_layer_dropout,
|
{braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/ctnet.py
RENAMED
|
@@ -61,11 +61,11 @@ class CTNet(EEGModuleMixin, nn.Module):
|
|
|
61
61
|
----------
|
|
62
62
|
activation : nn.Module, default=nn.GELU
|
|
63
63
|
Activation function to use in the network.
|
|
64
|
-
|
|
64
|
+
heads : int, default=4
|
|
65
65
|
Number of attention heads in the Transformer encoder.
|
|
66
|
-
|
|
66
|
+
emb_size : int or None, default=None
|
|
67
67
|
Embedding size (dimensionality) for the Transformer encoder.
|
|
68
|
-
|
|
68
|
+
depth : int, default=6
|
|
69
69
|
Number of encoder layers in the Transformer.
|
|
70
70
|
n_filters_time : int, default=20
|
|
71
71
|
Number of temporal filters in the first convolutional layer.
|
|
@@ -77,11 +77,11 @@ class CTNet(EEGModuleMixin, nn.Module):
|
|
|
77
77
|
Pooling size for the first average pooling layer.
|
|
78
78
|
pool_size_2 : int, default=8
|
|
79
79
|
Pooling size for the second average pooling layer.
|
|
80
|
-
|
|
80
|
+
drop_prob_cnn : float, default=0.3
|
|
81
81
|
Dropout probability after convolutional layers.
|
|
82
|
-
|
|
82
|
+
drop_prob_posi : float, default=0.1
|
|
83
83
|
Dropout probability for the positional encoding in the Transformer.
|
|
84
|
-
|
|
84
|
+
drop_prob_final : float, default=0.5
|
|
85
85
|
Dropout probability before the final classification layer.
|
|
86
86
|
|
|
87
87
|
Notes
|
|
@@ -111,13 +111,13 @@ class CTNet(EEGModuleMixin, nn.Module):
|
|
|
111
111
|
# Model specific arguments
|
|
112
112
|
activation_patch: nn.Module = nn.ELU,
|
|
113
113
|
activation_transformer: nn.Module = nn.GELU,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
drop_prob_cnn: float = 0.3,
|
|
115
|
+
drop_prob_posi: float = 0.1,
|
|
116
|
+
drop_prob_final: float = 0.5,
|
|
117
117
|
# other parameters
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
heads: int = 4,
|
|
119
|
+
emb_size: Optional[int] = 40,
|
|
120
|
+
depth: int = 6,
|
|
121
121
|
n_filters_time: Optional[int] = None,
|
|
122
122
|
kernel_size: int = 64,
|
|
123
123
|
depth_multiplier: Optional[int] = 2,
|
|
@@ -136,14 +136,14 @@ class CTNet(EEGModuleMixin, nn.Module):
|
|
|
136
136
|
|
|
137
137
|
self.activation_patch = activation_patch
|
|
138
138
|
self.activation_transformer = activation_transformer
|
|
139
|
-
self.
|
|
139
|
+
self.drop_prob_cnn = drop_prob_cnn
|
|
140
140
|
self.pool_size_1 = pool_size_1
|
|
141
141
|
self.pool_size_2 = pool_size_2
|
|
142
142
|
self.kernel_size = kernel_size
|
|
143
|
-
self.
|
|
144
|
-
self.
|
|
145
|
-
self.
|
|
146
|
-
self.
|
|
143
|
+
self.drop_prob_posi = drop_prob_posi
|
|
144
|
+
self.drop_prob_final = drop_prob_final
|
|
145
|
+
self.heads = heads
|
|
146
|
+
self.depth = depth
|
|
147
147
|
# n_times - pool_size_1 / p
|
|
148
148
|
self.sequence_length = math.floor(
|
|
149
149
|
(
|
|
@@ -154,8 +154,8 @@ class CTNet(EEGModuleMixin, nn.Module):
|
|
|
154
154
|
+ 1
|
|
155
155
|
)
|
|
156
156
|
|
|
157
|
-
self.depth_multiplier, self.n_filters_time, self.
|
|
158
|
-
depth_multiplier, n_filters_time,
|
|
157
|
+
self.depth_multiplier, self.n_filters_time, self.emb_size = self._resolve_dims(
|
|
158
|
+
depth_multiplier, n_filters_time, emb_size
|
|
159
159
|
)
|
|
160
160
|
|
|
161
161
|
# Layers
|
|
@@ -168,32 +168,32 @@ class CTNet(EEGModuleMixin, nn.Module):
|
|
|
168
168
|
depth_multiplier=self.depth_multiplier,
|
|
169
169
|
pool_size_1=self.pool_size_1,
|
|
170
170
|
pool_size_2=self.pool_size_2,
|
|
171
|
-
drop_prob=self.
|
|
171
|
+
drop_prob=self.drop_prob_cnn,
|
|
172
172
|
n_chans=self.n_chans,
|
|
173
173
|
activation=self.activation_patch,
|
|
174
174
|
)
|
|
175
175
|
|
|
176
176
|
self.position = _PositionalEncoding(
|
|
177
|
-
emb_size=self.
|
|
178
|
-
drop_prob=self.
|
|
177
|
+
emb_size=self.emb_size,
|
|
178
|
+
drop_prob=self.drop_prob_posi,
|
|
179
179
|
n_times=self.n_times,
|
|
180
180
|
pool_size=self.pool_size_1,
|
|
181
181
|
)
|
|
182
182
|
|
|
183
183
|
self.trans = _TransformerEncoder(
|
|
184
|
-
self.
|
|
185
|
-
self.
|
|
186
|
-
self.
|
|
184
|
+
self.heads,
|
|
185
|
+
self.depth,
|
|
186
|
+
self.emb_size,
|
|
187
187
|
activation=self.activation_transformer,
|
|
188
188
|
)
|
|
189
189
|
|
|
190
190
|
self.flatten_drop_layer = nn.Sequential(
|
|
191
191
|
nn.Flatten(),
|
|
192
|
-
nn.Dropout(p=self.
|
|
192
|
+
nn.Dropout(p=self.drop_prob_final),
|
|
193
193
|
)
|
|
194
194
|
|
|
195
195
|
self.final_layer = nn.Linear(
|
|
196
|
-
in_features=int(self.
|
|
196
|
+
in_features=int(self.emb_size * self.sequence_length),
|
|
197
197
|
out_features=self.n_outputs,
|
|
198
198
|
)
|
|
199
199
|
|
|
@@ -213,7 +213,7 @@ class CTNet(EEGModuleMixin, nn.Module):
|
|
|
213
213
|
"""
|
|
214
214
|
x = self.ensuredim(x)
|
|
215
215
|
cnn = self.cnn(x)
|
|
216
|
-
cnn = cnn * math.sqrt(self.
|
|
216
|
+
cnn = cnn * math.sqrt(self.emb_size)
|
|
217
217
|
cnn = self.position(cnn)
|
|
218
218
|
trans = self.trans(cnn)
|
|
219
219
|
features = cnn + trans
|
{braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/eegconformer.py
RENAMED
|
@@ -57,9 +57,9 @@ class EEGConformer(EEGModuleMixin, nn.Module):
|
|
|
57
57
|
- :class:`_TransformerEncoder` **(context over temporal tokens)**
|
|
58
58
|
|
|
59
59
|
- *Operations.*
|
|
60
|
-
- A stack of ``
|
|
60
|
+
- A stack of ``att_depth`` encoder blocks. :class:`_TransformerEncoderBlock`
|
|
61
61
|
- Each block applies LayerNorm :class:`torch.nn.LayerNorm`
|
|
62
|
-
- Multi-Head Self-Attention (``
|
|
62
|
+
- Multi-Head Self-Attention (``att_heads``) with dropout + residual :class:`MultiHeadAttention` (:class:`torch.nn.Dropout`)
|
|
63
63
|
- LayerNorm :class:`torch.nn.LayerNorm`
|
|
64
64
|
- 2-layer feed-forward (≈4x expansion, :class:`torch.nn.GELU`) with dropout + residual.
|
|
65
65
|
|
|
@@ -100,7 +100,7 @@ class EEGConformer(EEGModuleMixin, nn.Module):
|
|
|
100
100
|
|
|
101
101
|
.. rubric:: Attention / Sequential Modules
|
|
102
102
|
|
|
103
|
-
- **Type.** Standard multi-head self-attention (MHA) with ``
|
|
103
|
+
- **Type.** Standard multi-head self-attention (MHA) with ``att_heads`` heads over the token sequence.
|
|
104
104
|
- **Shapes.** Input/Output: ``(B, S_tokens, D)``; attention operates along the ``S_tokens`` axis.
|
|
105
105
|
- **Role.** Re-weights and integrates evidence across pooled windows, capturing dependencies
|
|
106
106
|
longer than any single token while leaving channel relationships to the convolutional stem.
|
|
@@ -127,7 +127,7 @@ class EEGConformer(EEGModuleMixin, nn.Module):
|
|
|
127
127
|
- **Instantiation.** Choose ``n_filters_time`` (embedding size ``D``) and
|
|
128
128
|
``filter_time_length`` to match the rhythms of interest. Tune
|
|
129
129
|
``pool_time_length/stride`` to trade temporal resolution for sequence length.
|
|
130
|
-
Keep ``
|
|
130
|
+
Keep ``att_depth`` modest (e.g., 4–6) and set ``att_heads`` to divide ``D``.
|
|
131
131
|
``final_fc_length="auto"`` infers the flattened size from PatchEmbedding.
|
|
132
132
|
|
|
133
133
|
Notes
|
|
@@ -160,9 +160,9 @@ class EEGConformer(EEGModuleMixin, nn.Module):
|
|
|
160
160
|
Length of stride between temporal pooling filters.
|
|
161
161
|
drop_prob: float
|
|
162
162
|
Dropout rate of the convolutional layer.
|
|
163
|
-
|
|
163
|
+
att_depth: int
|
|
164
164
|
Number of self-attention layers.
|
|
165
|
-
|
|
165
|
+
att_heads: int
|
|
166
166
|
Number of attention heads.
|
|
167
167
|
att_drop_prob: float
|
|
168
168
|
Dropout rate of the self-attention layer.
|
|
@@ -197,8 +197,8 @@ class EEGConformer(EEGModuleMixin, nn.Module):
|
|
|
197
197
|
pool_time_length=75,
|
|
198
198
|
pool_time_stride=15,
|
|
199
199
|
drop_prob=0.5,
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
att_depth=6,
|
|
201
|
+
att_heads=10,
|
|
202
202
|
att_drop_prob=0.5,
|
|
203
203
|
final_fc_length="auto",
|
|
204
204
|
return_features=False,
|
|
@@ -250,9 +250,9 @@ class EEGConformer(EEGModuleMixin, nn.Module):
|
|
|
250
250
|
self.final_fc_length = final_fc_length
|
|
251
251
|
|
|
252
252
|
self.transformer = _TransformerEncoder(
|
|
253
|
-
|
|
253
|
+
att_depth=att_depth,
|
|
254
254
|
emb_size=n_filters_time,
|
|
255
|
-
|
|
255
|
+
att_heads=att_heads,
|
|
256
256
|
att_drop=att_drop_prob,
|
|
257
257
|
activation=activation_transfor,
|
|
258
258
|
)
|
|
@@ -364,7 +364,7 @@ class _TransformerEncoderBlock(nn.Sequential):
|
|
|
364
364
|
def __init__(
|
|
365
365
|
self,
|
|
366
366
|
emb_size,
|
|
367
|
-
|
|
367
|
+
att_heads,
|
|
368
368
|
att_drop,
|
|
369
369
|
forward_expansion=4,
|
|
370
370
|
activation: nn.Module = nn.GELU,
|
|
@@ -373,7 +373,7 @@ class _TransformerEncoderBlock(nn.Sequential):
|
|
|
373
373
|
_ResidualAdd(
|
|
374
374
|
nn.Sequential(
|
|
375
375
|
nn.LayerNorm(emb_size),
|
|
376
|
-
MultiHeadAttention(emb_size,
|
|
376
|
+
MultiHeadAttention(emb_size, att_heads, att_drop),
|
|
377
377
|
nn.Dropout(att_drop),
|
|
378
378
|
)
|
|
379
379
|
),
|
|
@@ -399,11 +399,11 @@ class _TransformerEncoder(nn.Sequential):
|
|
|
399
399
|
|
|
400
400
|
Parameters
|
|
401
401
|
----------
|
|
402
|
-
|
|
402
|
+
att_depth : int
|
|
403
403
|
Number of transformer encoder blocks.
|
|
404
404
|
emb_size : int
|
|
405
405
|
Embedding size of the transformer encoder.
|
|
406
|
-
|
|
406
|
+
att_heads : int
|
|
407
407
|
Number of attention heads.
|
|
408
408
|
att_drop : float
|
|
409
409
|
Dropout probability for the attention layers.
|
|
@@ -411,14 +411,14 @@ class _TransformerEncoder(nn.Sequential):
|
|
|
411
411
|
"""
|
|
412
412
|
|
|
413
413
|
def __init__(
|
|
414
|
-
self,
|
|
414
|
+
self, att_depth, emb_size, att_heads, att_drop, activation: nn.Module = nn.GELU
|
|
415
415
|
):
|
|
416
416
|
super().__init__(
|
|
417
417
|
*[
|
|
418
418
|
_TransformerEncoderBlock(
|
|
419
|
-
emb_size,
|
|
419
|
+
emb_size, att_heads, att_drop, activation=activation
|
|
420
420
|
)
|
|
421
|
-
for _ in range(
|
|
421
|
+
for _ in range(att_depth)
|
|
422
422
|
]
|
|
423
423
|
)
|
|
424
424
|
|
{braindecode-1.3.0.dev169126795 → braindecode-1.3.0.dev169361694}/braindecode/models/labram.py
RENAMED
|
@@ -83,15 +83,15 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
83
83
|
----------
|
|
84
84
|
patch_size : int
|
|
85
85
|
The size of the patch to be used in the patch embedding.
|
|
86
|
-
|
|
86
|
+
emb_size : int
|
|
87
87
|
The dimension of the embedding.
|
|
88
|
-
|
|
88
|
+
in_conv_channels : int
|
|
89
89
|
The number of convolutional input channels.
|
|
90
|
-
|
|
90
|
+
out_channels : int
|
|
91
91
|
The number of convolutional output channels.
|
|
92
|
-
|
|
92
|
+
n_layers : int (default=12)
|
|
93
93
|
The number of attention layers of the model.
|
|
94
|
-
|
|
94
|
+
att_num_heads : int (default=10)
|
|
95
95
|
The number of attention heads.
|
|
96
96
|
mlp_ratio : float (default=4.0)
|
|
97
97
|
The expansion ratio of the mlp layer
|
|
@@ -155,11 +155,11 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
155
155
|
sfreq=None,
|
|
156
156
|
input_window_seconds=None,
|
|
157
157
|
patch_size=200,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
158
|
+
emb_size=200,
|
|
159
|
+
in_conv_channels=1,
|
|
160
|
+
out_channels=8,
|
|
161
|
+
n_layers=12,
|
|
162
|
+
att_num_heads=10,
|
|
163
163
|
mlp_ratio=4.0,
|
|
164
164
|
qkv_bias=False,
|
|
165
165
|
qk_norm=nn.LayerNorm,
|
|
@@ -187,7 +187,7 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
187
187
|
del n_outputs, n_chans, chs_info, n_times, input_window_seconds, sfreq
|
|
188
188
|
|
|
189
189
|
self.patch_size = patch_size
|
|
190
|
-
self.num_features = self.
|
|
190
|
+
self.num_features = self.emb_size = emb_size
|
|
191
191
|
self.neural_tokenizer = neural_tokenizer
|
|
192
192
|
self.init_scale = init_scale
|
|
193
193
|
|
|
@@ -199,20 +199,20 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
199
199
|
)
|
|
200
200
|
self.patch_size = self.n_times
|
|
201
201
|
self.num_features = None
|
|
202
|
-
self.
|
|
202
|
+
self.emb_size = None
|
|
203
203
|
else:
|
|
204
204
|
self.patch_size = patch_size
|
|
205
205
|
self.n_path = self.n_times // self.patch_size
|
|
206
206
|
|
|
207
|
-
if neural_tokenizer and
|
|
207
|
+
if neural_tokenizer and in_conv_channels != 1:
|
|
208
208
|
warn(
|
|
209
209
|
"The model is in Neural Tokenizer mode, but the variable "
|
|
210
|
-
+ "`
|
|
211
|
-
+ "`
|
|
212
|
-
+ "
|
|
210
|
+
+ "`in_conv_channels` is different from the default values."
|
|
211
|
+
+ "`in_conv_channels` is only needed for the Neural Decoder mode."
|
|
212
|
+
+ "in_conv_channels is not used in the Neural Tokenizer mode.",
|
|
213
213
|
UserWarning,
|
|
214
214
|
)
|
|
215
|
-
|
|
215
|
+
in_conv_channels = 1
|
|
216
216
|
# If you can use the model in Neural Tokenizer mode,
|
|
217
217
|
# temporal conv layer will be use over the patched dataset
|
|
218
218
|
if neural_tokenizer:
|
|
@@ -231,7 +231,7 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
231
231
|
(
|
|
232
232
|
"temporal_conv",
|
|
233
233
|
_TemporalConv(
|
|
234
|
-
out_channels=
|
|
234
|
+
out_channels=out_channels, activation=activation
|
|
235
235
|
),
|
|
236
236
|
),
|
|
237
237
|
]
|
|
@@ -249,8 +249,8 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
249
249
|
_PatchEmbed(
|
|
250
250
|
n_times=self.n_times,
|
|
251
251
|
patch_size=patch_size,
|
|
252
|
-
in_channels=
|
|
253
|
-
emb_dim=self.
|
|
252
|
+
in_channels=in_conv_channels,
|
|
253
|
+
emb_dim=self.emb_size,
|
|
254
254
|
),
|
|
255
255
|
)
|
|
256
256
|
|
|
@@ -259,12 +259,12 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
259
259
|
out = self.patch_embed(dummy)
|
|
260
260
|
# out.shape for tokenizer: (1, n_chans, emb_dim)
|
|
261
261
|
# for decoder: (1, n_patch, patch_size, emb_dim), but we want last dim
|
|
262
|
-
self.
|
|
263
|
-
self.num_features = self.
|
|
262
|
+
self.emb_size = out.shape[-1]
|
|
263
|
+
self.num_features = self.emb_size
|
|
264
264
|
|
|
265
265
|
# Defining the parameters
|
|
266
266
|
# Creating a parameter list with cls token]
|
|
267
|
-
self.cls_token = nn.Parameter(torch.zeros(1, 1, self.
|
|
267
|
+
self.cls_token = nn.Parameter(torch.zeros(1, 1, self.emb_size))
|
|
268
268
|
# Positional embedding and time embedding are complementary
|
|
269
269
|
# one is for the spatial information and the other is for the temporal
|
|
270
270
|
# information.
|
|
@@ -273,26 +273,26 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
273
273
|
# information.
|
|
274
274
|
if use_abs_pos_emb:
|
|
275
275
|
self.position_embedding = nn.Parameter(
|
|
276
|
-
torch.zeros(1, self.n_chans + 1, self.
|
|
276
|
+
torch.zeros(1, self.n_chans + 1, self.emb_size),
|
|
277
277
|
requires_grad=True,
|
|
278
278
|
)
|
|
279
279
|
else:
|
|
280
280
|
self.position_embedding = None
|
|
281
281
|
|
|
282
282
|
self.temporal_embedding = nn.Parameter(
|
|
283
|
-
torch.zeros(1, self.patch_embed[0].n_patchs + 1, self.
|
|
283
|
+
torch.zeros(1, self.patch_embed[0].n_patchs + 1, self.emb_size),
|
|
284
284
|
requires_grad=True,
|
|
285
285
|
)
|
|
286
286
|
self.pos_drop = nn.Dropout(p=drop_prob)
|
|
287
287
|
|
|
288
288
|
dpr = [
|
|
289
|
-
x.item() for x in torch.linspace(0, drop_path_prob,
|
|
289
|
+
x.item() for x in torch.linspace(0, drop_path_prob, n_layers)
|
|
290
290
|
] # stochastic depth decay rule
|
|
291
291
|
self.blocks = nn.ModuleList(
|
|
292
292
|
[
|
|
293
293
|
_WindowsAttentionBlock(
|
|
294
|
-
dim=self.
|
|
295
|
-
num_heads=
|
|
294
|
+
dim=self.emb_size,
|
|
295
|
+
num_heads=att_num_heads,
|
|
296
296
|
mlp_ratio=mlp_ratio,
|
|
297
297
|
qkv_bias=qkv_bias,
|
|
298
298
|
qk_norm=qk_norm,
|
|
@@ -310,14 +310,14 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
310
310
|
attn_head_dim=attn_head_dim,
|
|
311
311
|
activation=activation,
|
|
312
312
|
)
|
|
313
|
-
for i in range(
|
|
313
|
+
for i in range(n_layers)
|
|
314
314
|
]
|
|
315
315
|
)
|
|
316
|
-
self.norm = nn.Identity() if use_mean_pooling else norm_layer(self.
|
|
317
|
-
self.fc_norm = norm_layer(self.
|
|
316
|
+
self.norm = nn.Identity() if use_mean_pooling else norm_layer(self.emb_size)
|
|
317
|
+
self.fc_norm = norm_layer(self.emb_size) if use_mean_pooling else None
|
|
318
318
|
|
|
319
319
|
if self.n_outputs > 0:
|
|
320
|
-
self.final_layer = nn.Linear(self.
|
|
320
|
+
self.final_layer = nn.Linear(self.emb_size, self.n_outputs)
|
|
321
321
|
else:
|
|
322
322
|
self.final_layer = nn.Identity()
|
|
323
323
|
|
|
@@ -415,7 +415,7 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
415
415
|
x = self.patch_embed(x)
|
|
416
416
|
# x shape: (batch, n_chans, emb_dim)
|
|
417
417
|
n_patch = self.n_chans
|
|
418
|
-
temporal = self.
|
|
418
|
+
temporal = self.emb_size
|
|
419
419
|
else:
|
|
420
420
|
# For neural decoder: input is (batch, n_chans, n_times)
|
|
421
421
|
# patch_embed returns (batch, n_patchs, emb_dim)
|
|
@@ -462,7 +462,7 @@ class Labram(EEGModuleMixin, nn.Module):
|
|
|
462
462
|
# In decoder mode, we have n_patch patches and don't need to expand
|
|
463
463
|
# Just broadcast the temporal embedding
|
|
464
464
|
if temporal is None:
|
|
465
|
-
temporal = self.
|
|
465
|
+
temporal = self.emb_size
|
|
466
466
|
|
|
467
467
|
# Get temporal embeddings for n_patch patches
|
|
468
468
|
n_time_tokens = min(n_patch, self.temporal_embedding.shape[1] - 1)
|