├── README.md
└── AVGC_SincAlignNet.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # SincAlignNet
2 |
3 | **Implementation based on:**
4 | *Frequency-Based Alignment of EEG and Audio Signals Using Contrastive Learning and SincNet for Auditory Attention Detection*
5 |
6 | SincAlignNet is an innovative framework for auditory attention detection that aligns EEG and audio features using an enhanced SincNet architecture with contrastive learning. It achieves state-of-the-art accuracy on KUL and DTU datasets, supporting efficient low-density EEG decoding for practical neuro-guided hearing aids.
7 |
8 | ---
9 |
10 | ## Framework Overview
11 | 
12 | **Fig. 1:** SincAlignNet architecture for AAD, consisting of two phases:
13 | 1. **Contrastive Learning** - Aligns EEG and attended audio encodings by maximizing mutual information of correct EEG-Audio pairs
14 | 2. **Inference** - Identifies attended audio via cosine similarity between EEG/audio features or direct EEG-based inference
15 |
16 | ---
17 |
18 | ## Encoder Architecture
19 | 
20 | **Fig. 2:** EEG and Audio encoder structure. Both encoders contain four components:
21 | 1. **Multi-SincNet Bandpass**
22 | - EEG: 60 filters | Audio: 320 filters
23 | 2. **Depth Conv1D** - Combines filter outputs for deeper features
24 | 3. **Down Sample** - Compresses data while preserving key information
25 | 4. **Projector** - Maps features to 128D latent space
26 |
27 | ---
28 |
29 | ## Module Specifications
30 |
31 |
32 | **Fig. 3:** Component implementations:
33 | (a) Depth-wise 1D convolution block
34 | (b) Down sample module
35 | (c) Projector architecture
36 |
37 | ---
38 |
39 | ## Biological Motivation
40 | 
41 | **Fig. 4:** Proposed auditory attention mechanisms:
42 | 1. **Noise Reduction (Fig 4a)**
43 | - Brain processes mixed audio → extracts attended speaker
44 | - Simulated using SincNet filtering architecture
45 |
46 | 2. **Information Minimization (Fig 4b)**
47 | - Attentional focus minimizes mutual information entropy
48 | - Implemented via contrastive learning paradigm
49 |
50 | ---
51 |
--------------------------------------------------------------------------------
/AVGC_SincAlignNet.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "58b68c4a",
6 | "metadata": {},
7 | "source": [
8 | "# Preparation"
9 | ]
10 | },
11 | {
12 | "cell_type": "markdown",
13 | "id": "4436138b",
14 | "metadata": {},
15 | "source": [
16 | "## Requirment"
17 | ]
18 | },
19 | {
20 | "cell_type": "code",
21 | "execution_count": null,
22 | "id": "72fe33b3",
23 | "metadata": {
24 | "ExecuteTime": {
25 | "end_time": "2024-12-15T13:14:57.286812Z",
26 | "start_time": "2024-12-15T13:14:56.050218Z"
27 | }
28 | },
29 | "outputs": [],
30 | "source": [
31 | "import torch\n",
32 | "from torch import nn\n",
33 | "import torch.nn.functional as F\n",
34 | "from torch.autograd import Variable\n",
35 | "from torch.utils.data import Dataset, DataLoader, random_split, Subset\n",
36 | "import torchaudio\n",
37 | "from torchaudio import transforms\n",
38 | "import math, copy, time, random, os\n",
39 | "import numpy as np\n",
40 | "import scipy.io as sio\n",
41 | "import scipy.sparse as sp\n",
42 | "import pandas as pd\n",
43 | "import itertools\n",
44 | "import matplotlib.pyplot as plt\n",
45 | "from warmup_scheduler import GradualWarmupScheduler\n",
46 | "from einops import rearrange\n",
47 | "from tqdm import tqdm\n",
48 | "import shutil\n",
49 | "from pathlib import Path\n"
50 | ]
51 | },
52 | {
53 | "cell_type": "markdown",
54 | "id": "4f96dda6",
55 | "metadata": {},
56 | "source": [
57 | "## Config"
58 | ]
59 | },
60 | {
61 | "cell_type": "code",
62 | "execution_count": null,
63 | "id": "bc6c6851",
64 | "metadata": {
65 | "ExecuteTime": {
66 | "end_time": "2024-12-15T13:14:57.298380Z",
67 | "start_time": "2024-12-15T13:14:57.288877Z"
68 | }
69 | },
70 | "outputs": [],
71 | "source": [
72 | "class Config:\n",
73 | " def __init__(self, subject: str = '2'):\n",
74 | " # ---------- subject ----------\n",
75 | " self.subject = str(subject)\n",
76 | " self.update_file_name() # update file_name\n",
77 | "\n",
78 | " # ---------- dataloading ----------\n",
79 | " self.root: Path = Path('/home/test/Desktop/python/EEG_data/AAD_dataset/AVGC/dataset/dataset_1s')\n",
80 | "\n",
81 | " self.total_sub = 18\n",
82 | " self.LOO = 1\n",
83 | " self.sample_rate = 16000\n",
84 | " \n",
85 | " # ---------- encoder dim ----------\n",
86 | " self.EEG_encoder_dim = 256\n",
87 | " self.Audio_encoder_dim = 256\n",
88 | " \n",
89 | " # ---------- projector dim ----------\n",
90 | " self.Embedding_dim = 256\n",
91 | " self.Projector_dim = 128\n",
92 | " \n",
93 | " # ---------- EEG/Audio ----------\n",
94 | " self.num_channels = 64\n",
95 | " self.clean_audio_size = 80\n",
96 | " self.noisy_audio_size = 80\n",
97 | " \n",
98 | " # ---------- training ----------\n",
99 | " self.Temperature = 0.1\n",
100 | " self.batch_size = 8\n",
101 | " self.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
102 | " self.weight_decay = 1e-3\n",
103 | " self.EEG_encoder_lr = 2e-4\n",
104 | " self.Audio_encoder_lr = 1e-4\n",
105 | " self.head_lr = 1e-4\n",
106 | " self.patience = 2\n",
107 | " self.factor = 0.8\n",
108 | " self.epochs = 40\n",
109 | " self.dropout = 0.1\n",
110 | "\n",
111 | " # ---------- helper ----------\n",
112 | " def update_file_name(self):\n",
113 | " self.file_name = f\"sub{self.subject}.npz\"\n",
114 | " def __repr__(self):\n",
115 | " return (f\"Config(subject={self.subject}, file_name={self.file_name}, \"\n",
116 | " f\"device={self.device}, batch_size={self.batch_size})\")"
117 | ]
118 | },
119 | {
120 | "cell_type": "markdown",
121 | "id": "2e1404fe",
122 | "metadata": {},
123 | "source": [
124 | "## Prepare Dataset"
125 | ]
126 | },
127 | {
128 | "cell_type": "code",
129 | "execution_count": null,
130 | "id": "f106c6e8",
131 | "metadata": {},
132 | "outputs": [],
133 | "source": [
134 | "def load_data(root, subject):\n",
135 | "\n",
136 | " \"\"\"\n",
137 | " 加载 EEG 数据、音频数据及对应事件标签\n",
138 | " :param root: 数据根路径\n",
139 | " :param subject: 受试者编号\n",
140 | " :return: eeg_data, attend_audio, audioA_data, audioB_data, event\n",
141 | " \"\"\"\n",
142 | " # 构建文件路径\n",
143 | " npz_file = os.path.join(root, f\"sub{subject}.npz\")\n",
144 | " \n",
145 | " # 从 NPZ 文件加载数据\n",
146 | " data = np.load(npz_file)\n",
147 | " \n",
148 | " # 提取数据\n",
149 | " eeg_data = data['eeg_data'] # EEG 数据 (样本数, 64, 128)\n",
150 | " audio_data = data['audio_data'] # 音频数据 (样本数, 3, 128)\n",
151 | " event = data['event_data'] # 事件标签 (样本数,)\n",
152 | " \n",
153 | " # 拆分音频通道\n",
154 | " # 音频数据的三个通道: [0]左声道包络, [1]右声道包络, [2]关注的包络\n",
155 | " audioA_data = audio_data[:, 0, :] # 左声道 (样本数, 128)\n",
156 | " audioB_data = audio_data[:, 1, :] # 右声道 (样本数, 128)\n",
157 | " attend_audio = audio_data[:, 2, :] # 关注的包络 (样本数, 128)\n",
158 | " \n",
159 | " return eeg_data, attend_audio, audioA_data, audioB_data, event"
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "execution_count": null,
165 | "id": "c0b5c406",
166 | "metadata": {
167 | "ExecuteTime": {
168 | "end_time": "2024-12-15T13:14:58.187604Z",
169 | "start_time": "2024-12-15T13:14:57.300530Z"
170 | }
171 | },
172 | "outputs": [],
173 | "source": [
174 | "\n",
175 | "class EEGDataset(Dataset):\n",
176 | " def __init__(self, config, subject):\n",
177 | " \"\"\"\n",
178 | " 初始化数据集\n",
179 | " :param config: 配置对象,包含数据路径等信息\n",
180 | " :param subject: 受试者编号\n",
181 | " \"\"\"\n",
182 | "\n",
183 | " # 加载数据 - 现在返回五个元素\n",
184 | " self.eeg_data, self.attend_audio, self.audioA_data, self.audioB_data, self.event = load_data(\n",
185 | " config.root, subject\n",
186 | " )\n",
187 | " \n",
188 | " # 确保数据长度一致\n",
189 | " assert len(self.eeg_data) == len(self.attend_audio) == len(self.audioA_data) == len(self.audioB_data) == len(self.event)\n",
190 | " \n",
191 | " # 将事件标签转换为torch tensor\n",
192 | " self.event = torch.tensor(self.event, dtype=torch.long)\n",
193 | " # Only keep temporal lobe channels\n",
194 | " self.temporal_indices = [15, 16, 51, 52, 7, 41] # Corresponding indices of T7, TP7, T8, TP8, FT7, FT8 in channel_names\n",
195 | "\n",
196 | " \n",
197 | " def __len__(self):\n",
198 | " return len(self.eeg_data)\n",
199 | " \n",
200 | " def __getitem__(self, idx):\n",
201 | " if torch.is_tensor(idx):\n",
202 | " idx = idx.tolist()\n",
203 | " \n",
204 | " # 处理EEG数据\n",
205 | " eeg = self.eeg_data[idx].astype(np.float32)[self.temporal_indices, :]\n",
206 | "# eeg = self.eeg_data[idx].astype(np.float32) # (64, 128)/\n",
207 | " eeg = torch.Tensor(eeg)\n",
208 | " \n",
209 | " # 归一化每个通道 (0-1)\n",
210 | " eeg_min, _ = torch.min(eeg, dim=1, keepdim=True)\n",
211 | " eeg_max, _ = torch.max(eeg, dim=1, keepdim=True)\n",
212 | " eeg = (eeg - eeg_min) / (eeg_max - eeg_min + 1e-8) # 添加小常数避免除以0\n",
213 | " \n",
214 | " # 获取关注的音频作为干净信号\n",
215 | " clean_audio = torch.Tensor(self.attend_audio[idx].astype(np.float32)).unsqueeze(0) # (1, 128)\n",
216 | " \n",
217 | " # 获取左右声道音频\n",
218 | " wavA = torch.Tensor(self.audioA_data[idx].astype(np.float32)).unsqueeze(0) # (1, 128)\n",
219 | " wavB = torch.Tensor(self.audioB_data[idx].astype(np.float32)).unsqueeze(0) # (1, 128)\n",
220 | " \n",
221 | " # 获取事件标签\n",
222 | " event_label = self.event[idx]\n",
223 | " \n",
224 | " return eeg, clean_audio, wavA, wavB, event_label"
225 | ]
226 | },
227 | {
228 | "cell_type": "markdown",
229 | "id": "542bf464",
230 | "metadata": {},
231 | "source": [
232 | "## Utils"
233 | ]
234 | },
235 | {
236 | "cell_type": "code",
237 | "execution_count": 4,
238 | "id": "4a7787d2",
239 | "metadata": {
240 | "ExecuteTime": {
241 | "end_time": "2024-12-15T13:14:58.430651Z",
242 | "start_time": "2024-12-15T13:14:58.189742Z"
243 | }
244 | },
245 | "outputs": [],
246 | "source": [
247 | "def print_size(net, keyword=None):\n",
248 | " \"\"\"\n",
249 | " Print the number of parameters of a network\n",
250 | " \"\"\"\n",
251 | "\n",
252 | " if net is not None and isinstance(net, torch.nn.Module):\n",
253 | " module_parameters = filter(lambda p: p.requires_grad, net.parameters())\n",
254 | " params = sum([np.prod(p.size()) for p in module_parameters])\n",
255 | " \n",
256 | " print(\"{} Parameters: {:.6f}M\".format(\n",
257 | " net.__class__.__name__, params / 1e6), flush=True, end=\"; \")\n",
258 | " \n",
259 | " if keyword is not None:\n",
260 | " keyword_parameters = [p for name, p in net.named_parameters() if p.requires_grad and keyword in name]\n",
261 | " params = sum([np.prod(p.size()) for p in keyword_parameters])\n",
262 | " print(\"{} Parameters: {:.6f}M\".format(\n",
263 | " keyword, params / 1e6), flush=True, end=\"; \")\n",
264 | " \n",
265 | " print(\" \")"
266 | ]
267 | },
268 | {
269 | "cell_type": "code",
270 | "execution_count": 5,
271 | "id": "3fd6c585",
272 | "metadata": {
273 | "ExecuteTime": {
274 | "end_time": "2024-12-15T13:14:58.508085Z",
275 | "start_time": "2024-12-15T13:14:58.432625Z"
276 | }
277 | },
278 | "outputs": [],
279 | "source": [
280 | "class AvgMeter:\n",
281 | " def __init__(self, name=\"Metric\"):\n",
282 | " self.name = name\n",
283 | " self.reset()\n",
284 | "\n",
285 | " def reset(self):\n",
286 | " self.avg, self.sum, self.count = [0] * 3\n",
287 | "\n",
288 | " def update(self, val, count=1):\n",
289 | " self.count += count\n",
290 | " self.sum += val * count\n",
291 | " self.avg = self.sum / self.count\n",
292 | "\n",
293 | " def __repr__(self):\n",
294 | " text = f\"{self.name}: {self.avg:.4f}\"\n",
295 | " return text\n",
296 | "\n",
297 | "def get_lr(optimizer):\n",
298 | " for param_group in optimizer.param_groups:\n",
299 | " return param_group[\"lr\"]"
300 | ]
301 | },
302 | {
303 | "cell_type": "code",
304 | "execution_count": 6,
305 | "id": "dabfd930",
306 | "metadata": {
307 | "ExecuteTime": {
308 | "end_time": "2024-12-15T13:14:58.568839Z",
309 | "start_time": "2024-12-15T13:14:58.510001Z"
310 | }
311 | },
312 | "outputs": [],
313 | "source": [
314 | "def pre_evaluate(dataloader, model):\n",
315 | " num_batches = len(dataloader)\n",
316 | " model.eval()\n",
317 | " test_loss, correct = 0, 0\n",
318 | " with torch.no_grad():\n",
319 | " for eeg, audio, wavA, wavB, event in dataloader:\n",
320 | " eeg, audio = eeg.to(Config.device), audio.to(Config.device)\n",
321 | " wavA = wavA.to(Config.device)\n",
322 | " wavB = wavB.to(Config.device)\n",
323 | " event = event.to(Config.device)\n",
324 | " event = event.squeeze()\n",
325 | "# print(eeg.shape, audio.shape, wavA.shape, wavB.shape)\n",
326 | " _, pred = model(eeg, audio, wavA, wavB)\n",
327 | " # print(pred)\n",
328 | " _, predicted = torch.max(pred, 1)\n",
329 | " # print(predicted)\n",
330 | " correct += (predicted == event).sum().item()\n",
331 | " accuracy = correct / len(dataloader.dataset)\n",
332 | " return accuracy"
333 | ]
334 | },
335 | {
336 | "cell_type": "code",
337 | "execution_count": null,
338 | "id": "d4bd57e0",
339 | "metadata": {},
340 | "outputs": [],
341 | "source": [
342 | "class AutomaticWeightedLoss(nn.Module):\n",
343 | " \"\"\"automatically weighted multi-task loss\n",
344 | " Params:\n",
345 | " num: int,the number of loss\n",
346 | " x: multi-task loss\n",
347 | " Examples:\n",
348 | " loss1=1\n",
349 | " loss2=2\n",
350 | " awl = AutomaticWeightedLoss(2)\n",
351 | " loss_sum = awl(loss1, loss2)\n",
352 | " \"\"\"\n",
353 | " def __init__(self, num=2):\n",
354 | " super(AutomaticWeightedLoss, self).__init__()\n",
355 | " params = torch.ones(num, requires_grad=True)\n",
356 | " self.params = torch.nn.Parameter(params)\n",
357 | "# print(self.params)\n",
358 | "\n",
359 | " def forward(self, *x):\n",
360 | " loss_sum = 0\n",
361 | " length = len(x)-1\n",
362 | " for i, loss in enumerate(x):\n",
363 | " if i == length:\n",
364 | " loss_sum += 1 / (self.params[i] ** 2) * loss + torch.log(self.params[i])\n",
365 | " else:\n",
366 | " loss_sum += 0.5 / (self.params[i] ** 2) * loss + torch.log(self.params[i])\n",
367 | " return loss_sum\n",
368 | " "
369 | ]
370 | },
371 | {
372 | "cell_type": "code",
373 | "execution_count": null,
374 | "id": "0fe85f3a",
375 | "metadata": {},
376 | "outputs": [],
377 | "source": [
378 | "# A class for contrastive loss\n",
379 | "class ComputeLoss(nn.Module):\n",
380 | " def __init__(self, ):\n",
381 | " super(ComputeLoss, self).__init__()\n",
382 | " self.awl = AutomaticWeightedLoss(2)\n",
383 | " self.classification_loss = nn.CrossEntropyLoss()\n",
384 | " \n",
385 | " def forward(self, simclr_loss, result, event):\n",
386 | " # 计算分类损失\n",
387 | " c_loss = self.classification_loss(result, event)\n",
388 | " total_loss = self.awl(simclr_loss, c_loss)\n",
389 | " return total_loss"
390 | ]
391 | },
392 | {
393 | "cell_type": "markdown",
394 | "id": "6ff01e6d",
395 | "metadata": {},
396 | "source": [
397 | "# Modle"
398 | ]
399 | },
400 | {
401 | "cell_type": "markdown",
402 | "id": "6afdcf95",
403 | "metadata": {},
404 | "source": [
405 | "## SincNet"
406 | ]
407 | },
408 | {
409 | "cell_type": "code",
410 | "execution_count": 7,
411 | "id": "b5764b19",
412 | "metadata": {
413 | "ExecuteTime": {
414 | "end_time": "2024-12-15T13:14:58.649704Z",
415 | "start_time": "2024-12-15T13:14:58.570946Z"
416 | },
417 | "code_folding": []
418 | },
419 | "outputs": [],
420 | "source": [
421 | "class SincConv_fast(nn.Module):\n",
422 | " @staticmethod\n",
423 | " def to_mel(hz):\n",
424 | " return 2595 * np.log10(1 + hz / 700)\n",
425 | "\n",
426 | " @staticmethod\n",
427 | " def to_hz(mel):\n",
428 | " return 700 * (10 ** (mel / 2595) - 1)\n",
429 | "\n",
430 | " def __init__(self, out_channels, kernel_size, mode, low_hz = 1, sample_rate=16000, in_channels=1,\n",
431 | " stride=1, padding=0, dilation=1, bias=False, groups=1, min_low_hz=1, min_band_hz=4):\n",
432 | " super(SincConv_fast,self).__init__()\n",
433 | " self.out_channels = out_channels\n",
434 | " self.kernel_size = kernel_size\n",
435 | " # Forcing the filters to be odd (i.e, perfectly symmetrics)\n",
436 | " if kernel_size%2==0:\n",
437 | " self.kernel_size=self.kernel_size+1\n",
438 | " self.stride = stride\n",
439 | " self.padding = padding\n",
440 | " self.dilation = dilation\n",
441 | " self.sample_rate = sample_rate\n",
442 | " self.min_low_hz = min_low_hz\n",
443 | " self.min_band_hz = min_band_hz\n",
444 | "\n",
445 | " # initialize filterbanks such that they are equally spaced in Mel scale\n",
446 | " low_hz = low_hz\n",
447 | " high_hz = self.sample_rate / 2 - (self.min_low_hz + self.min_band_hz)\n",
448 | "\n",
449 | " if mode =='eeg':\n",
450 | " hz = np.linspace(low_hz, high_hz, self.out_channels + 1)\n",
451 | " \n",
452 | " if mode =='audio':\n",
453 | " mel = np.linspace(self.to_mel(low_hz),\n",
454 | " self.to_mel(high_hz),\n",
455 | " self.out_channels + 1)\n",
456 | " hz = self.to_hz(mel)\n",
457 | "\n",
458 | " # filter lower frequency (out_channels, 1)\n",
459 | " self.low_hz_ = nn.Parameter(torch.Tensor(hz[:-1]).view(-1, 1))\n",
460 | "\n",
461 | " # filter frequency band (out_channels, 1)\n",
462 | " self.band_hz_ = nn.Parameter(torch.Tensor(np.diff(hz)).view(-1, 1))\n",
463 | "\n",
464 | " # Hamming window\n",
465 | " # computing only half of the window\n",
466 | " n_lin=torch.linspace(0, (self.kernel_size/2)-1, steps=int((self.kernel_size/2))) \n",
467 | " self.window_=0.54-0.46*torch.cos(2*math.pi*n_lin/self.kernel_size);\n",
468 | "\n",
469 | " # (1, kernel_size/2)\n",
470 | " n = (self.kernel_size - 1) / 2.0\n",
471 | " # Due to symmetry, I only need half of the time axes\n",
472 | " self.n_ = 2*math.pi*torch.arange(-n, 0).view(1, -1) / self.sample_rate \n",
473 | "\n",
474 | " def forward(self, waveforms):\n",
475 | " self.n_ = self.n_.to(waveforms.device)\n",
476 | " self.window_ = self.window_.to(waveforms.device)\n",
477 | " low = self.min_low_hz + torch.abs(self.low_hz_)\n",
478 | " high = torch.clamp(low + self.min_band_hz + torch.abs(self.band_hz_),self.min_low_hz,self.sample_rate/2)\n",
479 | " band=(high-low)[:,0]\n",
480 | " \n",
481 | " f_times_t_low = torch.matmul(low, self.n_)\n",
482 | " f_times_t_high = torch.matmul(high, self.n_)\n",
483 | "\n",
484 | " # Equivalent of Eq.4 of the reference paper (SPEAKER RECOGNITION FROM RAW WAVEFORM WITH SINCNET). \n",
485 | " # I just have expanded the sinc and simplified the terms. This way I avoid several useless computations. \n",
486 | " band_pass_left=((torch.sin(f_times_t_high)-torch.sin(f_times_t_low))/(self.n_/2))*self.window_ \n",
487 | " band_pass_center = 2*band.view(-1,1)\n",
488 | " band_pass_right= torch.flip(band_pass_left,dims=[1])\n",
489 | " band_pass=torch.cat([band_pass_left,band_pass_center,band_pass_right],dim=1)\n",
490 | " band_pass = band_pass / (2*band[:,None])\n",
491 | "\n",
492 | " self.filters = (band_pass).view(\n",
493 | " self.out_channels, 1, self.kernel_size)\n",
494 | "\n",
495 | " return F.conv1d(waveforms, self.filters, stride=self.stride,\n",
496 | " padding=self.kernel_size // 2, dilation=self.dilation,\n",
497 | " bias=None, groups=1) "
498 | ]
499 | },
500 | {
501 | "cell_type": "markdown",
502 | "id": "53641ab3",
503 | "metadata": {},
504 | "source": [
505 | "## EEGEncoder"
506 | ]
507 | },
508 | {
509 | "cell_type": "code",
510 | "execution_count": 8,
511 | "id": "9a557a08",
512 | "metadata": {
513 | "ExecuteTime": {
514 | "end_time": "2024-12-15T13:14:58.724514Z",
515 | "start_time": "2024-12-15T13:14:58.653477Z"
516 | }
517 | },
518 | "outputs": [],
519 | "source": [
520 | "class DepthConv1d(nn.Module):\n",
521 | " def __init__(self, input_channel=1, hidden_channel=2,output_channel = 1, kernel=3, padding=1, dilation=1):\n",
522 | " super(DepthConv1d, self).__init__()\n",
523 | "\n",
524 | " self.conv1d = nn.Conv1d(input_channel, hidden_channel, 1)\n",
525 | " self.padding = padding\n",
526 | " self.dconv1d = nn.Conv1d(hidden_channel, hidden_channel, kernel, dilation=dilation,\n",
527 | " groups=hidden_channel,\n",
528 | " padding=self.padding)\n",
529 | "\n",
530 | " self.nonlinearity1 = nn.PReLU()\n",
531 | " self.nonlinearity2 = nn.PReLU()\n",
532 | "\n",
533 | " self.reg1 = nn.GroupNorm(1, hidden_channel, eps=1e-08)\n",
534 | " self.reg2 = nn.GroupNorm(1, hidden_channel, eps=1e-08)\n",
535 | " self.skip_out = nn.Conv1d(hidden_channel, output_channel, 1)\n",
536 | "\n",
537 | " def forward(self, input):\n",
538 | " output = self.reg1(self.nonlinearity1(self.conv1d(input)))\n",
539 | " output = self.reg2(self.nonlinearity2(self.dconv1d(output)))\n",
540 | " skip = self.skip_out(output)\n",
541 | " return skip"
542 | ]
543 | },
544 | {
545 | "cell_type": "code",
546 | "execution_count": 9,
547 | "id": "9e69b370",
548 | "metadata": {
549 | "ExecuteTime": {
550 | "end_time": "2024-12-15T13:14:58.802605Z",
551 | "start_time": "2024-12-15T13:14:58.726275Z"
552 | }
553 | },
554 | "outputs": [],
555 | "source": [
556 | "class EEGEncoder(nn.Module):\n",
557 | " def __init__(self, input_channel=64,hidden_channel = 8,output_channel = 1, sample_rate=128):\n",
558 | " super(EEGEncoder, self).__init__()\n",
559 | "\n",
560 | " self.sinc_conv = SincConv_fast(out_channels=hidden_channel,mode ='eeg', low_hz = 1, kernel_size=31,\n",
561 | " sample_rate=sample_rate,min_low_hz=1, min_band_hz=4)\n",
562 | " \n",
563 | " self.depth_conv = DepthConv1d(input_channel=input_channel,output_channel = output_channel,\n",
564 | " hidden_channel=32, kernel=3, padding=1, dilation=1)\n",
565 | "\n",
566 | " self.fc = nn.Sequential(\n",
567 | " nn.Linear(hidden_channel*sample_rate, 256) # 根据最终特征图大小调整\n",
568 | " )\n",
569 | " self.hidden_channel = hidden_channel\n",
570 | " self.sample_rate = sample_rate\n",
571 | " \n",
572 | " def forward(self, x):\n",
573 | " batch_size, input_channel, num_samples = x.size()\n",
574 | "\n",
575 | " # Apply SincConv to each channel independently\n",
576 | " sinc_out = []\n",
577 | " for i in range(input_channel):\n",
578 | " channel_data = x[:, i:i+1, :] # Select single channel\n",
579 | " sinc_out.append(self.sinc_conv(channel_data))\n",
580 | "\n",
581 | " sinc_out = torch.stack(sinc_out, dim=1) # Shape: [batch_size, input_channel, out_channels, output_length]\n",
582 | " sinc_out = sinc_out.view(batch_size, 64, self.hidden_channel*self.sample_rate) # Reshape to [batch_size, 1, out_channels, length]\n",
583 | " out = self.depth_conv(sinc_out)\n",
584 | " out_fc = self.fc(out).squeeze()\n",
585 | " return out_fc# sinc_out, "
586 | ]
587 | },
588 | {
589 | "cell_type": "code",
590 | "execution_count": 10,
591 | "id": "6adb4f86",
592 | "metadata": {
593 | "ExecuteTime": {
594 | "end_time": "2024-12-15T13:14:58.878664Z",
595 | "start_time": "2024-12-15T13:14:58.804708Z"
596 | }
597 | },
598 | "outputs": [],
599 | "source": [
600 | "# # example of use EEGEncoder\n",
601 | "# eeg_net = EEGEncoder(input_channel=64,hidden_channel = 60) # 假设有2个类别\n",
602 | "# input_data = torch.randn(10, 64, 128) # 模拟输入数据\n",
603 | "# output = eeg_net(input_data)\n",
604 | "# print(\"Output shape:\", output.shape)\n",
605 | "# print_size(eeg_net)"
606 | ]
607 | },
608 | {
609 | "cell_type": "markdown",
610 | "id": "0da7049e",
611 | "metadata": {},
612 | "source": [
613 | "## AudioEncoder"
614 | ]
615 | },
616 | {
617 | "cell_type": "code",
618 | "execution_count": 11,
619 | "id": "9d52e680",
620 | "metadata": {
621 | "ExecuteTime": {
622 | "end_time": "2024-12-15T13:14:58.946064Z",
623 | "start_time": "2024-12-15T13:14:58.880503Z"
624 | }
625 | },
626 | "outputs": [],
627 | "source": [
628 | "class AudioEncoder(nn.Module):\n",
629 | " def __init__(self, input_channel=1,out_channels=160,low_hz=30, sample_rate=16000):\n",
630 | " super(AudioEncoder, self).__init__()\n",
631 | " self.sinc_conv = SincConv_fast(out_channels=out_channels,mode ='eeg',low_hz = low_hz, kernel_size=101,\n",
632 | " sample_rate=sample_rate,min_low_hz=50, min_band_hz=50)\n",
633 | "\n",
634 | " self.depth_conv = DepthConv1d(input_channel=out_channels,output_channel = input_channel,\n",
635 | " hidden_channel=32, kernel=3, padding=1, dilation=1)\n",
636 | " \n",
637 | " # Use fewer convolutional layers with larger strides to reduce dimensionality\n",
638 | " self.conv = nn.Sequential(\n",
639 | " nn.Conv1d(1, 64, kernel_size=3, stride=4, padding=1), # torch.Size([10, 64, 4000])\n",
640 | " nn.PReLU(),\n",
641 | " nn.Conv1d(64, 128, kernel_size=3, stride=4, padding=1), # torch.Size([10, 128, 1000])\n",
642 | " nn.PReLU(),\n",
643 | " nn.Conv1d(128, 256, kernel_size=3, stride=4, padding=1), # torch.Size([10, 256, 500])\n",
644 | " nn.PReLU(),\n",
645 | " nn.AdaptiveAvgPool1d(1) # Global average pooling torch.Size([10, 256])\n",
646 | " )\n",
647 | "\n",
648 | " def forward(self, input):\n",
649 | "# print(\"AudioEncoder input shape:\", input.shape) \n",
650 | " sinc_out = self.sinc_conv(input)\n",
651 | " out = self.depth_conv(sinc_out)\n",
652 | " out = self.conv(out).squeeze(-1) # Squeeze last dimension to get shape [batch_size, 256]\n",
653 | " return out"
654 | ]
655 | },
656 | {
657 | "cell_type": "code",
658 | "execution_count": 12,
659 | "id": "a5c35d64",
660 | "metadata": {
661 | "ExecuteTime": {
662 | "end_time": "2024-12-15T13:14:59.035940Z",
663 | "start_time": "2024-12-15T13:14:58.947718Z"
664 | }
665 | },
666 | "outputs": [],
667 | "source": [
668 | "# # example of use AudioEncoder\n",
669 | "# batch_size = 10\n",
670 | "# input_length = 16000 # 一秒钟的音频数据长度\n",
671 | "# input_channel = 1\n",
672 | "\n",
673 | "# input_data = torch.randn(batch_size, input_channel, input_length)\n",
674 | "# Audiomodel = AudioEncoder(input_channel=input_channel, out_channels=160, sample_rate=16000)\n",
675 | "# output = Audiomodel(input_data)\n",
676 | "\n",
677 | "# print(output.shape) # torch.Size([10, 256])\n",
678 | "# print_size(Audiomodel)"
679 | ]
680 | },
681 | {
682 | "cell_type": "markdown",
683 | "id": "52882c7c",
684 | "metadata": {},
685 | "source": [
686 | "## Projector"
687 | ]
688 | },
689 | {
690 | "cell_type": "code",
691 | "execution_count": 13,
692 | "id": "fd6fbfa8",
693 | "metadata": {
694 | "ExecuteTime": {
695 | "end_time": "2024-12-15T13:14:59.106724Z",
696 | "start_time": "2024-12-15T13:14:59.037643Z"
697 | }
698 | },
699 | "outputs": [],
700 | "source": [
701 | "class Projector(nn.Module):\n",
702 | " def __init__(\n",
703 | " self,\n",
704 | " embedding_dim=Config.Embedding_dim,\n",
705 | " projection_dim=Config.Projector_dim,\n",
706 | " dropout=Config.dropout\n",
707 | " ):\n",
708 | " super().__init__()\n",
709 | " self.projection = nn.Linear(embedding_dim, projection_dim)\n",
710 | " self.gelu = nn.GELU()\n",
711 | " self.fc = nn.Linear(projection_dim, projection_dim)\n",
712 | " self.dropout = nn.Dropout(dropout)\n",
713 | " self.layer_norm = nn.LayerNorm(projection_dim)\n",
714 | " \n",
715 | " def forward(self, x):\n",
716 | " projected = self.projection(x)\n",
717 | " x = self.gelu(projected)\n",
718 | " x = self.fc(x)\n",
719 | " x = self.dropout(x)\n",
720 | " x = x + projected\n",
721 | " x = self.layer_norm(x)\n",
722 | " # (B,128)\n",
723 | " return x"
724 | ]
725 | },
726 | {
727 | "cell_type": "markdown",
728 | "id": "518dfe05",
729 | "metadata": {},
730 | "source": [
731 | "## Contrastive Learning"
732 | ]
733 | },
734 | {
735 | "cell_type": "code",
736 | "execution_count": 14,
737 | "id": "7e2295c6",
738 | "metadata": {
739 | "ExecuteTime": {
740 | "end_time": "2024-12-15T13:14:59.202390Z",
741 | "start_time": "2024-12-15T13:14:59.108534Z"
742 | }
743 | },
744 | "outputs": [],
745 | "source": [
746 | "def cross_entropy(preds, targets, reduction='none'):\n",
747 | " log_softmax = nn.LogSoftmax(dim=-1)\n",
748 | " loss = (-targets * log_softmax(preds)).sum(1)\n",
749 | " if reduction == \"none\":\n",
750 | " return loss\n",
751 | " elif reduction == \"mean\":\n",
752 | " return loss.mean()\n",
753 | " \n",
754 | "class CLIPModel(nn.Module):\n",
755 | " def __init__(\n",
756 | " self,\n",
757 | " temperature=Config.Temperature,\n",
758 | " EEG_Embedding=Config.Embedding_dim,\n",
759 | " Audio_Embedding=Config.Embedding_dim,\n",
760 | " ):\n",
761 | " super().__init__()\n",
762 | "\n",
763 | " self.eeg_encoder = EEGEncoder(input_channel=64,hidden_channel = 60)\n",
764 | " self.audio_encoder = AudioEncoder(out_channels=320,low_hz=100)\n",
765 | " self.eeg_projector = Projector(EEG_Embedding)\n",
766 | " self.audio_projector = Projector(Audio_Embedding)\n",
767 | " self.temperature = temperature\n",
768 | "\n",
769 | " def forward(self, eeg, clean, wavA, wavB):\n",
770 | " # 特征提取\n",
771 | " EEG_features = self.eeg_encoder(eeg)\n",
772 | " Audio_features = self.audio_encoder(clean)\n",
773 | " wavA_features = self.audio_encoder(wavA)\n",
774 | " wavB_features = self.audio_encoder(wavB)\n",
775 | "\n",
776 | " # 对比学习编码\n",
777 | " EEG_embeddings = self.eeg_projector(EEG_features)\n",
778 | " Audio_embeddings = self.audio_projector(Audio_features)\n",
779 | " \n",
780 | " # 对比学习loss\n",
781 | " logits = (Audio_embeddings @ EEG_embeddings.T) / self.temperature\n",
782 | " EEG_similarity = EEG_embeddings @ EEG_embeddings.T\n",
783 | " Audio_similarity = Audio_embeddings @ Audio_embeddings.T\n",
784 | " targets = F.softmax(\n",
785 | " (EEG_similarity + Audio_similarity) / 2 * self.temperature, dim=-1\n",
786 | " )\n",
787 | " audio_loss = cross_entropy(logits, targets, reduction='none')\n",
788 | " eeg_loss = cross_entropy(logits.T, targets.T, reduction='none')\n",
789 | " loss = (eeg_loss + audio_loss) / 2.0 # shape: (batch_size)\n",
790 | " \n",
791 | " #相似度计算\n",
792 | " similarity_1 = self.calculate_similarity(EEG_features, wavA_features)\n",
793 | " similarity_2 = self.calculate_similarity(EEG_features, wavB_features)\n",
794 | " sim = torch.stack([similarity_1, similarity_2], dim=1)\n",
795 | " \n",
796 | " return loss.mean(), sim\n",
797 | "\n",
798 | " def calculate_similarity(self, features1, features2):\n",
799 | " similarity = F.cosine_similarity(features1, features2, dim=-1)\n",
800 | "# similarity = -torch.norm(features1 - features2, p=2, dim=-1)\n",
801 | " return similarity"
802 | ]
803 | },
804 | {
805 | "cell_type": "markdown",
806 | "id": "bdae01a2",
807 | "metadata": {},
808 | "source": [
809 | "# Dataloader"
810 | ]
811 | },
812 | {
813 | "cell_type": "markdown",
814 | "id": "d2c8abd4",
815 | "metadata": {},
816 | "source": [
817 | "## Randsplit"
818 | ]
819 | },
820 | {
821 | "cell_type": "code",
822 | "execution_count": 15,
823 | "id": "0d119458",
824 | "metadata": {
825 | "ExecuteTime": {
826 | "end_time": "2024-12-15T13:14:59.296936Z",
827 | "start_time": "2024-12-15T13:14:59.204097Z"
828 | }
829 | },
830 | "outputs": [],
831 | "source": [
832 | "def collate_fn(item):\n",
833 | " eeg, lfcc_clean, lfcc_wavA, lfcc_wavB, event = zip(*item)\n",
834 | " return torch.stack(eeg), torch.stack(lfcc_clean), torch.stack(lfcc_wavA), torch.stack(lfcc_wavB), torch.stack(event)\n",
835 | "\n",
836 | "def load_Dataset_shuffle(root, file_name, sample_rate, batch_size):\n",
837 | " TotalDataset = EEGDataset(root, file_name, sample_rate)\n",
838 | " total_len = len(TotalDataset)\n",
839 | " train_len = int(total_len*0.8)\n",
840 | " val_len = int(total_len*0.2)\n",
841 | " \n",
842 | " Train_dataset, Valid_dataset = random_split(TotalDataset, [train_len, val_len])\n",
843 | " \n",
844 | " kwargs = {\"batch_size\": batch_size, \"num_workers\": 4, \"pin_memory\": False, \"drop_last\": False}\n",
845 | " Train_dataloader = DataLoader(Train_dataset, collate_fn=collate_fn, shuffle=True, **kwargs)\n",
846 | " Valid_dataloader = DataLoader(Valid_dataset, collate_fn=collate_fn, shuffle=True, **kwargs)\n",
847 | " \n",
848 | " return Train_dataloader, Valid_dataloader"
849 | ]
850 | },
851 | {
852 | "cell_type": "markdown",
853 | "id": "599d3ab6",
854 | "metadata": {},
855 | "source": [
856 | "## Cross trails"
857 | ]
858 | },
859 | {
860 | "cell_type": "code",
861 | "execution_count": null,
862 | "id": "5c463c72",
863 | "metadata": {
864 | "ExecuteTime": {
865 | "end_time": "2024-12-15T13:14:59.368183Z",
866 | "start_time": "2024-12-15T13:14:59.298913Z"
867 | }
868 | },
869 | "outputs": [],
870 | "source": [
871 | "from sklearn.model_selection import KFold\n",
872 | "from torch.utils.data import Subset, DataLoader\n",
873 | "# None:默认返回全部5个fold(兼容原始功能)\n",
874 | "# 1-5:返回指定编号的单个fold\n",
875 | "\n",
876 | "def Dataset_cross_trails(config, batch_size, fold_num=None):\n",
877 | " \"\"\"\n",
878 | " 参数说明:\n",
879 | " fold_num : int or None\n",
880 | " 指定要使用的fold编号(1-5),为None时返回全部5个fold\n",
881 | " \"\"\"\n",
882 | " TotalDataset = EEGDataset(config, config.subject)\n",
883 | " total_len = len(TotalDataset)\n",
884 | " \n",
885 | " # 创建可重复的五折交叉验证分割器\n",
886 | " kf = KFold(n_splits=5, shuffle=False)#, random_state=42\n",
887 | " fold_dataloaders = []\n",
888 | " \n",
889 | " # 遍历所有分割\n",
890 | " for fold_idx, (train_indices, val_indices) in enumerate(kf.split(range(total_len))):\n",
891 | " # 如果指定了fold_num,跳过不需要的fold\n",
892 | " if fold_num is not None and (fold_idx != (fold_num-1)): # 将输入1-5转换为0-4索引\n",
893 | " continue\n",
894 | " \n",
895 | " # 创建子数据集\n",
896 | " Train_dataset = Subset(TotalDataset, train_indices)\n",
897 | " Valid_dataset = Subset(TotalDataset, val_indices)\n",
898 | " \n",
899 | " # 数据加载配置\n",
900 | " kwargs = {\n",
901 | " \"batch_size\": batch_size,\n",
902 | " \"num_workers\": 4,\n",
903 | " \"pin_memory\": False,\n",
904 | " \"drop_last\": False\n",
905 | " }\n",
906 | " \n",
907 | " # 创建DataLoader\n",
908 | " Train_dataloader = DataLoader(\n",
909 | " Train_dataset,\n",
910 | " collate_fn=collate_fn,\n",
911 | " shuffle=True, # 仅训练集需要shuffle\n",
912 | " **kwargs\n",
913 | " )\n",
914 | " Valid_dataloader = DataLoader(\n",
915 | " Valid_dataset,\n",
916 | " collate_fn=collate_fn,\n",
917 | " shuffle=False, # 验证集保持顺序\n",
918 | " **kwargs\n",
919 | " )\n",
920 | " \n",
921 | " # 根据参数决定返回格式\n",
922 | " if fold_num is not None:\n",
923 | " return (Train_dataloader, Valid_dataloader) # 直接返回单个fold\n",
924 | " else:\n",
925 | " fold_dataloaders.append((Train_dataloader, Valid_dataloader))\n",
926 | " \n",
927 | " # 处理无效fold编号\n",
928 | " if fold_num is not None and fold_num not in range(1,6):\n",
929 | " raise ValueError(\"fold_num must be between 1 and 5\")\n",
930 | " \n",
931 | " return fold_dataloaders if fold_num is None else None"
932 | ]
933 | },
934 | {
935 | "cell_type": "markdown",
936 | "id": "2fbb3737",
937 | "metadata": {},
938 | "source": [
939 | "# Pretrain"
940 | ]
941 | },
942 | {
943 | "cell_type": "markdown",
944 | "id": "96304c2b",
945 | "metadata": {},
946 | "source": [
947 | "## Train epoch"
948 | ]
949 | },
950 | {
951 | "cell_type": "code",
952 | "execution_count": 17,
953 | "id": "f839302b",
954 | "metadata": {
955 | "ExecuteTime": {
956 | "end_time": "2024-12-15T13:14:59.463801Z",
957 | "start_time": "2024-12-15T13:14:59.370158Z"
958 | }
959 | },
960 | "outputs": [],
961 | "source": [
962 | "def preTrain_epoch(model, train_loader, optimizer, lr_scheduler, step):\n",
963 | " loss_meter = AvgMeter()\n",
964 | " tqdm_object = tqdm(train_loader, total=len(train_loader))\n",
965 | " criterion = nn.CrossEntropyLoss()\n",
966 | " # print(tqdm_object)\n",
967 | " for eeg, audio, wavA, wavB, event in tqdm_object:\n",
968 | " eeg = eeg.to(Config.device)\n",
969 | " audio = audio.to(Config.device)\n",
970 | " wavA = wavA.to(Config.device)\n",
971 | " wavB = wavB.to(Config.device)\n",
972 | " event = event.to(Config.device).squeeze()\n",
973 | " loss_1, result = model(eeg, audio, wavA, wavB)\n",
974 | " loss_2 = criterion(result, event)\n",
975 | " loss = loss_1/100+loss_2\n",
976 | " optimizer.zero_grad()\n",
977 | " loss.backward()\n",
978 | " optimizer.step()\n",
979 | "\n",
980 | " count = eeg.size(0)\n",
981 | " loss_meter.update(loss.item(), count)\n",
982 | "\n",
983 | " tqdm_object.set_postfix(train_loss=loss_meter.avg, lr=get_lr(optimizer))\n",
984 | " return loss_meter\n",
985 | "\n",
986 | "def preVal_epoch(model, valid_loader):\n",
987 | " loss_meter = AvgMeter()\n",
988 | " criterion = nn.CrossEntropyLoss()\n",
989 | "\n",
990 | " tqdm_object = tqdm(valid_loader, total=len(valid_loader))\n",
991 | " for eeg, audio, wavA, wavB, event in tqdm_object:\n",
992 | " eeg = eeg.to(Config.device)\n",
993 | " audio = audio.to(Config.device)\n",
994 | " wavA = wavA.to(Config.device)\n",
995 | " wavB = wavB.to(Config.device)\n",
996 | " event = event.to(Config.device).squeeze()\n",
997 | " loss_1, result = model(eeg, audio, wavA, wavB)\n",
998 | " loss_2 = criterion(result, event)\n",
999 | " loss = loss_1/100+loss_2\n",
1000 | "\n",
1001 | " count = eeg.size(0)\n",
1002 | " loss_meter.update(loss.item(), count)\n",
1003 | "\n",
1004 | " tqdm_object.set_postfix(valid_loss=loss_meter.avg)\n",
1005 | " return loss_meter"
1006 | ]
1007 | },
1008 | {
1009 | "cell_type": "markdown",
1010 | "id": "1e5ac252",
1011 | "metadata": {},
1012 | "source": [
1013 | "## train_and_save_model"
1014 | ]
1015 | },
1016 | {
1017 | "cell_type": "code",
1018 | "execution_count": null,
1019 | "id": "cd1896ab",
1020 | "metadata": {
1021 | "ExecuteTime": {
1022 | "end_time": "2024-12-15T13:14:59.559511Z",
1023 | "start_time": "2024-12-15T13:14:59.465918Z"
1024 | }
1025 | },
1026 | "outputs": [],
1027 | "source": [
1028 | "def train_and_save_model(config, fold_num):\n",
1029 | " \"\"\"\n",
1030 | " 训练并保存模型,为每个被试的每个fold单独保存模型文件\n",
1031 | " \n",
1032 | " :param config: 当前被试的配置对象实例\n",
1033 | " :param fold_num: 当前fold编号 (1-8)\n",
1034 | " :return: (文件夹名, 准确率)\n",
1035 | " \"\"\"\n",
1036 | " # 数据加载\n",
1037 | " train_dataloader, valid_dataloader = Dataset_cross_trails(config, batch_size=config.batch_size,fold_num=fold_num)\n",
1038 | " \n",
1039 | " # 创建保存目录 - 包含被试编号和fold编号\n",
1040 | " save_dir = \"Models_channel6\"\n",
1041 | " sub_dir = f\"sub{config.subject}_fold{fold_num}\"\n",
1042 | " final_save_dir = os.path.join(save_dir, sub_dir)\n",
1043 | " os.makedirs(final_save_dir, exist_ok=True)\n",
1044 | " \n",
1045 | " # 初始化模型\n",
1046 | " model = CLIPModel().to(config.device)\n",
1047 | "\n",
1048 | " # 定义优化器和学习率调度器\n",
1049 | " optimizer = torch.optim.AdamW(\n",
1050 | " [{\"params\": model.parameters(), \"lr\": config.EEG_encoder_lr}],\n",
1051 | " weight_decay=config.weight_decay\n",
1052 | " )\n",
1053 | " lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(\n",
1054 | " optimizer, mode=\"min\", patience=config.patience, factor=config.factor\n",
1055 | " )\n",
1056 | "\n",
1057 | " best_acc = 0\n",
1058 | " best_epoch = 0\n",
1059 | "\n",
1060 | " # 训练循环\n",
1061 | " for epoch in range(config.epochs):\n",
1062 | " print(f\"Epoch: {epoch + 1}\")\n",
1063 | " model.train()\n",
1064 | " train_loss = preTrain_epoch(model, train_dataloader, optimizer, lr_scheduler, \"epoch\")\n",
1065 | " \n",
1066 | " model.eval()\n",
1067 | " with torch.no_grad():\n",
1068 | " train_acc = pre_evaluate(train_dataloader, model)\n",
1069 | " print(f\"train accuracy: {train_acc:.6f}\")\n",
1070 | " valid_loss = preVal_epoch(model, valid_dataloader)\n",
1071 | " val_acc = pre_evaluate(valid_dataloader, model)\n",
1072 | " print(f\"valid accuracy: {val_acc:.6f}\")\n",
1073 | "\n",
1074 | "# # 保存当前epoch的模型\n",
1075 | "# epoch_model_path = os.path.join(final_save_dir, f\"epoch_{epoch+1}_acc_{val_acc:.4f}.pt\")\n",
1076 | "# torch.save(model.state_dict(), epoch_model_path)\n",
1077 | "# print(f\"Saved model for epoch {epoch+1}: {epoch_model_path}\")\n",
1078 | "\n",
1079 | " # 检查是否为最佳模型\n",
1080 | " if val_acc > best_acc:\n",
1081 | " best_acc = val_acc\n",
1082 | " best_epoch = epoch + 1\n",
1083 | " # 保存最佳模型\n",
1084 | " best_model_path = os.path.join(final_save_dir, f\"best_acc_{best_acc:.4f}.pt\")\n",
1085 | " torch.save(model.state_dict(), best_model_path)\n",
1086 | " print(f\"Saved Best Model: {best_model_path}!\",best_acc)\n",
1087 | "\n",
1088 | " lr_scheduler.step(valid_loss.avg)\n",
1089 | " \n",
1090 | " # 打印最终结果\n",
1091 | " print(f\"Final accuracy max for subject {config.subject}, fold {fold_num}: {best_acc:.4f} (epoch {best_epoch})\")\n",
1092 | " \n",
1093 | " # 返回最高准确率和文件夹名字\n",
1094 | " return sub_dir, best_acc"
1095 | ]
1096 | },
1097 | {
1098 | "cell_type": "markdown",
1099 | "id": "40349e85",
1100 | "metadata": {},
1101 | "source": [
1102 | "## 选择部分被试"
1103 | ]
1104 | },
1105 | {
1106 | "cell_type": "code",
1107 | "execution_count": null,
1108 | "id": "e1b231c0",
1109 | "metadata": {
1110 | "ExecuteTime": {
1111 | "end_time": "2024-12-15T13:14:59.943185Z",
1112 | "start_time": "2024-12-15T13:14:59.655220Z"
1113 | }
1114 | },
1115 | "outputs": [],
1116 | "source": [
1117 | "def run_subject_arrange(config, subject_list):\n",
1118 | " \"\"\"处理指定被试列表的数据\"\"\"\n",
1119 | " results = {}\n",
1120 | " \n",
1121 | " for subject_num in subject_list:\n",
1122 | " # 创建被试专用配置\n",
1123 | " current_config = Config(subject=str(subject_num))\n",
1124 | " current_config.root = config.root\n",
1125 | " current_config.file_name = f\"sub{subject_num}.npz\"\n",
1126 | " current_config.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
1127 | " \n",
1128 | " file_path = os.path.join(current_config.root, current_config.file_name)\n",
1129 | " \n",
1130 | " # 检查文件是否存在\n",
1131 | " if not os.path.exists(file_path):\n",
1132 | " print(f\"⚠️ 警告: 文件 {file_path} 不存在,跳过被试 {subject_num}\")\n",
1133 | " continue\n",
1134 | " \n",
1135 | " print(f\"\\n🚀 开始处理被试 {subject_num} ({current_config.file_name})\")\n",
1136 | " log_file = f\"subject_{subject_num}_results_666.txt\"\n",
1137 | " max_acc = 0\n",
1138 | " \n",
1139 | " # 处理8折交叉验证\n",
1140 | " for fold_num in range(1, 9):\n",
1141 | " print(f\" 🔄 处理第 {fold_num}/8 折...\")\n",
1142 | "\n",
1143 | " # 训练模型\n",
1144 | " folder_name, acc = train_and_save_model(current_config, fold_num)\n",
1145 | "\n",
1146 | " # 记录结果\n",
1147 | " with open(log_file, 'a') as f:\n",
1148 | " f.write(f\"Fold {fold_num}, Accuracy: {acc:.4f}, Model: {folder_name}\\n\")\n",
1149 | "\n",
1150 | " # 更新最高准确率\n",
1151 | " if acc > max_acc:\n",
1152 | " max_acc = acc\n",
1153 | " print(f\" ✅ 当前最高准确率: {max_acc:.4f}\")\n",
1154 | " \n",
1155 | " # 保存结果\n",
1156 | " results[subject_num] = max_acc\n",
1157 | " print(f\"\\n🎉 被试 {subject_num} 处理完成! 最高准确率: {max_acc:.4f}\")\n",
1158 | " \n",
1159 | " # 打印最终结果\n",
1160 | " print(\"\\n\" + \"=\" * 60)\n",
1161 | " print(\"所有被试处理完成! 最终结果:\")\n",
1162 | " print(\"=\" * 60)\n",
1163 | " for subject, acc in results.items():\n",
1164 | " print(f\"被试 {subject}: 最高准确率 = {acc:.4f}\")\n",
1165 | " print(\"=\" * 60)\n",
1166 | " \n",
1167 | " return results"
1168 | ]
1169 | },
1170 | {
1171 | "cell_type": "code",
1172 | "execution_count": null,
1173 | "id": "4076d114",
1174 | "metadata": {},
1175 | "outputs": [],
1176 | "source": [
1177 | "# 主配置\n",
1178 | "main_config = Config()\n",
1179 | "\n",
1180 | "# 指定要处理的被试列表\n",
1181 | "subjects_to_process = [1, 2, 4, 7, 8, 9, 10, 11, 12, 13, 15, 16]\n",
1182 | "\n",
1183 | "# 运行处理\n",
1184 | "results = run_subject_arrange(main_config, subjects_to_process)\n",
1185 | "\n",
1186 | "# 打印结果\n",
1187 | "for subject, acc in results.items():\n",
1188 | " print(f\"被试 {subject}: 最高准确率 = {acc:.4f}\")"
1189 | ]
1190 | },
1191 | {
1192 | "attachments": {},
1193 | "cell_type": "markdown",
1194 | "id": "164df06a",
1195 | "metadata": {},
1196 | "source": [
1197 | "## Interpretability"
1198 | ]
1199 | },
1200 | {
1201 | "cell_type": "markdown",
1202 | "id": "ae410600",
1203 | "metadata": {},
1204 | "source": [
1205 | "### plot_frequency_response"
1206 | ]
1207 | },
1208 | {
1209 | "cell_type": "code",
1210 | "execution_count": 22,
1211 | "id": "231932fb",
1212 | "metadata": {
1213 | "ExecuteTime": {
1214 | "end_time": "2024-12-15T16:07:48.996398Z",
1215 | "start_time": "2024-12-15T16:07:48.988286Z"
1216 | }
1217 | },
1218 | "outputs": [],
1219 | "source": [
1220 | "import torch\n",
1221 | "import numpy as np\n",
1222 | "import matplotlib.pyplot as plt\n",
1223 | "\n",
1224 | "def plot_frequency_response(sinc_conv, sample_rate=16000):\n",
1225 | " \"\"\"\n",
1226 | " Plot the normalized cumulative frequency response curve.\n",
1227 | " \n",
1228 | " Parameters:\n",
1229 | " - sinc_conv: SincConv_fast layer object.\n",
1230 | " - sample_rate: Sampling rate, default is 16000 Hz.\n",
1231 | " \n",
1232 | " Returns:\n",
1233 | " - Plots the normalized cumulative frequency response curve.\n",
1234 | " \"\"\"\n",
1235 | " # Get the filter length (kernel_size)\n",
1236 | " kernel_size = sinc_conv.kernel_size\n",
1237 | " print(kernel_size)\n",
1238 | " N = kernel_size # Set N to kernel_size, which is the filter length\n",
1239 | " \n",
1240 | " # Get parameters of the SincConv_fast layer\n",
1241 | " sinc_conv_params = sinc_conv.state_dict()\n",
1242 | " low_hz = sinc_conv_params['low_hz_']\n",
1243 | " band_hz = sinc_conv_params['band_hz_']\n",
1244 | " \n",
1245 | " # Calculate the frequency axis\n",
1246 | " freqs = np.fft.rfftfreq(N, d=1/sample_rate)\n",
1247 | " \n",
1248 | " # Store all normalized filter frequency responses\n",
1249 | " normalized_responses = []\n",
1250 | " \n",
1251 | " # Calculate and normalize the frequency response for each filter\n",
1252 | " for i in range(low_hz.shape[0]):\n",
1253 | " low = low_hz[i].item()\n",
1254 | " band = band_hz[i].item()\n",
1255 | " high = low + band\n",
1256 | " \n",
1257 | " # Calculate the sinc filter\n",
1258 | " t = torch.arange(-(N-1)/2, (N-1)/2 + 1).float()\n",
1259 | " sinc_filter = torch.sin(2 * np.pi * high * t / sample_rate) - torch.sin(2 * np.pi * low * t / sample_rate)\n",
1260 | " sinc_filter /= (t + 1e-8) # Avoid division by zero\n",
1261 | " sinc_filter *= 0.54 - 0.46 * torch.cos(2 * np.pi * torch.arange(N).float() / N) # Hamming window\n",
1262 | " sinc_filter /= torch.norm(sinc_filter) # Normalize filter weights\n",
1263 | " \n",
1264 | " # Calculate the frequency response\n",
1265 | " freq_response = np.abs(np.fft.rfft(sinc_filter.numpy(), n=N))\n",
1266 | "\n",
1267 | " # Store the normalized frequency response\n",
1268 | " normalized_responses.append(freq_response)\n",
1269 | " \n",
1270 | " # Compute the average of all normalized frequency responses\n",
1271 | " avg_freq_response = np.mean(normalized_responses, axis=0)\n",
1272 | " print(avg_freq_response.shape)\n",
1273 | " \n",
1274 | "# # Final normalization\n",
1275 | "# avg_freq_response /= np.max(avg_freq_response)\n",
1276 | " \n",
1277 | " # Plot the frequency response curve\n",
1278 | " plt.figure(figsize=(10, 6))\n",
1279 | " plt.plot(freqs, avg_freq_response)\n",
1280 | " plt.title('Normalized Cumulative Frequency Response')\n",
1281 | " plt.xlabel('Frequency (Hz)')\n",
1282 | " plt.ylabel('Normalized Amplitude')\n",
1283 | " plt.grid(True)\n",
1284 | " plt.show()\n",
1285 | " \n",
1286 | " return freqs, avg_freq_response\n",
1287 | "\n",
1288 | "# Example usage\n",
1289 | "# sinc_conv = model.eeg_encoder.sinc_conv # Get the SincConv_fast layer object\n",
1290 | "# plot_frequency_response(sinc_conv, sample_rate=16000)\n"
1291 | ]
1292 | },
1293 | {
1294 | "cell_type": "markdown",
1295 | "id": "fbe03061",
1296 | "metadata": {},
1297 | "source": [
1298 | "### EEG interpretability"
1299 | ]
1300 | },
1301 | {
1302 | "cell_type": "code",
1303 | "execution_count": 23,
1304 | "id": "b8497165",
1305 | "metadata": {
1306 | "ExecuteTime": {
1307 | "end_time": "2024-12-15T16:07:49.098247Z",
1308 | "start_time": "2024-12-15T16:07:49.002203Z"
1309 | }
1310 | },
1311 | "outputs": [],
1312 | "source": [
1313 | "# before Training"
1314 | ]
1315 | },
1316 | {
1317 | "cell_type": "code",
1318 | "execution_count": 24,
1319 | "id": "c9ccb36b",
1320 | "metadata": {
1321 | "ExecuteTime": {
1322 | "end_time": "2024-12-15T16:07:49.404303Z",
1323 | "start_time": "2024-12-15T16:07:49.099763Z"
1324 | }
1325 | },
1326 | "outputs": [
1327 | {
1328 | "name": "stdout",
1329 | "output_type": "stream",
1330 | "text": [
1331 | "31\n",
1332 | "(16,)\n"
1333 | ]
1334 | },
1335 | {
1336 | "data": {
1337 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAAIhCAYAAACizkCYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9eUlEQVR4nO3dd3hUZd7G8XtmMumFEkhCCz30YlApKjbA3hbFRsddRVeQVZTVVbEsKyqgrqCuAiqK+Iq4a4WoSBEVQUCkdxBSCC2NJJOZ8/4RZsyQAJkwyUkm3891zUXmtPzOPAPMPc9znmMxDMMQAAAAAOCsWM0uAAAAAAACAeEKAAAAAPyAcAUAAAAAfkC4AgAAAAA/IFwBAAAAgB8QrgAAAADADwhXAAAAAOAHhCsAAAAA8APCFQAAAAD4AeEKwFmZPXu2LBaLQkNDtWfPnlLrL774YnXq1MmEyvxj2LBhat68udey5s2ba9iwYVVax+7du2WxWDR79uxybb9z507dd999atu2rcLCwhQeHq6OHTvqscce0/79+yu32LPkfk/t3r3b531XrFihJ598UkePHi217uKLL9bFF1981vX5atiwYbJYLGU+PvvssyqvJ5Cd/FoHBwerVatWevDBB5WVlWV2eQBqgSCzCwAQGAoKCvTYY4/p3XffNbuUSrdgwQJFR0ebXcYpffbZZ7r11lsVGxur++67T927d5fFYtH69es1c+ZMff7551qzZo3ZZVaKFStWaOLEiRo2bJjq1KnjtW769OnmFCUpLCxM3377banl7dq1M6GawFbytT569Kg++ugjvfjii/r111+1aNEik6sDEOgIVwD84oorrtD777+vBx98UF27dq2033P8+HGFhYVV2vHLo3v37qb+/tPZtWuXbr31VrVt21aLFy9WTEyMZ92ll16q+++/XwsWLDCxQvN06NDBtN9ttVrVs2fPcm+fl5en8PDwSqwocJ38Wl9xxRXauXOnUlJStGvXLrVo0cLE6gAEOoYFAvCL8ePHq379+nr44YfPuG1+fr4mTJigFi1aKDg4WI0bN9a9995baihX8+bNdc011+jjjz9W9+7dFRoaqokTJ+q7776TxWLR+++/r4cfflgJCQmKjIzUtddeq/T0dGVnZ+vPf/6zYmNjFRsbq+HDhysnJ8fr2K+++qouuugiNWzYUBEREercubMmT54sh8NxxvpPHhZ48cUXn3LYV8lhfGlpafrLX/6iJk2aKDg4WC1atNDEiRNVVFTkdfwDBw7olltuUVRUlGJiYjRo0CClpaWdsS5JmjJlinJzczV9+nSvYOVmsVh00003nfJcSp5TySF0Z/uan25Yo8Vi0ZNPPnna80pJSdH111+vJk2aKDQ0VK1bt9Zf/vIXZWZmerZ58skn9dBDD0mSWrRo4WmD7777rtQ5ORwONWzYUIMHDy71u44ePaqwsDCNGzfOsywrK0sPPvig13t27Nixys3NPW3d5fHkk0/KYrHol19+0cCBA1W3bl21atVKkmQYhqZPn65u3bopLCxMdevW1cCBA7Vz506vYxiGocmTJysxMVGhoaE655xz9OWXX5Zqx1MNuXS3r/u1cvv666912WWXKTo6WuHh4erTp4+++eabMuvfsGGDbrvtNsXExCguLk4jRozQsWPHvLZ1uVx65ZVXPOdTp04d9ezZU//73/8kSSNHjlS9evWUl5dX6nW69NJL1bFjR19eWo8ePXpIktLT072Wz5s3T7169VJERIQiIyM1YMCAUr26O3fu1K233qpGjRopJCREcXFxuuyyy7R27VrPNu5/qxYsWKAuXbooNDRULVu21Msvv1yqlr179+rOO+9Uw4YNFRISovbt2+vFF1+Uy+XybOP++/LCCy9oypQpatGihSIjI9WrVy/9+OOPPtdX3nMFcPbouQLgF1FRUXrsscc0ZswYffvtt7r00kvL3M4wDN1www365ptvNGHCBF144YX69ddf9cQTT+iHH37QDz/8oJCQEM/2v/zyizZt2qTHHntMLVq0UEREhOcD7d///nddcsklmj17tnbv3q0HH3xQt912m4KCgtS1a1fNnTtXa9as0d///ndFRUV5fdDZsWOHbr/9ds+H5XXr1unZZ5/V5s2bNXPmTJ/Offr06aWu5/jHP/6hxYsXKykpSVJxsDrvvPNktVr1+OOPq1WrVvrhhx/0zDPPaPfu3Zo1a5ak4p65yy+/XAcOHNCkSZPUtm1bff755xo0aFC5alm0aJHi4uJ86iXxxdm85mdjx44d6tWrl0aNGqWYmBjt3r1bU6ZM0QUXXKD169fLbrdr1KhROnz4sF555RV9/PHHSkhIkFR2j5Xdbtedd96p1157Ta+++qrXMM+5c+cqPz9fw4cPl1Tci9S3b1/9/vvv+vvf/64uXbpow4YNevzxx7V+/Xp9/fXXslgsZzyHk0O0xWKRzWbzPL/pppt066236u677/a8x//yl79o9uzZuv/++/Xcc8/p8OHDeuqpp9S7d2+tW7dOcXFxkqSJEydq4sSJGjlypAYOHKh9+/bprrvuktPp9LwHfTVnzhwNGTJE119/vd5++23Z7Xa9/vrrGjBggBYuXKjLLrvMa/s//elPGjRokEaOHKn169drwoQJkuT192nYsGGaM2eORo4cqaeeekrBwcH65ZdfPGFvzJgxmjlzpt5//32NGjXKs9/GjRu1ePFivfrqqxU6l127dikoKEgtW7b0LPvnP/+pxx57TMOHD9djjz2mwsJCPf/887rwwgu1cuVKz/vmqquuktPp1OTJk9WsWTNlZmZqxYoVpb4MWrt2rcaOHasnn3xS8fHxeu+99zRmzBgVFhbqwQcflCQdPHhQvXv3VmFhoZ5++mk1b95cn332mR588EHt2LGj1NDVV199Ve3atdO0adMkFf+7ctVVV2nXrl2eL0/KU195zxWAHxgAcBZmzZplSDJ+/vlno6CgwGjZsqXRo0cPw+VyGYZhGH379jU6duzo2f6rr74yJBmTJ0/2Os68efMMScYbb7zhWZaYmGjYbDZjy5YtXtsuXrzYkGRce+21XsvHjh1rSDLuv/9+r+U33HCDUa9evVOeg9PpNBwOh/HOO+8YNpvNOHz4sGfd0KFDjcTERK/tExMTjaFDh57yeM8//3ypc/nLX/5iREZGGnv27PHa9oUXXjAkGRs2bDAMwzBmzJhhSDL++9//em131113GZKMWbNmnfL3GoZhhIaGGj179jztNuU5l759+xp9+/b1PD/b13zXrl2nrF+S8cQTT3ieu99Tu3btKrNml8tlOBwOY8+ePaVeK/drX9a+J5/Tr7/+WqqdDMMwzjvvPCM5OdnzfNKkSYbVajV+/vlnr+0++ugjQ5LxxRdflFmn29ChQw1JpR59+vQxDMMwnnjiCUOS8fjjj3vt98MPPxiSjBdffNFr+b59+4ywsDBj/PjxhmEYxpEjR4zQ0FDjxhtv9Nru+++/NyR5nfOpXlt3+y5evNgwDMPIzc016tWrV6q9nU6n0bVrV+O8887zLHPXf/Lf6dGjRxuhoaGefwuWLl1qSDIeffTR075effv2Nbp16+a17J577jGio6ON7Ozs0+47dOhQIyIiwnA4HIbD4TAyMzONGTNmGFar1fj73//u2W7v3r1GUFCQ8de//tVr/+zsbCM+Pt645ZZbDMMwjMzMTEOSMW3atNP+3sTERMNisRhr1671Wt6vXz8jOjrayM3NNQzDMB555BFDkvHTTz+VOj+LxeL5t87996Vz585GUVGRZ7uVK1cakoy5c+eWu77ynisA/2BYIAC/CQ4O1jPPPKNVq1bpww8/LHMb94XmJw9Fu/nmmxUREVFqyFGXLl3Utm3bMo91zTXXeD1v3769JOnqq68utfzw4cNew9TWrFmj6667TvXr15fNZpPdbteQIUPkdDq1devWM5/sKcydO1fjx4/XY489prvuusuz/LPPPtMll1yiRo0aqaioyPO48sorJUlLliyRJC1evFhRUVG67rrrvI57++23V7gmfzqb1/xsZGRk6O6771bTpk0VFBQku92uxMRESdKmTZsqdMzOnTsrOTnZ02voPtbKlSs1YsQIz7LPPvtMnTp1Urdu3bzabsCAAWUOpStLWFiYfv75Z6/HW2+95bXNn/70J6/nn332mSwWi+68806v3xsfH6+uXbt6fu8PP/yg/Px83XHHHV779+7d2/Ma+WrFihU6fPiwhg4d6vW7XS6XrrjiCv3888+lhkSe/J7t0qWL8vPzlZGRIUn68ssvJUn33nvvaX/3mDFjtHbtWn3//feSiodkvvvuuxo6dKgiIyPPWHtubq7sdrvsdrtiY2N1zz33aNCgQXr22Wc92yxcuFBFRUUaMmSI1/mFhoaqb9++nte2Xr16atWqlZ5//nlNmTJFa9as8Rq+V1LHjh1LXW96++23KysrS7/88ouk4n//OnTooPPOO89ru2HDhskwjFKTnlx99dVevZtdunSRJM/MrOWpr7znCsA/GBYIwK9uvfVWvfDCC3r00Ue9ru1xO3TokIKCgtSgQQOv5RaLRfHx8Tp06JDXcvfQrrLUq1fP63lwcPBpl+fn5ysyMlJ79+7VhRdeqKSkJL300ktq3ry5QkNDtXLlSt177706fvx4+U+4hMWLF2vYsGEaMmSInn76aa916enp+vTTT2W328vc133t0KFDhzxDvUqKj48vVw3NmjXTrl27fKy8/Cr6mp8Nl8ul/v3768CBA/rHP/6hzp07KyIiQi6XSz179qxwe0nSiBEjdO+992rz5s1q166dZs2apZCQEN12222ebdLT07V9+/Yztt3pWK1Wz3U/p3Lyez09PV2GYZT5fpDkGeLm/jtT1nukvO+bk7mvTRo4cOAptzl8+LAiIiI8z+vXr++13j28190+Bw8elM1mO2NN119/vZo3b65XX31Vffr00ezZs5Wbm3vGUOYWFhampUuXSioejvviiy9q7ty56tKlix555BGv8zv33HPLPIbVWvzds8Vi0TfffKOnnnpKkydP1t/+9jfVq1dPd9xxh5599llFRUV59jnd6+9uo0OHDpW6tYMkNWrUyGs7tzO9puWpr7znCsA/CFcA/Mpisei5555Tv3799MYbb5RaX79+fRUVFengwYNeAcswDKWlpZX6AFCea1l89cknnyg3N1cff/yx1zf7J18A7otff/1VN9xwg/r27av//Oc/pdbHxsaqS5cuXt+el+T+cFW/fn2tXLmy1PryTmgxYMAAvfLKK/rxxx/Ldd1VaGioCgoKSi3PzMxUbGxsuX5neYSGhkpSqd918ofJsvz2229at26dZs+eraFDh3qWb9++/azruu222zRu3DjNnj1bzz77rN59913dcMMNqlu3rmeb2NhYhYWFnfJaPH+9Tie/12NjY2WxWLRs2TKv6xDd3MvcH8DLeo+kpaV5fZg/VTucHBDd5/TKK6+c8n10qtB3Kg0aNJDT6VRaWtppvzSxWq2699579fe//10vvviipk+frssuu6zc146dHGT79eun5ORkTZw4UXfccYeaNm3qOb+PPvrojL17iYmJnl7GrVu36sMPP9STTz6pwsJCvfbaa57tTvX6S3+0Uf369ZWamlpquwMHDkiq2HvpTPX5cq4Azh5fVwDwu8svv1z9+vXTU089VWpYmPsi+Dlz5ngtnz9/vnJzc0tdJF8Z3B9iS35gNQyjzFBUHnv37tWVV16pli1bav78+WX2cFxzzTX67bff1KpVK/Xo0aPUwx2uLrnkEmVnZ3tmT3N7//33y1XLAw88oIiICI0ePbrUTG1S8XmWnIq9efPm+vXXX7222bp1q7Zs2VKu31decXFxCg0NLfW7/vvf/55x37LaS5Jef/31Utue/M3+mdStW1c33HCD3nnnHX322WdKS0vzGhIoFbfdjh07VL9+/TLbrqyeCH+45pprZBiG9u/fX+bv7dy5sySpZ8+eCg0N1Xvvvee1/4oVK0rd2Ntd68ntcPL7rU+fPqpTp442btxY5u/u0aOHp3eyvNxDYGfMmHHGbUeNGqXg4GDdcccd2rJli+677z6ffldJISEhevXVV5Wfn69nnnlGUvGXEEFBQdqxY8cpz68sbdu21WOPPabOnTt7hvq5bdiwQevWrfNa9v777ysqKkrnnHOOpOJ//zZu3Fhq33feeUcWi0WXXHJJhc/zVPVV9FwBVAw9VwAqxXPPPafk5GRlZGR4TZ/cr18/DRgwQA8//LCysrLUp08fz2yB3bt3L3NqbH/r16+fgoODddttt2n8+PHKz8/XjBkzdOTIkQod78orr9TRo0f173//Wxs2bPBa16pVKzVo0EBPPfWUUlJS1Lt3b91///1KSkpSfn6+du/erS+++EKvvfaamjRpoiFDhmjq1KkaMmSInn32WbVp00ZffPGFFi5cWK5aWrRooQ8++ECDBg1St27dPDcRlopnXJs5c6YMw9CNN94oSRo8eLDuvPNOjR49Wn/605+0Z88eTZ48udSwzbPlvnZo5syZatWqlbp27aqVK1eWKzS2a9dOrVq10iOPPCLDMFSvXj19+umnSklJKbWtO3C89NJLGjp0qOx2u5KSkryGb51sxIgRmjdvnu677z41adJEl19+udf6sWPHav78+brooov0wAMPqEuXLnK5XNq7d68WLVqkv/3tbzr//PN9fEXOrE+fPvrzn/+s4cOHa9WqVbrooosUERGh1NRULV++XJ07d9Y999yjunXr6sEHH9QzzzyjUaNG6eabb9a+ffs8s9aVdO655yopKUkPPvigioqKVLduXS1YsEDLly/32i4yMlKvvPKKhg4dqsOHD2vgwIFq2LChDh48qHXr1ungwYPlCkklXXjhhRo8eLCeeeYZpaen65prrlFISIjWrFmj8PBw/fWvf/VsW6dOHQ0ZMkQzZsxQYmKirr322oq/kJL69u2rq666SrNmzdIjjzyiFi1a6KmnntKjjz6qnTt36oorrlDdunWVnp6ulStXKiIiQhMnTtSvv/6q++67TzfffLPatGmj4OBgffvtt/r11189QwzdGjVqpOuuu05PPvmkEhISNGfOHKWkpOi5557z3LPsgQce0DvvvKOrr75aTz31lBITE/X5559r+vTpuueee055femplKe+5s2bl+tcAfiJeXNpAAgEJWcLPNntt99uSPKaLdAw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Dh8+7LnuKi0tzadjSsW9W+PGjfM6r6ZNm6p///5nfAGrgsPhUEpKivr161fqps2oGWjDwEA7BgbaMTDQjjUfbWi+wrUH9M3831QQVl9XXXVuhY5RG9rRPaqtPCoUrpYsWaK33npL8+fPV35+vh566CG9//77at26tc/HslgsXs8Nwyi1zM3lcslisei9995TTEzxzc6mTJmigQMH6tVXX/X0XvlyTEkKCQlRSEhIqeV2u71avUmqWz3wHW0YGGjHwEA7BgbaseajDc3TvlEdSdK2jBwFBQWd9vPymQRyO/pyXuWeLTA1NVX//Oc/1bp1a916662KjY3VkiVLZLVaNWTIEJ+DVWxsrGw2W6kepYyMjFPeQyshIUGNGzf2BCtJat++vQzD0O+//y5Jio+P9+mYAAAAQG3UumGkrBbpSJ5DB3MKzrwDzqjc4apFixbatGmTXn31Ve3fv19TpkxRjx49KvyLg4ODlZycrJSUFK/lKSkp6t27d5n79OnTRwcOHFBOTo5n2datW2W1WtWkSRNJUq9evUodc9GiRac8JgAAAFAbhdptal4/QpK0NS3nDFujPModrhITE7V8+XItXbpUW7du9csvHzdunN58803NnDlTmzZt0gMPPKC9e/fq7rvvllR8LdSQIUM8299+++2qX7++hg8fro0bN2rp0qV66KGHNGLECM+QwDFjxmjRokV67rnntHnzZj333HP6+uuvNXbsWL/UDAAAAASKpPjiWQK3cDNhvyh3uNqyZYvmzJmj1NRUnXvuuUpOTtbUqVMllb7GqbwGDRqkadOm6amnnlK3bt20dOlSffHFF0pMTJRUPBRx7969nu0jIyOVkpKio0ePqkePHrrjjjt07bXXet28uHfv3vrggw80a9YsdenSRbNnz9a8efO4xxUAAABwkrYnbia8Ja38kzbg1Hya0KJPnz7q06ePXn75Zc2dO1czZ86U0+nU6NGjdfvtt+uGG25QgwYNfCpg9OjRGj16dJnrZs+eXWpZu3btSg37O9nAgQM1cOBAn+oAAAAAaps/eq4YFugP5e65KikyMlJ33XWXfvjhB23YsEHJycl67LHH1KhRI3/XBwAAAKCSuHuutqVny+Xyy+1va7UKhauS2rdvrxdeeEH79+/XvHnz/FETAAAAgCrQvH64goOsyit0av/R42aXU+OddbhyCwoK0k03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AKqRNifCVUZ2gY7kFqpuRLDJFVVvPocrwzD00UcfafHixcrIyJDL5fJa//HHH/utOAAAAADmiQwJUpO6Yfr9yHFtTc/W+S3rm11StebzhBZjxozR4MGDtWvXLkVGRiomJsbrAQAAACBwJLknteC6qzPyuedqzpw5+vjjj3XVVVdVRj0AAAAAqpGk+Ch9szmDSS3Kweeeq5iYGLVs2bIyagEAAABQzSTFM6lFefkcrp588klNnDhRx48fr4x6AAAAAFQjJWcMNAzD5GqqN5+HBd58882aO3euGjZsqObNm8tut3ut/+WXX/xWHAAAAABztWwQIZvVoqz8IqVnFSg+JtTskqotn8PVsGHDtHr1at15552Ki4uTxWKpjLoAAAAAVAMhQTa1iI3Q9owcbUnPJlydhs/h6vPPP9fChQt1wQUXVEY9AAAAAKqZpLgobc/I0da0bPVt28Dscqotn6+5atq0qaKjoyujFgAAAADVkHtSi81ManFaPoerF198UePHj9fu3bsroRwAAAAA1U1b7nVVLj4PC7zzzjuVl5enVq1aKTw8vNSEFocPH/ZbcQAAAADM5+652paRLafLkM3KvAtl8TlcTZs2rRLKAAAAAFBdNasXrpAgq/IdLu07nKfmsRFml1Qt+RSuHA6HvvvuO/3jH//gRsIAAABALWGzWtQmLlK/7c/SlvRswtUp+HTNld1u14IFCyqrFgAAAADVVFJc8aR2W5nU4pR8ntDixhtv1CeffFIJpQAAAACorpLiIyVJm5nU4pR8vuaqdevWevrpp7VixQolJycrIsK7S/D+++/3W3EAAAAAqgfPjIH0XJ2Sz+HqzTffVJ06dbR69WqtXr3aa53FYiFcAQAAAAHIPWPgrsxcFRQ5FRJkM7mi6sfncLVr167KqAMAAABANRYfHaqo0CBl5xdpV2au2sVHm11StePzNVclGYYhwzD8VQsAAACAaspisajdid6rLQwNLFOFwtU777yjzp07KywsTGFhYerSpYvefffdChUwffp0tWjRQqGhoUpOTtayZctOue13330ni8VS6rF582bPNrNnzy5zm/z8/ArVBwAAAKCY+7orwlXZfB4WOGXKFP3jH//Qfffdpz59+sgwDH3//fe6++67lZmZqQceeKDcx5o3b57Gjh2r6dOnq0+fPnr99dd15ZVXauPGjWrWrNkp99uy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1VtzzjnnaN68eWrYsGGFrm+SpM6dO8vlcmnJkiWlepTcrrrqKkVERGjGjBn68ssvtXTp0tMes3v37poxY4YMw/AMV/TF/Pnz9dRTT+nLL78s87oud89c9+7dfT42AMA3TGgBADDVvffeq8OHD+u2227zzGq3aNEijRgxQk6nU5GRkRo5cqQeeughffPNN/rtt980bNiwUkPfLr30Uv373//WL7/8olWrVunuu+/26oW64447FBsbq+uvv17Lli3Trl27tGTJEo0ZM0a///57uWpt3ry5hg4dqhEjRuiTTz7Rrl279N133+nDDz/0bGOz2TRs2DBNmDBBrVu39hrOWJZLLrlEubm52rBhgw+vWrHffvtNQ4YM0cMPP6yOHTsqLS1NaWlpOnz4sGebH3/8USEhIWesAwBw9ghXAABTNWrUSN9//72cTqcGDBigTp06acyYMYqJifEEqOeff14XXXSRrrvuOl1++eW64IILlJyc7HWcF198UU2bNtVFF12k22+/XQ8++KDXcLzw8HAtXbpUzZo100033aT27dtrxIgROn78uE89WTNmzNDAgQM1evRotWvXTnfddZdyc3O9thk5cqQKCws1YsSIMx6vfv36uummm8ocrngmq1atUl5enp555hklJCR4HjfddJNnm7lz5+qOO+447dBEAIB/WIyTB6gDAFADXHzxxerWrZumTZtmdimlfP/997r44ov1+++/Ky4u7ozbr1+/XpdffnmZE26cjYMHD6pdu3ZatWpVmTdxBgD4Fz1XAAD4SUFBgbZv365//OMfuuWWW8oVrKTia7kmT57s9+nSd+3apenTpxOsAKCKMKEFAAB+MnfuXI0cOVLdunXTu+++69O+Q4cO9Xs95513ns477zy/HxcAUDaGBQIAAACAHzAsEAAAAAD8gHAFAAAAAH5AuAIAAAAAPyBcAQAAAIAfEK4AAAAAwA8IVwAAAADgB4QrAAAAAPADwhUAAAAA+MH/A5EzLO3IQFCTAAAAAElFTkSuQmCC",
1338 | "text/plain": [
1339 | ""
1340 | ]
1341 | },
1342 | "metadata": {},
1343 | "output_type": "display_data"
1344 | }
1345 | ],
1346 | "source": [
1347 | "model = CLIPModel().to(Config.device)\n",
1348 | "eeg_Sinc = model.eeg_encoder.sinc_conv\n",
1349 | "freqs, avg_freq_response_rand = plot_frequency_response(eeg_Sinc, sample_rate=128)"
1350 | ]
1351 | },
1352 | {
1353 | "cell_type": "code",
1354 | "execution_count": 25,
1355 | "id": "68c49de1",
1356 | "metadata": {
1357 | "ExecuteTime": {
1358 | "end_time": "2024-12-15T16:07:49.407985Z",
1359 | "start_time": "2024-12-15T16:07:49.406097Z"
1360 | }
1361 | },
1362 | "outputs": [],
1363 | "source": [
1364 | "# after Training"
1365 | ]
1366 | },
1367 | {
1368 | "cell_type": "code",
1369 | "execution_count": 26,
1370 | "id": "4295b2d4",
1371 | "metadata": {
1372 | "ExecuteTime": {
1373 | "end_time": "2024-12-15T16:07:49.707120Z",
1374 | "start_time": "2024-12-15T16:07:49.409442Z"
1375 | }
1376 | },
1377 | "outputs": [
1378 | {
1379 | "name": "stdout",
1380 | "output_type": "stream",
1381 | "text": [
1382 | "31\n",
1383 | "(16,)\n"
1384 | ]
1385 | },
1386 | {
1387 | "data": {
1388 | "image/png": "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0tLSxGnTpol+fn6iQqEQnZ2dxdDQUPGtt94S8/Ly9PvduHFDfPLJJ0U7OzvR3t5efPLJJ8VDhw5VqVtguStXrohTp04VW7ZsKapUKtHa2loMCgoSZ86cadApTqfTiQsWLBCbN28uqtVqMSwsTPznn3/u2i2wJu95dna2OGnSJNHNzU20tbUVhwwZIsbFxVWpW+DFixfF/v37i/b29mKjRo3Ep556SoyPj6/wXFEUxblz54qenp6iTCYzGM87z6mcVqsVvb2979nJLi8vT5w3b57o7+8vKpVK0dHRUWzbtq346quvisnJyZU+p1x5B7u7qey9ut2qVavELl26iLa2tqK1tbXYokULccyYMeKJEyf0++h0OvGTTz4Rvb29RaVSKYaEhIjbtm2r9JwvXbokDhgwQHRwcBCbNGkivvLKK+Lvv/9e4bMviqK4d+9ecfDgwaKzs7OoUChELy8vcfDgwQafg7vVX9k4arVacdGiRWJwcLD+fezWrZu4bdu2Cue9Z88eEYD4f//3f3d97+50r/f63LlzokwmE8ePH6/f9uuvv4p9+/YVHRwcRJVKJfr4+IjDhw8X//77b1EURTElJUUcN26cGBAQINra2op2dnZiSEiIuGjRIoMufuX/Vv3yyy9imzZtRKVSKfr6+ooLFy6sUMe1a9fEUaNGiY0bNxYVCoXo7+8vfvbZZ6JWq9XvU94t8LPPPqvw/Ns/81WtryrnSkSmIYiiKNZJiiMiIqI6VX4D4frYEe61117D8uXLcf369QqNHcyNr68vgoODsX37dqlLISKJcVkgERERmY0jR47g0qVLWLZsGSZPnmz2wYqI6HYMV0RERGQ2unXrBhsbGzz66KP6BhRERPUFlwUSERERERGZAFuxExERERERmQDDFRERERERkQkwXBEREREREZkAG1pUQqfTITExEfb29hAEQepyiIiIiIhIIqIoIjc3F56enpDJ7j03xXBVicTERHh7e0tdBhERERERmYnr16+jadOm99yH4aoS9vb2AMreQAcHB4mrATQaDXbu3IkBAwZAoVBIXQ5VA8fQMnAcLQPH0TJwHOs/jqFlaAjjmJOTA29vb31GuBeGq0qULwV0cHAwm3BlY2MDBwcHi/3QWjqOoWXgOFoGjqNl4DjWfxxDy9CQxrEqlwuxoQUREREREZEJMFwRERERERGZAMMVERER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RETVFOhRFq44c1WG4YqIiIiIiKolsHzmKjlP4krMA8MVERERERFVS/mywCtpeSgp1UlcjfQYroiIiIiIqFq8nNSwlovQaEVcTuXsFcMVERERERFViyAI8LQp+3NUUo60xZgBhisiIiIiIqo2L1sRAHCR4YrhioiIiIiIqq88XHHmiuGKiIiIiIhqwMvmv3AliqLE1UiL4YqIiIiIiKrN3QaQywTcLNAgOadI6nIkxXBFRERERETVppABfo3Lulo09KWBDFdERERERFQjgR63biaclCtxJdJiuCIiIiIiohopv5nwxUTOXBEREREREVVboHv5zBXDFRERERERUbWVLwuMzchHQUmpxNVIh+GKiIiIiIhqxMVOBRc7FUQRiE5uuNddMVwREREREVGN/dfUouEuDWS4IiIiIiKiGgvydADAcEVERERERFQjQR7l4YrLAomIiIiIiKot0OO/mSudTpS4GmkwXBERERERUY01d7GF0kqGghIt4jMLpC5HEgxXRERERERUY1ZyGfzdGnZTC4YrIiIiIiIyifKOgRcZroiIiIiIiKovyKNhdwxkuCIiIiIiIpMIbOAdAxmuiIiIiIjIJAJuhauErEJkFZRIXE3dY7giIiIiIiKTcLRWwMvJGkDDnL1iuCIiIiIiIpMJ8my4110xXBERERERkcmUX3fVEDsGMlwREREREZHJBHk03HtdMVwREREREZHJBHk4AgD+TcmDRquTuJq6xXBFREREREQm07SRNexUVijR6nAlLU/qcuoUwxUREREREZmMTCYgwL1hLg1kuCIiIiIiIpP6r2Ngw2rHznBFREREREQmpe8YmMiZKyIiIiIiomorD1dRSTkQRVHiauoOwxUREREREZmUv5s9ZAKQkV+CtNxiqcupMwxXRERERERkUtZKOfxcbAE0rJsJM1wREREREZHJ6a+7YrgiIiIiIiKqvobYMZDhioiIiIiITO72phYNBcMVERERERGZXNCtcHU1LQ9FGq3E1dQNhisiIiIiIjI5V3sVGtsqoROBmOSGsTSQ4YqIiIiIiExOEIQGtzSQ4YqIiIiIiGpFoIc9gIbTMZDhioiIiIiIagVnroiIiIiIiEzg9nbsOp0ocTW1j+GKiIiIiIhqRYsmdlDKZcgrLsWNm4VSl1PrGK6IiIiIiKhWKOQytHS1A9AwrruSPFwtW7YMfn5+UKvVCA0Nxf79+++67549eyAIQoWv6Ohog/02bdqEoKAgqFQqBAUFYcuWLbV9GkREREREVIn/lgYyXNWqjRs3YsaMGXjrrbdw+vRp9OzZE4MGDUJ8fPw9nxcTE4OkpCT9V6tWrfSPHT58GCNHjsTo0aMRGRmJ0aNHY8SIETh69Ghtnw4REREREd2hvKkFZ65q2cKFCzFx4kRMmjQJgYGBWLx4Mby9vbF8+fJ7Ps/V1RXu7u76L7lcrn9s8eLF6N+/P+bOnYuAgADMnTsX/fr1w+LFi2v5bIiIiIiI6E7l7dgbwsyVlVQvXFJSgpMnT2LOnDkG2wcMGIBDhw7d87kdOnRAUVERgoKCMG/ePPTt21f/2OHDh/Hqq68a7D9w4MB7hqvi4mIUFxfrv8/JKRt4jUYDjUZT1VOqNeU1mEMtVD0cQ8vAcbQMHEfLwHGs/ziGlqEq49jKxQYAcONmITJyCuBgraiT2kzFmM+oZOEqPT0dWq0Wbm5uBtvd3NyQnJxc6XM8PDzwzTffIDQ0FMXFxVi7di369euHPXv2oFevXgCA5ORko44JAJ988gnmz59fYfvOnTthY2Nj7KnVmoiICKlLoBriGFoGjqNl4DhaBo5j/ccxtAz3G0cnpRxZJQLCf4tAS4c6KspECgoKqryvZOGqnCAIBt+LolhhWzl/f3/4+/vrv+/WrRuuX7+Ozz//XB+ujD0mAMydOxczZ87Uf5+TkwNvb28MGDAADg7Sj75Go0FERAT69+8PhaJ+JX0qwzG0DBxHy8BxtAwcx/qPY2gZqjqOv2aewu6YdDj5BuORrs3qsMKaK1/VVhWShSsXFxfI5fIKM0qpqakVZp7upWvXrli3bp3+e3d3d6OPqVKpoFKpKmxXKBRm9Zfd3Ooh43EMLQPH0TJwHC0Dx7H+4xhahvuNY7CXE3bHpONSSn69G29j6pWsoYVSqURoaGiFKcSIiAh07969ysc5ffo0PDw89N9369atwjF37txp1DGJiIiIiMh0yjsGRiVbdlMLSZcFzpw5E6NHj0ZYWBi6deuGb775BvHx8ZgyZQqAsuV6CQkJWLNmDYCyToC+vr5o06YNSkpKsG7dOmzatAmbNm3SH3P69Ono1asXPv30Uzz22GP47bff8Pfff+PAgQOSnCMRERERUUNXHq6ik3NRqtXBSi757XZrhaThauTIkcjIyMD777+PpKQkBAcHY8eOHfDx8QEAJCUlGdzzqqSkBLNmzUJCQgKsra3Rpk0b/P7773jkkUf0+3Tv3h0//vgj5s2bh7fffhstWrTAxo0b0aVLlzo/PyIiIiIiAnycbWCjlKOgRIvY9Hy0crOXuqRaIXlDi6lTp2Lq1KmVPhYeHm7w/ezZszF79uz7HnP48OEYPny4KcojIiIiIqIakskEBLjb41R8Fi4m5VhsuLLM+TgiIiIiIjIr5UsDL1rwzYQZroiIiIiIqNYFed5qapGUK3EltYfhioiIiIiIap2+YyBnroiIiIiIiKovwN0eggCk5RYjLbdY6nJqBcMVERERERHVOhulFXwb2wKw3NkrhisiIiIiIqoTQRa+NJDhioiIiIiI6kSgR1kLdkvtGMhwRUREREREdcLSm1owXBERERERUZ0ob8d+JS0fRRqtxNWYHsMVERERERHVCXcHNZxsFNDqRPybkid1OSbHcEVERERERHVCEAQEulvu0kCGKyIiIiIiqjPlSwMtsakFwxUREREREdWZ8qYWDFdEREREREQ1UN6OPSopB6IoSlyNaTFcERERERFRnWnlag+FXEBuUSkSsgqlLsekGK6IiIiIiKjOKK1kaNHEDgAQlZQrcTWmxXBFRERERER1Kqj8uqtEy7ruiuGKiIiIiIjqVHnHQEtrx85wRUREREREdaq8Y2BUMsMVERERERFRtZWHq2sZBcgt0khcjekwXBERERERUZ1ytlXCzUEFAIhJtpymFgxXRERERERU58qbWljSdVcMV0REREREVOfKlwZeZLgiIiIiIiKqvv/CFZcFEhERERERVVt5O/aY5BxodaLE1ZgGwxUREREREdU538a2UCtkKNLoEJueL3U5JsFwRUREREREdU4uE+DvbllNLRiuiIiIiIhIEpbWMZDhioiIiIiIJBHkYQ/AcjoGMlwREREREZEkAjlzRUREREREVHMBt8JVSk4xMvKKJa6m5hiuiIiIiIhIEnYqK/g0tgEARFnA/a4YroiIiIiISDKBFtQxkOGKiIiIiIgkU34zYYYrIiIiIiKiGihvamEJHQMZroiIiIiISDKBt9qxX07NQ3GpVuJqaobhioiIiIiIJOPlZA0HtRVKdSIup+ZJXU6NMFwREREREZFkBEG47X5X9btjIMMVERERERFJSn/dVWL9vu6K4YqIiIiIiCQV5GEZHQMZroiIiIiISFL6duzJORBFUeJqqo/hioiIiIiIJNXS1Q5ymYCsAg2SsoukLqfaGK6IiIiIiEhSaoUcLZrYAqjfSwMZroiIiIiISHKWcN0VwxUREREREUlO3zGQ4YqIiIiIiKj6LOFeVwxXREREREQkufJwFZeRj/ziUomrqR6GKyIiIiIiklwTexWa2KsgikB0cv2cvWK4IiIiIiIisxBYz5taMFwREREREZFZqO8dAxmuiIiIiIjILAR62AOovx0DGa6IiIiIiMgslM9cxSTnQqcTJa7GeAxXRERERERkFvxcbKGykqGgRItrmQVSl2M0hisiIiIiIjILVnIZ/N3LlgbWx+uuGK6IiIiIiMhsBLqXLQ28mMhwRUREREREVG1BnvW3YyDDFRERERERmY36fK8rhisiIiIiIjIbAbfasSdmFyGroETiaoxjJXUBRERERERE5RzUCnTybQQHtQK5RaVwslFKXVKVMVwREREREZFZ+XlKd6lLqBYuCyQiIiIiIjIBhisiIiIiIiITkDxcLVu2DH5+flCr1QgNDcX+/fur9LyDBw/CysoK7du3N9geHh4OQRAqfBUVFdVC9URERERERGUkDVcbN27EjBkz8NZbb+H06dPo2bMnBg0ahPj4+Hs+Lzs7G2PGjEG/fv0qfdzBwQFJSUkGX2q1ujZOgYiIiIiICIDE4WrhwoWYOHEiJk2ahMDAQCxevBje3t5Yvnz5PZ83efJkjBo1Ct26dav0cUEQ4O7ubvBFRERERERUmyTrFlhSUoKTJ09izpw5BtsHDBiAQ//f3p0H13T+fwB/3ywuWZFIclNphIQgyCZELLGliG1MURQRdFLSMlpFOyV8VdRaEaKxBKVCxzJqitzRLKSTiURSsUwFSS1NqrYmTUjS5Pn94ZfTnt4bpK7exfs1c2dynvOccz83bxEfz7nn/vBDg8clJSXh2rVr2LNnD5YvX651zh9//AF3d3fU1tbC19cX//vf/+Dn59fgOauqqlBVVSVtl5U9+cCympoa1NTUNOZlvRT1NRhCLfTvMEPTwBxNA3M0DczR+DFD0/Aq5NiY16a35uru3buora2Fs7OzbNzZ2RmlpaVajyksLMTChQtx+vRpWFhoL93b2xs7d+5Ely5dUFZWhg0bNiAkJAQ//vgjvLy8tB4TGxuLpUuXaoynpKTAysqqka/s5VGr1fougV4QMzQNzNE0MEfTwByNHzM0DaacY2Vl5XPP1fvnXCkUCtm2EEJjDABqa2sxceJELF26FO3bt2/wfD179kTPnj2l7ZCQEPj7+2Pjxo2Ii4vTesyiRYswb948abusrAxubm4ICwuDnZ1dY1+SztXU1ECtVmPw4MGwtLTUdzn0LzBD08AcTQNzNA3M0fgxQ9PwKuRYf1Xb89Bbc+Xo6Ahzc3ONVao7d+5orGYBQHl5OXJycpCXl4fo6GgAQF1dHYQQsLCwQEpKCgYMGKBxnJmZGbp3747CwsIGa1EqlVAqlRrjlpaWBvWHxNDqocZjhqaBOZoG5mgamKPxY4amwZRzbMzr0tsNLZo0aYKAgACNJUS1Wo1evTQ/kdnOzg4FBQXIz8+XHlFRUejQoQPy8/PRo0cPrc8jhEB+fj5UKtVLeR1ERERERESAni8LnDdvHiZPnozAwEAEBwcjMTERN27cQFRUFIAnl+vdvn0bu3fvhpmZGXx8fGTHOzk5oWnTprLxpUuXomfPnvDy8kJZWRni4uKQn5+PTZs2/aevjYiIiIiIXi16ba7Gjx+Pe/fuYdmyZSgpKYGPjw++++47uLu7AwBKSkqe+ZlX//Tw4UO88847KC0thb29Pfz8/JCRkYGgoKCX8RKIiIiIiIgAGMANLWbNmoVZs2Zp3bdz586nHhsTE4OYmBjZ2Pr167F+/XodVUdERERERPR89PohwkRERERERKaCzRUREREREZEOsLkiIiIiIiLSATZXREREREREOsDmioiIiIiISAf0frdAQySEAACUlZXpuZInampqUFlZibKyMpP95GtTxwxNA3M0DczRNDBH48cMTcOrkGN9T1DfIzwNmystysvLAQBubm56roSIiIiIiAxBeXk57O3tnzpHIZ6nBXvF1NXV4ZdffoGtrS0UCoW+y0FZWRnc3Nxw8+ZN2NnZ6bsc+heYoWlgjqaBOZoG5mj8mKFpeBVyFEKgvLwcrq6uMDN7+ruquHKlhZmZGVq3bq3vMjTY2dmZ7B/aVwUzNA3M0TQwR9PAHI0fMzQNpp7js1as6vGGFkRERERERDrA5oqIiIiIiEgH2FwZAaVSiSVLlkCpVOq7FPqXmKFpYI6mgTmaBuZo/JihaWCOcryhBRERERERkQ5w5YqIiIiIiEgH2FwRERERERHpAJsrIiIiIiIiHWBzRUREREREpANsrgzc5s2b4eHhgaZNmyIgIACnT5/Wd0n0FBkZGRgxYgRcXV2hUChw5MgR2X4hBGJiYuDq6opmzZohNDQUFy9e1E+xpFVsbCy6d+8OW1tbODk5YfTo0fjpp59kc5ij4UtISEDXrl2lD7UMDg7G8ePHpf3M0PjExsZCoVBg7ty50hhzNHwxMTFQKBSyh4uLi7SfGRqP27dv4+2334aDgwOsrKzg6+uL3NxcaT+zfILNlQHbv38/5s6di08++QR5eXno06cPhg4dihs3bui7NGpARUUFunXrhvj4eK37V61ahXXr1iE+Ph5nz56Fi4sLBg8ejPLy8v+4UmpIeno6Zs+ejaysLKjVavz5558ICwtDRUWFNIc5Gr7WrVtj5cqVyMnJQU5ODgYMGIBRo0ZJv+iZoXE5e/YsEhMT0bVrV9k4czQOnTt3RklJifQoKCiQ9jFD4/DgwQOEhITA0tISx48fx6VLl7B27Vo0b95cmsMs/58ggxUUFCSioqJkY97e3mLhwoV6qogaA4A4fPiwtF1XVydcXFzEypUrpbHHjx8Le3t7sWXLFj1USM/jzp07AoBIT08XQjBHY9aiRQuxbds2ZmhkysvLhZeXl1Cr1aJfv35izpw5Qgj+LBqLJUuWiG7dumndxwyNx4IFC0Tv3r0b3M8s/8KVKwNVXV2N3NxchIWFycbDwsLwww8/6KkqehFFRUUoLS2VZapUKtGvXz9masB+//13AEDLli0BMEdjVFtbi+TkZFRUVCA4OJgZGpnZs2cjPDwcgwYNko0zR+NRWFgIV1dXeHh44K233sL169cBMENjcvToUQQGBmLs2LFwcnKCn58ftm7dKu1nln9hc2Wg7t69i9raWjg7O8vGnZ2dUVpaqqeq6EXU58ZMjYcQAvPmzUPv3r3h4+MDgDkak4KCAtjY2ECpVCIqKgqHDx9Gp06dmKERSU5Oxrlz5xAbG6uxjzkahx49emD37t04efIktm7ditLSUvTq1Qv37t1jhkbk+vXrSEhIgJeXF06ePImoqCi8//772L17NwD+PP6dhb4LoKdTKBSybSGExhgZF2ZqPKKjo3H+/HmcOXNGYx9zNHwdOnRAfn4+Hj58iIMHD2Lq1KlIT0+X9jNDw3bz5k3MmTMHKSkpaNq0aYPzmKNhGzp0qPR1ly5dEBwcjHbt2mHXrl3o2bMnAGZoDOrq6hAYGIgVK1YAAPz8/HDx4kUkJCRgypQp0jxmyZUrg+Xo6Ahzc3ONbv/OnTsa/ytAxqH+7kjM1Di89957OHr0KFJTU9G6dWtpnDkajyZNmsDT0xOBgYGIjY1Ft27dsGHDBmZoJHJzc3Hnzh0EBATAwsICFhYWSE9PR1xcHCwsLKSsmKNxsba2RpcuXVBYWMifRSOiUqnQqVMn2VjHjh2lm6wxy7+wuTJQTZo0QUBAANRqtWxcrVajV69eeqqKXoSHhwdcXFxkmVZXVyM9PZ2ZGhAhBKKjo3Ho0CF8//338PDwkO1njsZLCIGqqipmaCQGDhyIgoIC5OfnS4/AwEBMmjQJ+fn5aNu2LXM0QlVVVbh8+TJUKhV/Fo1ISEiIxseSXLlyBe7u7gD4u1FGX3fSoGdLTk4WlpaWYvv27eLSpUti7ty5wtraWhQXF+u7NGpAeXm5yMvLE3l5eQKAWLduncjLyxM///yzEEKIlStXCnt7e3Ho0CFRUFAgJkyYIFQqlSgrK9Nz5VTv3XffFfb29iItLU2UlJRIj8rKSmkOczR8ixYtEhkZGaKoqEicP39efPzxx8LMzEykpKQIIZihsfr73QKFYI7G4IMPPhBpaWni+vXrIisrSwwfPlzY2tpK/5ZhhsYhOztbWFhYiM8++0wUFhaKvXv3CisrK7Fnzx5pDrN8gs2Vgdu0aZNwd3cXTZo0Ef7+/tLtoMkwpaamCgAaj6lTpwohntyqdMmSJcLFxUUolUrRt29fUVBQoN+iSUZbfgBEUlKSNIc5Gr7IyEjp785WrVqJgQMHSo2VEMzQWP2zuWKOhm/8+PFCpVIJS0tL4erqKsaMGSMuXrwo7WeGxuPbb78VPj4+QqlUCm9vb5GYmCjbzyyfUAghhH7WzIiIiIiIiEwH33NFRERERESkA2yuiIiIiIiIdIDNFRERERERkQ6wuSIiIiIiItIBNldEREREREQ6wOaKiIiIiIhIB9hcERERERER6QCbKyIiIiIiIh1gc0VERKRn1dXV8PT0RGZmpk7Pe+zYMfj5+aGurk6n5yUiIu3YXBERkU5FRERAoVBoPK5evarv0gxWYmIi3N3dERISIo0pFAocOXJEY25ERARGjx79XOcdPnw4FAoFvv76ax1VSkRET8PmioiIdG7IkCEoKSmRPTw8PDTmVVdX66E6w7Nx40bMmDHjpZx72rRp2Lhx40s5NxERybG5IiIinVMqlXBxcZE9zM3NERoaiujoaMybNw+Ojo4YPHgwAODSpUsYNmwYbGxs4OzsjMmTJ+Pu3bvS+SoqKjBlyhTY2NhApVJh7dq1CA0Nxdy5c6U52lZ6mjdvjp07d0rbt2/fxvjx49GiRQs4ODhg1KhRKC4ulvbXrwqtWbMGKpUKDg4OmD17NmpqaqQ5VVVV+Oijj+Dm5galUgkvLy9s374dQgh4enpizZo1shouXLgAMzMzXLt2Tev36ty5c7h69SrCw8Mb+V0GiouLta4ShoaGSnNGjhyJ7OxsXL9+vdHnJyKixmFzRURE/6ldu3bBwsICmZmZ+PLLL1FSUoJ+/frB19cXOTk5OHHiBH799VeMGzdOOmb+/PlITU3F4cOHkZKSgrS0NOTm5jbqeSsrK9G/f3/Y2NggIyMDZ86cgY2NDYYMGSJbQUtNTcW1a9eQmpqKXbt2YefOnbIGbcqUKUhOTkZcXBwuX76MLVu2wMbGBgqFApGRkUhKSpI9744dO9CnTx+0a9dOa10ZGRlo37497OzsGvV6AMDNzU22OpiXlwcHBwf07dtXmuPu7g4nJyecPn260ecnIqLGsdB3AUREZHqOHTsGGxsbaXvo0KH45ptvAACenp5YtWqVtG/x4sXw9/fHihUrpLEdO3bAzc0NV65cgaurK7Zv347du3dLK127du1C69atG1VTcnIyzMzMsG3bNigUCgBAUlISmjdvjrS0NISFhQEAWrRogfj4eJibm8Pb2xvh4eE4deoUZs6ciStXruDAgQNQq9UYNGgQAKBt27bSc0ybNg2LFy9GdnY2goKCUFNTgz179mD16tUN1lVcXAxXV1et+yZMmABzc3PZWFVVlbTKZW5uDhcXFwDA48ePMXr0aAQHByMmJkZ2zGuvvSZboSMiopeDzRUREelc//79kZCQIG1bW1tLXwcGBsrm5ubmIjU1VdaM1bt27RoePXqE6upqBAcHS+MtW7ZEhw4dGlVTbm4url69CltbW9n448ePZZfsde7cWdbQqFQqFBQUAADy8/Nhbm6Ofv36aX0OlUqF8PBw7NixA0FBQTh27BgeP36MsWPHNljXo0eP0LRpU6371q9fLzVx9RYsWIDa2lqNudOnT0d5eTnUajXMzOQXpjRr1gyVlZUN1kBERLrB5oqIiHTO2toanp6eDe77u7q6OowYMQKff/65xlyVSoXCwsLnek6FQgEhhGzs7++VqqurQ0BAAPbu3atxbKtWraSvLS0tNc5bfyvzZs2aPbOOGTNmYPLkyVi/fj2SkpIwfvx4WFlZNTjf0dFRat7+ycXFReP7aGtri4cPH8rGli9fjhMnTiA7O1ujeQSA+/fvy14jERG9HGyuiIhIr/z9/XHw4EG0adMGFhaav5Y8PT1haWmJrKwsvP766wCABw8e4MqVK7IVpFatWqGkpETaLiwslK3W+Pv7Y//+/XBycvpX728CgC5duqCurg7p6ekaK0r1hg0bBmtrayQkJOD48ePIyMh46jn9/PyQkJAAIYR0uWJjHDx4EMuWLcPx48e1vq+rfmXOz8+v0ecmIqLG4Q0tiIhIr2bPno379+9jwoQJ0l3tUlJSEBkZidraWtjY2GD69OmYP38+Tp06hQsXLiAiIkLj0rcBAwYgPj4e586dQ05ODqKiomSrUJMmTYKjoyNGjRqF06dPo6ioCOnp6ZgzZw5u3br1XLW2adMGU6dORWRkJI4cOYKioiKkpaXhwIED0hxzc3NERERg0aJF8PT0lF3OqE3//v1RUVGBixcvNuK79sSFCxcwZcoULFiwAJ07d0ZpaSlKS0tx//59aU5WVhaUSuUz6yAiohfH5oqIiPTK1dUVmZmZqK2txRtvvAEfHx/MmTMH9vb2UgO1evVq9O3bFyNHjsSgQYPQu3dvBAQEyM6zdu1auLm5oW/fvpg4cSI+/PBD2eV4VlZWyMjIwOuvv44xY8agY8eOiIyMxKNHjxq1kpWQkIA333wTs2bNgre3N2bOnImKigrZnOnTp6O6uhqRkZHPPJ+DgwPGjBmj9XLFZ8nJyUFlZSWWL18OlUolPcaMGSPN2bdvHyZNmvTUSxOJiEg3FOKfF6gTEREZgdDQUPj6+uKLL77QdykaMjMzERoailu3bsHZ2fmZ8wsKCjBo0CCtN9x4Eb/99hu8vb2Rk5Oj9UOciYhIt7hyRUREpCNVVVW4evUqPv30U4wbN+65GivgyXu5Vq1apfPbpRcVFWHz5s1srIiI/iO8oQUREZGO7Nu3D9OnT4evry+++uqrRh07depUndcTFBSEoKAgnZ+XiIi042WBREREREREOsDLAomIiIiIiHSAzRUREREREZEOsLkiIiIiIiLSATZXREREREREOsDmioiIiIiISAfYXBEREREREekAmysiIiIiIiIdYHNFRERERESkA/8HnZf3PY0oQPUAAAAASUVORK5CYII=",
1389 | "text/plain": [
1390 | ""
1391 | ]
1392 | },
1393 | "metadata": {},
1394 | "output_type": "display_data"
1395 | }
1396 | ],
1397 | "source": [
1398 | "model = CLIPModel().to(Config.device)\n",
1399 | "# 加载模型参数\n",
1400 | "model.load_state_dict(torch.load(\"Cross_trails_trysomething_new_1019/S4/cross_trails_s4_best.pt\"))\n",
1401 | "\n",
1402 | "eeg_Sinc_1 = model.eeg_encoder.sinc_conv\n",
1403 | "freqs,avg_freq_response_learn = plot_frequency_response(eeg_Sinc_1, sample_rate=128)"
1404 | ]
1405 | },
1406 | {
1407 | "cell_type": "code",
1408 | "execution_count": null,
1409 | "id": "0199a535",
1410 | "metadata": {},
1411 | "outputs": [],
1412 | "source": []
1413 | },
1414 | {
1415 | "cell_type": "code",
1416 | "execution_count": 27,
1417 | "id": "e3c34e94",
1418 | "metadata": {
1419 | "ExecuteTime": {
1420 | "end_time": "2024-12-15T16:07:49.710835Z",
1421 | "start_time": "2024-12-15T16:07:49.708894Z"
1422 | }
1423 | },
1424 | "outputs": [],
1425 | "source": [
1426 | "# for all subject"
1427 | ]
1428 | },
1429 | {
1430 | "cell_type": "code",
1431 | "execution_count": 28,
1432 | "id": "ce9007f1",
1433 | "metadata": {
1434 | "ExecuteTime": {
1435 | "end_time": "2024-12-15T16:07:50.009436Z",
1436 | "start_time": "2024-12-15T16:07:49.712388Z"
1437 | },
1438 | "scrolled": true
1439 | },
1440 | "outputs": [
1441 | {
1442 | "name": "stdout",
1443 | "output_type": "stream",
1444 | "text": [
1445 | "Processing file: Cross_trails/S1/cross_trails_s1_best.pt\n",
1446 | "31\n",
1447 | "(16,)\n"
1448 | ]
1449 | },
1450 | {
1451 | "data": {
1452 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAAIhCAYAAACizkCYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACJgElEQVR4nOzdd3hTZf/H8U/SvYGWDlYpq1C2RaYyVFBxK4KigAwVcTBElEdUcKGogPAI6k8BFUUeBdwKVZkiIhuh7FFGB2W1tHTm/P4ojZQWaGjatOn7dV29JCcnyffkDphP7/t8j8kwDEMAAAAAgBIxO7oAAAAAAHAGhCsAAAAAsAPCFQAAAADYAeEKAAAAAOyAcAUAAAAAdkC4AgAAAAA7IFwBAAAAgB0QrgAAAADADghXAAAAAGAHhCsAJTJnzhyZTCZ5enrq4MGDhe7v2rWrmjVr5oDK7OOhhx5S3bp1C2yrW7euHnrooTKt48CBAzKZTJozZ06x9t+3b5+eeOIJNWrUSF5eXvL29lbTpk01btw4HTlypHSLLaH8z9SBAwdsfuzq1as1fvx4nTp1qtB9Xbt2VdeuXUtcn60eeughmUymIn9++OGHMq/HmV34Xru7u6t+/foaPXq0UlJSHF0egErA1dEFAHAOmZmZGjdunD777DNHl1LqFi1aJH9/f0eXcVE//PCD7rvvPgUFBemJJ55Q69atZTKZtHXrVs2aNUs//vijNm7c6OgyS8Xq1as1YcIEPfTQQ6pSpUqB+2bMmOGYoiR5eXnp999/L7S9cePGDqjGuZ3/Xp86dUpff/213nnnHW3ZskVLlixxcHUAnB3hCoBd3HTTTfriiy80evRotWzZstRe5+zZs/Ly8iq15y+O1q1bO/T1L2X//v2677771KhRIy1dulQBAQHW+6677jo99dRTWrRokQMrdJyoqCiHvbbZbFb79u2LvX96erq8vb1LsSLndeF7fdNNN2nfvn2KiYnR/v37FRER4cDqADg7lgUCsIsxY8YoMDBQzz777GX3zcjI0NixYxURESF3d3fVrFlTjz/+eKGlXHXr1tWtt96qhQsXqnXr1vL09NSECRO0bNkymUwmffHFF3r22WcVFhYmX19f3XbbbUpMTFRqaqoeeeQRBQUFKSgoSAMHDtSZM2cKPPd7772nzp07Kzg4WD4+PmrevLkmTZqk7Ozsy9Z/4bLArl27XnTZ1/nL+BISEvToo4+qVq1acnd3V0REhCZMmKCcnJwCz3/06FH17t1bfn5+CggIUJ8+fZSQkHDZuiRp8uTJSktL04wZMwoEq3wmk0l33333RY/l/GM6fwldSd/zSy1rNJlMGj9+/CWPKyYmRnfccYdq1aolT09PNWjQQI8++qiSk5Ot+4wfP17PPPOMJCkiIsI6BsuWLSt0TNnZ2QoODla/fv0KvdapU6fk5eWlUaNGWbelpKRo9OjRBT6zI0aMUFpa2iXrLo7x48fLZDJpw4YN6tWrl6pWrar69etLkgzD0IwZM9SqVSt5eXmpatWq6tWrl/bt21fgOQzD0KRJkxQeHi5PT09dddVV+vnnnwuN48WWXOaPb/57le/XX3/V9ddfL39/f3l7e6tTp0767bffiqx/27Ztuv/++xUQEKCQkBANGjRIp0+fLrCvxWLR9OnTrcdTpUoVtW/fXt99950kafDgwapWrZrS09MLvU/XXXedmjZtastba9WmTRtJUmJiYoHt8+fPV4cOHeTj4yNfX1/deOONhWZ19+3bp/vuu081atSQh4eHQkJCdP3112vTpk3WffL/rVq0aJFatGghT09P1atXT9OmTStUS1xcnB588EEFBwfLw8NDTZo00TvvvCOLxWLdJ//vy9tvv63JkycrIiJCvr6+6tChg9asWWNzfcU9VgAlx8wVALvw8/PTuHHjNHz4cP3++++67rrritzPMAzdeeed+u233zR27Fhde+212rJli1566SX9+eef+vPPP+Xh4WHdf8OGDYqNjdW4ceMUEREhHx8f6xfa//znP+rWrZvmzJmjAwcOaPTo0br//vvl6uqqli1bat68edq4caP+85//yM/Pr8AXnb1796pv377WL8ubN2/Wa6+9ph07dmjWrFk2HfuMGTMKnc/xwgsvaOnSpYqMjJSUF6zatm0rs9msF198UfXr19eff/6pV199VQcOHNDs2bMl5c3M3XDDDTp69KgmTpyoRo0a6ccff1SfPn2KVcuSJUsUEhJi0yyJLUrynpfE3r171aFDBw0ZMkQBAQE6cOCAJk+erGuuuUZbt26Vm5ubhgwZohMnTmj69OlauHChwsLCJBU9Y+Xm5qYHH3xQ77//vt57770CyzznzZunjIwMDRw4UFLeLFKXLl10+PBh/ec//1GLFi20bds2vfjii9q6dat+/fVXmUymyx7DhSHaZDLJxcXFevvuu+/Wfffdp6FDh1o/448++qjmzJmjp556Sm+++aZOnDihl19+WR07dtTmzZsVEhIiSZowYYImTJigwYMHq1evXjp06JAefvhh5ebmWj+Dtpo7d6769++vO+64Q5988onc3Nz0wQcf6MYbb9TixYt1/fXXF9j/nnvuUZ8+fTR48GBt3bpVY8eOlaQCf58eeughzZ07V4MHD9bLL78sd3d3bdiwwRr2hg8frlmzZumLL77QkCFDrI/bvn27li5dqvfee++KjmX//v1ydXVVvXr1rNtef/11jRs3TgMHDtS4ceOUlZWlt956S9dee63Wrl1r/dz07NlTubm5mjRpkurUqaPk5GStXr260C+DNm3apBEjRmj8+PEKDQ3V559/ruHDhysrK0ujR4+WJB07dkwdO3ZUVlaWXnnlFdWtW1c//PCDRo8erb179xZauvree++pcePGmjp1qqS8f1d69uyp/fv3W395Upz6inusAOzAAIASmD17tiHJ+Pvvv43MzEyjXr16Rps2bQyLxWIYhmF06dLFaNq0qXX/X375xZBkTJo0qcDzzJ8/35BkfPjhh9Zt4eHhhouLi7Fz584C+y5dutSQZNx2220Fto8YMcKQZDz11FMFtt95551GtWrVLnoMubm5RnZ2tvHpp58aLi4uxokTJ6z3DRgwwAgPDy+wf3h4uDFgwICLPt9bb71V6FgeffRRw9fX1zh48GCBfd9++21DkrFt2zbDMAxj5syZhiTj22+/LbDfww8/bEgyZs+efdHXNQzD8PT0NNq3b3/JfYpzLF26dDG6dOlivV3S93z//v0XrV+S8dJLL1lv53+m9u/fX2TNFovFyM7ONg4ePFjovcp/74t67IXHtGXLlkLjZBiG0bZtWyM6Otp6e+LEiYbZbDb+/vvvAvt9/fXXhiTjp59+KrLOfAMGDDAkFfrp1KmTYRiG8dJLLxmSjBdffLHA4/78809DkvHOO+8U2H7o0CHDy8vLGDNmjGEYhnHy5EnD09PTuOuuuwrs98cffxiSChzzxd7b/PFdunSpYRiGkZaWZlSrVq3QeOfm5hotW7Y02rZta92WX/+Ff6eHDRtmeHp6Wv8tWLFihSHJeP755y/5fnXp0sVo1apVgW2PPfaY4e/vb6Smpl7ysQMGDDB8fHyM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1KmTqlSpou3btxf52m3atLHOThZX/hLYmTNnXnbfIUOGyN3dXQ888IB27typJ554wqbXOp+Hh4fee+89ZWRk6NVXX5WU90sIV1dX7d2796LHV5RGjRpp3Lhxat68uXWpX75t27Zp8+bNBbZ98cUX8vPz01VXXSUp79+/7du3F3rsp59+KpPJpG7dul3xcV6svis9VgBXhpkrAKXizTffVHR0tJKSkgq0T+7evbtuvPFGPfvss0pJSVGnTp2s3QJbt25dZGtse+vevbvc3d11//33a8yYMcrIyNDMmTN18uTJK3q+m2++WadOndJ///tfbdu2rcB99evXV/Xq1fXyyy8rJiZGHTt21FNPPaXIyEhlZGTowIED+umnn/T++++rVq1a6t+/v6ZMmaL+/fvrtddeU8OGDfXTTz9p8eLFxaolIiJCX375pfr06aNWrVpZLyIs5XVcmzVrlgzD0F133SVJ6tevnx588EENGzZM99xzjw4ePKhJkyYVWrZZUvnnDs2aNUv169dXy5YttXbt2mKFxsaNG6t+/fp67rnnZBiGqlWrpu+//14xMTGF9s0PHO+++64GDBggNzc3RUZGFli+daFBgwZp/vz5euKJJ1SrVi3dcMMNBe4fMWKEFixYoM6dO2vkyJFq0aKFLBaL4uLitGTJEj399NNq166dje/I5XXq1EmPPPKIBg4cqHXr1qlz587y8fFRfHy8Vq1apebNm+uxxx5T1apVNXr0aL366qsaMmSI7r33Xh06dMjate58V199tSIjIzV69Gjl5OSoatWqWrRokVatWlVgP19fX02fPl0DBgzQiRMn1KtXLwUHB+vYsWPavHmzjh07VqyQdL5rr71W/fr106uvvqrExETdeuut8vDw0MaNG+Xt7a0nn3zSum+VKlXUv39/zZw5U+Hh4brtttuu/I2U1KVLF/Xs2VOzZ8/Wc889p4iICL388st6/vnntW/fPt10002qWrWqEhMTtXbtWvn4+GjChAnasmWLnnjiCd17771q2LCh3N3d9fvvv2vLli3WJYb5atSoodtvv13jx49XWFiY5s6dq5iYGL355pvWa5aNHDlSn376qW655Ra9/PLLCg8P148//qgZM2boscceu+j5pRdTnPrq1q1brGMFYCeO66UBwBmc3y3wQn379jUkFegWaBiGcfbsWePZZ581wsPDDTc3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u067du3Spk2b7FweAAAAAHtqQsfAUlPscBUfH6/XX39dDRo00H333aegoCAtX75cZrNZ/fv3V4MGDa6ogBkzZigiIkKenp6Kjo7WypUrL7l/Zmamnn/+eYWHh8vDw0P169fXrFmzCuyzYMECRUVFycPDQ1FRUVq0aNEV1QYAAAA4G2tTi/hUB1fifIrd0CIiIkL33nuv3nvvPXXv3l1mc8lP15o/f75GjBihGTNmqFOnTvrggw908803a/v27apTp06Rj+ndu7cSExP18ccfq0GDBkpKSlJOTo71/j///FN9+vTRK6+8orvuukuLFi1S7969tWrVKrVr167ENQMAAAAVGTNXpafY4So8PFyrVq1SnTp1FB4ersaNG5f4xSdPnqzBgwdryJAhkqSpU6dq8eLFmjlzpiZOnFho/19++UXLly/Xvn37VK1aNUlS3bp1C+wzdepUde/eXWPHjpUkjR07VsuXL9fUqVM1b968EtcMAAAAVGRR58LVvmNnlJGdK083FwdX5DyKHa527typP/74Qx9//LGuvvpqNWrUSA8++KAkXVELx6ysLK1fv17PPfdcge09evTQ6tWri3zMd999pzZt2mjSpEn67LPP5OPjo9tvv12vvPKKvLy8JOXNXI0cObLA42688UZNnTr1orVkZmYqM/PfbikpKXkpPjs7W9nZ2TYfm73l11AeasGVYQydA+PoHBhH58A4VnyMoeNU9TSrqrebTqZna/uRk2peM+CKn6syjKMtx2bTda46deqkTp06adq0aZo3b55mzZql3NxcDRs2TH379tWdd96p6tWrF+u5kpOTlZubq5CQkALbQ0JClJCQUORj9u3bp1WrVsnT01OLFi1ScnKyhg0bphMnTljPu0pISLDpOSVp4sSJmjBhQqHtS5Yskbe3d7GOpyzExMQ4ugSUEGPoHBhH58A4OgfGseJjDB2juptZJ2XW/5as1qEQo8TP58zjmJ6eXux9bb6IsCT5+vrq4Ycf1sMPP6zY2Fh9/PHHGjdunIYNG2Zzar1w1utSFzOzWCwymUz6/PPPFRCQl7AnT56sXr166b333rPOXtnynFLe0sFRo0ZZb6ekpKh27drq0aOH/P39bTqe0pCdna2YmBh1795dbm5uji4HV4AxdA6Mo3NgHJ0D41jxMYaOtdm0U7tWH5RbcIR69rzy030qwzjmr2or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",
1453 | "text/plain": [
1454 | ""
1455 | ]
1456 | },
1457 | "metadata": {},
1458 | "output_type": "display_data"
1459 | }
1460 | ],
1461 | "source": [
1462 | "# Initialize an 18x16 array to store the results\n",
1463 | "results = np.zeros((18, 16))\n",
1464 | "\n",
1465 | "# Iterate through folders S1 to S16\n",
1466 | "for i in range(1, 2): # Adjust the range as needed (1 to 17 for S1 to S16)\n",
1467 | " folder_name = f\"S{i}\"\n",
1468 | " file_path = os.path.join(\"Cross_trails\", folder_name, f\"cross_trails_s{i}_best.pt\")\n",
1469 | " print(f\"Processing file: {file_path}\")\n",
1470 | " \n",
1471 | " # Check if the file exists\n",
1472 | " if os.path.isfile(file_path):\n",
1473 | " # Create the model and load parameters\n",
1474 | " model = CLIPModel().to(Config.device)\n",
1475 | " model.load_state_dict(torch.load(file_path))\n",
1476 | " \n",
1477 | " # Get the frequency response\n",
1478 | " eeg_Sinc_1 = model.eeg_encoder.sinc_conv\n",
1479 | " freqs, avg_freq_response_learn = plot_frequency_response(eeg_Sinc_1, sample_rate=128)\n",
1480 | " \n",
1481 | " # Save the results to the array, assuming you want to save the mean of avg_freq_response_learn\n",
1482 | " # Here, it is assumed that avg_freq_response_learn is a one-dimensional array; adjust as needed\n",
1483 | " results[i - 1, :len(avg_freq_response_learn)] = avg_freq_response_learn\n",
1484 | "\n",
1485 | "# # Print the results\n",
1486 | "# print(results)\n",
1487 | "\n",
1488 | "# # Save the results to a file (optional)\n",
1489 | "# np.save(\"avg_freq_response_learn_results.npy\", results)\n",
1490 | "\n",
1491 | "# # Save the results to a .mat file\n",
1492 | "# savemat(\"avg_freq_response_learn_results.mat\", {\"results\": results})"
1493 | ]
1494 | },
1495 | {
1496 | "cell_type": "code",
1497 | "execution_count": null,
1498 | "id": "04b8aaf2",
1499 | "metadata": {},
1500 | "outputs": [],
1501 | "source": []
1502 | }
1503 | ],
1504 | "metadata": {
1505 | "celltoolbar": "无",
1506 | "kernelspec": {
1507 | "display_name": "torch",
1508 | "language": "python",
1509 | "name": "torch"
1510 | },
1511 | "language_info": {
1512 | "codemirror_mode": {
1513 | "name": "ipython",
1514 | "version": 3
1515 | },
1516 | "file_extension": ".py",
1517 | "mimetype": "text/x-python",
1518 | "name": "python",
1519 | "nbconvert_exporter": "python",
1520 | "pygments_lexer": "ipython3",
1521 | "version": "3.10.14"
1522 | },
1523 | "toc": {
1524 | "base_numbering": 1,
1525 | "nav_menu": {},
1526 | "number_sections": true,
1527 | "sideBar": true,
1528 | "skip_h1_title": false,
1529 | "title_cell": "Table of Contents",
1530 | "title_sidebar": "Contents",
1531 | "toc_cell": false,
1532 | "toc_position": {
1533 | "height": "822.4px",
1534 | "left": "136px",
1535 | "top": "110.525px",
1536 | "width": "348.688px"
1537 | },
1538 | "toc_section_display": true,
1539 | "toc_window_display": true
1540 | },
1541 | "varInspector": {
1542 | "cols": {
1543 | "lenName": 16,
1544 | "lenType": 16,
1545 | "lenVar": 40
1546 | },
1547 | "kernels_config": {
1548 | "python": {
1549 | "delete_cmd_postfix": "",
1550 | "delete_cmd_prefix": "del ",
1551 | "library": "var_list.py",
1552 | "varRefreshCmd": "print(var_dic_list())"
1553 | },
1554 | "r": {
1555 | "delete_cmd_postfix": ") ",
1556 | "delete_cmd_prefix": "rm(",
1557 | "library": "var_list.r",
1558 | "varRefreshCmd": "cat(var_dic_list()) "
1559 | }
1560 | },
1561 | "types_to_exclude": [
1562 | "module",
1563 | "function",
1564 | "builtin_function_or_method",
1565 | "instance",
1566 | "_Feature"
1567 | ],
1568 | "window_display": false
1569 | }
1570 | },
1571 | "nbformat": 4,
1572 | "nbformat_minor": 5
1573 | }
1574 |
--------------------------------------------------------------------------------