{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/spd-domain-specific-batch-normalization-to","title":"SPD domain-specific batch normalization to crack interpretable unsupervised domain adaptation in EEG","arxiv_id":"2206.01323","date":"2022-06-02","proceeding":null,"authors":["Reinmar J Kobler","Jun-Ichiro Hirayama","Qibin Zhao","Motoaki Kawanabe"],"abstract":"Electroencephalography (EEG) provides access to neuronal dynamics non-invasively with millisecond resolution, rendering it a viable method in neuroscience and healthcare. However, its utility is limited as current EEG technology does not generalize well across domains (i.e., sessions and subjects) without expensive supervised re-calibration. Contemporary methods cast this transfer learning (TL) problem as a multi-source/-target unsupervised domain adaptation (UDA) problem and address it with deep learning or shallow, Riemannian geometry aware alignment methods. Both directions have, so far, failed to consistently close the performance gap to state-of-the-art domain-specific methods based on tangent space mapping (TSM) on the symmetric positive definite (SPD) manifold. Here, we propose a theory-based machine learning framework that enables, for the first time, learning domain-invariant TSM models in an end-to-end fashion. To achieve this, we propose a new building block for geometric deep learning, which we denote SPD domain-specific momentum batch normalization (SPDDSMBN). A SPDDSMBN layer can transform domain-specific SPD inputs into domain-invariant SPD outputs, and can be readily applied to multi-source/-target and online UDA scenarios. In extensive experiments with 6 diverse EEG brain-computer interface (BCI) datasets, we obtain state-of-the-art performance in inter-session and -subject TL with a simple, intrinsically interpretable network architecture, which we denote TSMNet.","url_abs":"https://arxiv.org/abs/2206.01323v2","url_pdf":"https://arxiv.org/pdf/2206.01323v2.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"spd-domain-specific-batch-normalization-to","repo_url":"https://github.com/rkobler/TSMNet","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"BSD-3-Clause"}}],"tasks":[{"task_slug":"brain-computer-interface","task_name":"Brain Computer Interface"},{"task_slug":"domain-adaptation","task_name":"Domain Adaptation"},{"task_slug":"eeg-1","task_name":"EEG"},{"task_slug":"eeg","task_name":"Electroencephalogram (EEG)"},{"task_slug":"transfer-learning","task_name":"Transfer Learning"},{"task_slug":"unsupervised-domain-adaptation","task_name":"Unsupervised Domain Adaptation"}],"methods":[{"method_slug":"aware","method_name":"AWARE"},{"method_slug":"batch-normalization","method_name":"Batch Normalization"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2206.01323","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2206.01323"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/rkobler/TSMNet","reach":{"status":"ok","spdx":"BSD-3-Clause"}}],"summary":{"ran":2,"ran_violates":1,"unverified":5},"by_repo_kind":{"official":{"samples":8,"ran":3,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"943ae75cff49f97d","entry":"broadcast_dims","repo":"rkobler/TSMNet","repo_kind":"official","path":"spdnets/functionals.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/spdnets/functionals.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"943ae75cff49f97d"}},{"code_sha256_prefix":"58a1c96ea5709535","entry":"ensure_sym","repo":"rkobler/TSMNet","repo_kind":"official","path":"spdnets/functionals.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/spdnets/functionals.py","link_basis":"harvester_set","language":"python","status":"ran_violates","verification_level":1,"contract_check":"VIOLATES","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"58a1c96ea5709535"}},{"code_sha256_prefix":"1e2aa95942f11e42","entry":"sum_bcastdims","repo":"rkobler/TSMNet","repo_kind":"official","path":"spdnets/functionals.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/spdnets/functionals.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"1e2aa95942f11e42"}},{"code_sha256_prefix":"2427dab9c001d778","entry":"difference_within_evaluation","repo":"rkobler/TSMNet","repo_kind":"official","path":"experiments/resultio.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/experiments/resultio.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"2427dab9c001d778"}},{"code_sha256_prefix":"ee737b09bff04e28","entry":"loadresults","repo":"rkobler/TSMNet","repo_kind":"official","path":"experiments/resultio.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/experiments/resultio.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"ee737b09bff04e28"}},{"code_sha256_prefix":"c20a253f4ac0abbc","entry":"orderedeigh","repo":"rkobler/TSMNet","repo_kind":"official","path":"experiments/figure3.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/experiments/figure3.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"c20a253f4ac0abbc"}},{"code_sha256_prefix":"4d5814f5caeb8534","entry":"summarize_score","repo":"rkobler/TSMNet","repo_kind":"official","path":"experiments/tables.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/experiments/tables.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"4d5814f5caeb8534"}},{"code_sha256_prefix":"8720b5504bcf2aad","entry":"summarize_within_evaluation","repo":"rkobler/TSMNet","repo_kind":"official","path":"experiments/resultio.py","file_url":"https://github.com/rkobler/TSMNet/blob/HEAD/experiments/resultio.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"8720b5504bcf2aad"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}