braindecode 1.1.1.dev183425073__tar.gz → 1.2.0.dev182094932__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.

Potentially problematic release.


This version of braindecode might be problematic. Click here for more details.

Files changed (122) hide show
  1. {braindecode-1.1.1.dev183425073/braindecode.egg-info → braindecode-1.2.0.dev182094932}/PKG-INFO +1 -1
  2. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegnet.py +54 -4
  3. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/attention.py +6 -3
  4. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/convolution.py +10 -7
  5. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/filter.py +8 -6
  6. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/training/scoring.py +2 -8
  7. braindecode-1.2.0.dev182094932/braindecode/version.py +1 -0
  8. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/visualization/gradients.py +6 -1
  9. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932/braindecode.egg-info}/PKG-INFO +1 -1
  10. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/conf.py +3 -0
  11. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/whats_new.rst +5 -0
  12. braindecode-1.1.1.dev183425073/braindecode/version.py +0 -1
  13. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/LICENSE.txt +0 -0
  14. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/MANIFEST.in +0 -0
  15. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/NOTICE.txt +0 -0
  16. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/README.rst +0 -0
  17. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/__init__.py +0 -0
  18. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/augmentation/__init__.py +0 -0
  19. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/augmentation/base.py +0 -0
  20. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/augmentation/functional.py +0 -0
  21. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/augmentation/transforms.py +0 -0
  22. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/classifier.py +0 -0
  23. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/__init__.py +0 -0
  24. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/base.py +0 -0
  25. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/bbci.py +0 -0
  26. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/bcicomp.py +0 -0
  27. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/bids.py +0 -0
  28. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/mne.py +0 -0
  29. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/moabb.py +0 -0
  30. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/nmt.py +0 -0
  31. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
  32. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/sleep_physionet.py +0 -0
  33. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/tuh.py +0 -0
  34. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datasets/xy.py +0 -0
  35. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datautil/__init__.py +0 -0
  36. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datautil/serialization.py +0 -0
  37. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/datautil/util.py +0 -0
  38. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/eegneuralnet.py +0 -0
  39. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/functional/__init__.py +0 -0
  40. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/functional/functions.py +0 -0
  41. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/functional/initialization.py +0 -0
  42. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/__init__.py +0 -0
  43. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/atcnet.py +0 -0
  44. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/attentionbasenet.py +0 -0
  45. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/base.py +0 -0
  46. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/biot.py +0 -0
  47. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/contrawr.py +0 -0
  48. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/ctnet.py +0 -0
  49. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/deep4.py +0 -0
  50. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/deepsleepnet.py +0 -0
  51. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegconformer.py +0 -0
  52. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eeginception_erp.py +0 -0
  53. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eeginception_mi.py +0 -0
  54. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegitnet.py +0 -0
  55. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegminer.py +0 -0
  56. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegnex.py +0 -0
  57. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegresnet.py +0 -0
  58. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegsimpleconv.py +0 -0
  59. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/eegtcnet.py +0 -0
  60. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/fbcnet.py +0 -0
  61. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/fblightconvnet.py +0 -0
  62. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/fbmsnet.py +0 -0
  63. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/hybrid.py +0 -0
  64. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/ifnet.py +0 -0
  65. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/labram.py +0 -0
  66. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/msvtnet.py +0 -0
  67. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/sccnet.py +0 -0
  68. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/shallow_fbcsp.py +0 -0
  69. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/signal_jepa.py +0 -0
  70. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/sinc_shallow.py +0 -0
  71. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
  72. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
  73. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/sleep_stager_eldele_2021.py +0 -0
  74. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/sparcnet.py +0 -0
  75. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/summary.csv +0 -0
  76. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/syncnet.py +0 -0
  77. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/tcn.py +0 -0
  78. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/tidnet.py +0 -0
  79. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/tsinception.py +0 -0
  80. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/usleep.py +0 -0
  81. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/models/util.py +0 -0
  82. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/__init__.py +0 -0
  83. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/activation.py +0 -0
  84. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/blocks.py +0 -0
  85. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/layers.py +0 -0
  86. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/linear.py +0 -0
  87. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/parametrization.py +0 -0
  88. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/stats.py +0 -0
  89. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/util.py +0 -0
  90. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/modules/wrapper.py +0 -0
  91. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/preprocessing/__init__.py +0 -0
  92. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/preprocessing/mne_preprocess.py +0 -0
  93. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/preprocessing/preprocess.py +0 -0
  94. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/preprocessing/windowers.py +0 -0
  95. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/regressor.py +0 -0
  96. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/samplers/__init__.py +0 -0
  97. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/samplers/base.py +0 -0
  98. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/samplers/ssl.py +0 -0
  99. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/training/__init__.py +0 -0
  100. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/training/callbacks.py +0 -0
  101. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/training/losses.py +0 -0
  102. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/util.py +0 -0
  103. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/visualization/__init__.py +0 -0
  104. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode/visualization/confusion_matrices.py +0 -0
  105. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode.egg-info/SOURCES.txt +0 -0
  106. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode.egg-info/dependency_links.txt +0 -0
  107. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode.egg-info/requires.txt +0 -0
  108. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/braindecode.egg-info/top_level.txt +0 -0
  109. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/Makefile +0 -0
  110. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/_templates/autosummary/class.rst +0 -0
  111. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/_templates/autosummary/function.rst +0 -0
  112. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/api.rst +0 -0
  113. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/cite.rst +0 -0
  114. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/help.rst +0 -0
  115. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/index.rst +0 -0
  116. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/install/install.rst +0 -0
  117. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/install/install_pip.rst +0 -0
  118. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/install/install_source.rst +0 -0
  119. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/models_summary.rst +0 -0
  120. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/docs/sg_execution_times.rst +0 -0
  121. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/pyproject.toml +0 -0
  122. {braindecode-1.1.1.dev183425073 → braindecode-1.2.0.dev182094932}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.1.1.dev183425073
3
+ Version: 1.2.0.dev182094932
4
4
  Summary: Deep learning software to decode EEG, ECG or MEG signals
5
5
  Author-email: Robin Tibor Schirrmeister <robintibor@gmail.com>
6
6
  Maintainer-email: Alexandre Gramfort <agramfort@meta.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Robin Tibor Schirrmeister <robintibor@gmail.com>
@@ -20,13 +20,60 @@ from braindecode.modules import (
20
20
 
21
21
 
22
22
  class EEGNetv4(EEGModuleMixin, nn.Sequential):
23
- """EEGNet v4 model from Lawhern et al. (2018) [EEGNet4]_.
23
+ """EEGNet v4 model from Lawhern et al. (2018) [Lawhern2018]_.
24
+
25
+ :bdg-success:`Convolution` :bdg-secondary:`Depthwise–Separable`
24
26
 
25
27
  .. figure:: https://content.cld.iop.org/journals/1741-2552/15/5/056013/revision2/jneaace8cf01_hr.jpg
26
28
  :align: center
27
- :alt: EEGNet4 Architecture
29
+ :alt: EEGNetv4 Architecture
30
+ :width: 600px
31
+
32
+ .. rubric:: Architectural Overview
33
+
34
+ EEGNetv4 is a compact convolutional network designed for EEG decoding with a
35
+ pipeline that mirrors classical EEG processing:
36
+ - (i) learn temporal frequency-selective filters,
37
+ - (ii) learn spatial filters for those frequencies, and
38
+ - (iii) condense features with depthwise–separable convolutions before a lightweight classifier.
39
+
40
+ The architecture is deliberately small (temporal convolutional and spatial patterns) [Lawhern2018]_.
41
+
42
+ .. rubric:: Macro Components
43
+
44
+ - **Temporal convolution**
45
+ Temporal convolution applied per channel; learns ``F1`` kernels that act as data-driven band-pass filters.
46
+ - **Depthwise Spatial Filtering.**
47
+ Depthwise convolution spanning the channel dimension with ``groups = F1``,
48
+ yielding ``D`` spatial filters for each temporal filter (no cross-filter mixing).
49
+ - **Norm–Nonlinearity–Pooling (+ dropout).**
50
+ Batch normalization → ELU → temporal pooling, with dropout.
51
+ - **Depthwise–Separable Convolution Block.**
52
+ (a) depthwise temporal conv to refine temporal structure;
53
+ (b) pointwise 1x1 conv to mix feature maps into ``F2`` combinations.
54
+ - **Classifier Head.**
55
+ Lightweight 1x1 conv or dense layer (often with max-norm constraint).
28
56
 
29
- See details in [EEGNet4]_.
57
+ .. rubric:: Convolutional Details
58
+
59
+ **Temporal.** The initial temporal convs serve as a *learned filter bank*:
60
+ long 1-D kernels (implemented as 2-D with singleton spatial extent) emphasize oscillatory bands and transients.
61
+ Because this stage is linear prior to BN/ELU, kernels can be analyzed as FIR filters to reveal each feature’s spectrum [Lawhern2018]_.
62
+
63
+ **Spatial.** The depthwise spatial conv spans the full channel axis (kernel height = #electrodes; temporal size = 1).
64
+ With ``groups = F1``, each temporal filter learns its own set of ``D`` spatial projections—akin to CSP, learned end-to-end and
65
+ typically regularized with max-norm.
66
+
67
+ **Spectral.** No explicit Fourier/wavelet transform is used. Frequency structure
68
+ is captured implicitly by the temporal filter bank; later depthwise temporal kernels act as short-time integrators/refiners.
69
+
70
+ .. rubric:: Additional Comments
71
+
72
+ - **Filter-bank structure:** Parallel temporal kernels (``F1``) emulate classical filter banks; pairing them with frequency-specific spatial filters
73
+ yields features mappable to rhythms and topographies.
74
+ - **Depthwise & separable convs:** Parameter-efficient decomposition (depthwise + pointwise) retains power while limiting overfitting
75
+ [Chollet2017]_ and keeps temporal vs. mixing steps interpretable.
76
+ - **Regularization:** Batch norm, dropout, pooling, and optional max-norm on spatial kernels aid stability on small EEG datasets.
30
77
 
31
78
  Parameters
32
79
  ----------
@@ -68,10 +115,13 @@ class EEGNetv4(EEGModuleMixin, nn.Sequential):
68
115
 
69
116
  References
70
117
  ----------
71
- .. [EEGNet4] Lawhern, V. J., Solon, A. J., Waytowich, N. R., Gordon, S. M.,
118
+ .. [Lawhern2018] Lawhern, V. J., Solon, A. J., Waytowich, N. R., Gordon, S. M.,
72
119
  Hung, C. P., & Lance, B. J. (2018). EEGNet: a compact convolutional
73
120
  neural network for EEG-based brain–computer interfaces. Journal of
74
121
  neural engineering, 15(5), 056013.
122
+ .. [Chollet2017] Chollet, F., *Xception: Deep Learning with Depthwise Separable
123
+ Convolutions*, CVPR, 2017.
124
+
75
125
  """
76
126
 
77
127
  def __init__(
@@ -157,7 +157,8 @@ class FCA(nn.Module):
157
157
  ):
158
158
  super(FCA, self).__init__()
159
159
  mapper_y = [freq_idx]
160
- assert in_channels % len(mapper_y) == 0
160
+ if in_channels % len(mapper_y) != 0:
161
+ raise ValueError("in_channels must be divisible by number of DCT filters")
161
162
 
162
163
  self.weight = nn.Parameter(
163
164
  self.get_dct_filter(seq_len, mapper_y, in_channels), requires_grad=False
@@ -295,7 +296,8 @@ class ECA(nn.Module):
295
296
  def __init__(self, in_channels: int, kernel_size: int):
296
297
  super(ECA, self).__init__()
297
298
  self.gap = nn.AdaptiveAvgPool2d(1)
298
- assert kernel_size % 2 == 1, "kernel size must be odd for same padding"
299
+ if kernel_size % 2 != 1:
300
+ raise ValueError("kernel size must be odd for same padding")
299
301
  self.conv = nn.Conv1d(
300
302
  1, 1, kernel_size=kernel_size, padding=kernel_size // 2, bias=False
301
303
  )
@@ -530,7 +532,8 @@ class CBAM(nn.Module):
530
532
  nn.ReLU(),
531
533
  nn.Conv2d(in_channels // reduction_rate, in_channels, 1, bias=False),
532
534
  )
533
- assert kernel_size % 2 == 1, "kernel size must be odd for same padding"
535
+ if kernel_size % 2 != 1:
536
+ raise ValueError("kernel size must be odd for same padding")
534
537
  self.conv = nn.Conv2d(2, 1, (1, kernel_size), padding=(0, kernel_size // 2))
535
538
 
536
539
  def forward(self, x):
@@ -136,7 +136,8 @@ class CombinedConv(nn.Module):
136
136
  # Calculate bias terms
137
137
  if self.bias_time:
138
138
  time_bias = self.conv_time.bias
139
- assert time_bias is not None
139
+ if time_bias is None:
140
+ raise RuntimeError("conv_time.bias is None despite bias_time=True")
140
141
  calculated_bias = (
141
142
  self.conv_spat.weight.squeeze()
142
143
  .sum(-1)
@@ -145,7 +146,8 @@ class CombinedConv(nn.Module):
145
146
  )
146
147
  if self.bias_spat:
147
148
  spat_bias = self.conv_spat.bias
148
- assert spat_bias is not None
149
+ if spat_bias is None:
150
+ raise RuntimeError("conv_spat.bias is None despite bias_spat=True")
149
151
  if calculated_bias is None:
150
152
  calculated_bias = spat_bias
151
153
  else:
@@ -190,11 +192,12 @@ class CausalConv1d(nn.Conv1d):
190
192
  dilation=1,
191
193
  **kwargs,
192
194
  ):
193
- assert "padding" not in kwargs, (
194
- "The padding parameter is controlled internally by "
195
- f"{type(self).__name__} class. You should not try to override this"
196
- " parameter."
197
- )
195
+ if "padding" in kwargs:
196
+ raise ValueError(
197
+ "The padding parameter is controlled internally by "
198
+ f"{type(self).__name__} class. You should not try to override this"
199
+ " parameter."
200
+ )
198
201
 
199
202
  super().__init__(
200
203
  in_channels=in_channels,
@@ -452,12 +452,14 @@ class GeneralizedGaussianFilter(nn.Module):
452
452
  self.inverse_fourier = inverse_fourier
453
453
  self.affine_group_delay = affine_group_delay
454
454
  self.clamp_f_mean = clamp_f_mean
455
- assert out_channels % in_channels == 0, (
456
- "out_channels has to be multiple of in_channels"
457
- )
458
- assert len(f_mean) * in_channels == out_channels
459
- assert len(bandwidth) * in_channels == out_channels
460
- assert len(shape) * in_channels == out_channels
455
+ if out_channels % in_channels != 0:
456
+ raise ValueError("out_channels has to be multiple of in_channels")
457
+ if len(f_mean) * in_channels != out_channels:
458
+ raise ValueError("len(f_mean) * in_channels must equal out_channels")
459
+ if len(bandwidth) * in_channels != out_channels:
460
+ raise ValueError("len(bandwidth) * in_channels must equal out_channels")
461
+ if len(shape) * in_channels != out_channels:
462
+ raise ValueError("len(shape) * in_channels must equal out_channels")
461
463
 
462
464
  # Range from 0 to half sample rate, normalized
463
465
  self.n_range = nn.Parameter(
@@ -11,7 +11,6 @@ from contextlib import contextmanager
11
11
 
12
12
  import numpy as np
13
13
  import torch
14
- from mne.utils.check import check_version
15
14
  from skorch.callbacks.scoring import EpochScoring
16
15
  from skorch.dataset import unpack_data
17
16
  from skorch.utils import to_numpy
@@ -370,13 +369,8 @@ class PostEpochTrainScoring(EpochScoring):
370
369
  y_preds = []
371
370
  y_test = []
372
371
  for batch in iterator:
373
- batch_X, batch_y = unpack_data(batch)
374
- # TODO: remove after skorch 0.10 release
375
- if not check_version("skorch", min_version="0.10.1"):
376
- yp = net.evaluation_step(batch_X, training=False)
377
- # X, y unpacking has been pushed downstream in skorch 0.10
378
- else:
379
- yp = net.evaluation_step(batch, training=False)
372
+ _, batch_y = unpack_data(batch)
373
+ yp = net.evaluation_step(batch, training=False)
380
374
  yp = yp.to(device="cpu")
381
375
  y_test.append(self.target_extractor(batch_y))
382
376
  y_preds.append(yp)
@@ -0,0 +1 @@
1
+ __version__ = "1.2.0.dev182094932"
@@ -6,8 +6,13 @@ import numpy as np
6
6
  import torch
7
7
  from skorch.utils import to_numpy, to_tensor
8
8
 
9
+ from braindecode.util import set_random_seeds
9
10
 
10
- def compute_amplitude_gradients(model, dataset, batch_size):
11
+
12
+ def compute_amplitude_gradients(model, dataset, batch_size, seed=20240205):
13
+ """Compute amplitude gradients after seeding for reproducibility."""
14
+ cuda = next(model.parameters()).is_cuda
15
+ set_random_seeds(seed=seed, cuda=cuda)
11
16
  loader = torch.utils.data.DataLoader(
12
17
  dataset, batch_size=batch_size, drop_last=False, shuffle=False
13
18
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.1.1.dev183425073
3
+ Version: 1.2.0.dev182094932
4
4
  Summary: Deep learning software to decode EEG, ECG or MEG signals
5
5
  Author-email: Robin Tibor Schirrmeister <robintibor@gmail.com>
6
6
  Maintainer-email: Alexandre Gramfort <agramfort@meta.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Robin Tibor Schirrmeister <robintibor@gmail.com>
@@ -166,6 +166,9 @@ templates_path = ["_templates"]
166
166
  # source_suffix = ['.rst', '.md']
167
167
  source_suffix = ".rst"
168
168
 
169
+ rst_prolog = """
170
+ .. role:: tag(bdg-success)
171
+ """
169
172
  # The master toctree document.
170
173
  master_doc = "index"
171
174
 
@@ -22,6 +22,11 @@ Current 1.2 (dev)
22
22
 
23
23
  Enhancements
24
24
  ~~~~~~~~~~~~
25
+ - Improving the docstring for :class:`braindecode.models.EEGNetv4` (:gh:`768` by `Bruno Aristimunha`_)
26
+
27
+
28
+ API changes
29
+ ~~~~~~~~~~~
25
30
 
26
31
  Bugs
27
32
  ~~~~
@@ -1 +0,0 @@
1
- __version__ = "1.1.1.dev183425073"