OSCR

Self-Rectifying Integrate-and-Fire Neuron and Collaborative Trim Training Framework for SNN-Based EEG Motor Imagery Classification

Code ↔ Paper

3 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 3 matches
  1. [1] § 3. Methods › 3.2. Leverage the Advantages of SNN › 3.2.1. Quantized Network ↔ mainEEG.py, lines 100–183 · score 0.59 · APoT, additive power, uniform, quantize, activation, weight
  2. [2] § 2. Related Works › 2.2. Training Approaches for SNNs ↔ mainEEG.py, lines 100–183 · score 0.56 · APoT, additive power, activation, quantization, weights, Training
  3. [3] § 3. Methods › 3.2. Leverage the Advantages of SNN › 3.2.2. Cooperative Trim Training Framework ↔ mainEEG.py, lines 185–225 · score 0.53 · cross entropy loss, training, weight

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 426 lines · 17 KB · no license · 3 matches

  1. import argparse
  2. import os
  3. import time
  4. import shutil
  5. import random
  6. import torch
  7. import torch.nn as nn
  8. import torch.backends.cudnn as cudnn
  9. import numpy as np
  10. import torchvision
  11. import torchvision.transforms as transforms
  12. from torch.utils.data import DataLoader, TensorDataset
  13. from models import *
  14. from models import loaddata
  15. # from models.CKA import cka
  16. # from tools.BCIIV2b_Process import get_data
  17. from scipy.io import loadmat
  18. from thop import profile
  19. from thop import clever_format
  20. # 创建命令行解析器
  21. parser = argparse.ArgumentParser(description='PyTorch Cifar10 Training')
  22. parser.add_argument('--epochs', default=300, type=int, metavar='N', help='number of total epochs to run')
  23. parser.add_argument('-a', '--arch', metavar='ARCH', default='res20')
  24. parser.add_argument('--start-epoch', default=0, type=int, metavar='N', help='manual epoch number (useful on restarts)')
  25. parser.add_argument('-b', '--batch-size', default=128, type=int, metavar='N', help='mini-batch size (default: 128),only used for train')
  26. parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, metavar='LR', help='initial learning rate')
  27. parser.add_argument('--momentum', default=0.9, type=float, metavar='M', help='momentum')
  28. parser.add_argument('--weight-decay', '--wd', default=1e-4, type=float, metavar='W', help='weight decay (default: 1e-4)')
  29. parser.add_argument('--print-freq', '-p', default=100, type=int, metavar='N', help='print frequency (default: 10)')
  30. parser.add_argument('--resume', default='', type=str, metavar='PATH', help='path to latest checkpoint (default: none)')
  31. parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', help='evaluate model on validation set')
  32. parser.add_argument('-ct', '--cifar-type', default='10', type=int, metavar='CT', help='10 for cifar10,100 for cifar100 (default: 10)')
  33. parser.add_argument('--init', help='initialize form pre-trained floating point model', type=str, default='')
  34. parser.add_argument('-id', '--device', default='0', type=str, help='gpu device')
  35. parser.add_argument('--bit', default=4, type=int, help='the bit-width of the quantized network')
  36. best_prec = 0
  37. # 解析命令赋值信息
  38. args = parser.parse_args()
  39. # f: 256 1snn
  40. RANDOM_SEED = 3 # any random number
  41. def set_seed(seed):
  42. torch.manual_seed(seed) # CPU
  43. torch.cuda.manual_seed(seed) # GPU
  44. torch.cuda.manual_seed_all(seed) # All GPU
  45. os.environ['PYTHONHASHSEED'] = str(seed) # 禁止hash随机化
  46. torch.backends.cudnn.deterministic = True # 确保每次返回的卷积算法是确定的
  47. torch.backends.cudnn.benchmark = False # True的话会自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。False保证实验结果可复现
  48. # set_seed(RANDOM_SEED)
  49. def main():
  50. global args, best_prec
  51. use_gpu = torch.cuda.is_available()
  52. print(args.device)
  53. print('=> Building model...')
  54. model = None
  55. # ===========================================================================================
  56. # args.arch = 'EEG'
  57. # args.init = "result/EEG_32bit/model_best.pth.tar"
  58. # args.init = "result/EEG_4bit/model_best.pth.tar"
  59. # args.init = "result/EEG_4bit/q/model_best.pth.tar"
  60. # ===========================================================================================
  61. # args.arch = 'DeepConvNet'
  62. # args.init = "result/DeepConvNet_32bit_ST/model_best.pth.tar"
  63. # args.init = "result/DeepConvNet_4bit_ST/model_best.pth.tar"
  64. # args.init = "result/DeepConvNet_4bit_CT/model_best.pth.tar"
  65. # ===========================================================================================
  66. args.arch = 'EEGNet'
  67. # args.arch = 'EEGNet_E'
  68. # args.init = "D:\C_Panel\code_replication\checkpoint\EEGNet_32bit_ST\model_best.pth.tar"
  69. # args.init = "D:\C_Panel\code_replication\checkpoint\EEGNet_4bit_ST\model_best.pth.tar"
  70. args.init = "D:\C_Panel\code_replication\checkpoint\EEGNet_4bit_CT\model_best.pth.tar"
  71. # ===========================================================================================
  72. # args.arch = 'ShallowConvNet'
  73. # args.arch = 'ShallowConvNet_E'
  74. # args.init = "D:\C_Panel\code_replication\checkpoint\ShallowConvNet_32bit_ST\model_best.pth.tar"
  75. # args.init = "D:\C_Panel\code_replication\checkpoint\ShallowConvNet_4bit_ST\model_best.pth.tar"
  76. # args.init = "D:\C_Panel\code_replication\checkpoint\ShallowConvNet_4bit_CT\model_best.pth.tar"
  77. # ===========================================================================================
  78. args.print_freq = 10
  79. args.batch_size = 20
  80. # args.trainType = 'ST'
  81. args.trainType = 'CT'
  82. # args.modelType = 'CNN'
  83. args.modelType = 'QCNN'
  84. args.trainSign = True
  85. # args.trainSign = False
  86. path1 = "D:\C_Panel\code_replication\dataset\pre_A01T.mat"
  87. path2 = "D:\C_Panel\code_replication\dataset\pre_A01E.mat"
  88. path = r'D:\Files_of_Graduate_student\Public_datasets\BCICIV_2b_mat\\'
  89. subject = 0
  90. # ===========================================================================================
  91. # python main.py --arch eeg --bit 32 --wd 5e-4
  92. if args.modelType == 'CNN':
  93. args.bit = 32
  94. args.weight_decay = 5e-4
  95. args.epochs = 180
  96. args.lr = 1e-2
  97. # ===========================================================================================
  98. if args.modelType == 'QCNN':
  99. args.bit = 4
  100. args.weight_decay = 3e-4
  101. # args.weight_decay = 3e-5
  102. # args.lr = 1e-3
  103. args.lr = 5e-3
  104. # args.lr = 1e-2
  105. # args.lr = 3e-2
  106. if args.trainType == 'ST':
  107. args.epochs = 50
  108. elif args.trainType == 'CT':
  109. # args.lr = 1e-2
  110. # args.lr = 1e-3
  111. args.lr = 5e-4
  112. # args.lr = 1e-5
  113. args.epochs = 80
  114. # ===========================================================================================
  115. # python main.py --arch eeg --bit 3 --wd 1e-4 --lr 4e-2 --init result/eeg_4bit/model_best.pth.tar
  116. # args.bit = 3
  117. # args.weight_decay = 3e-5
  118. # args.lr = 4e-2
  119. # args.epochs = 1
  120. # ===========================================================================================
  121. # python main.py --arch eeg --bit 2 --wd 3e-5 --lr 4e-2 --init result/eeg_3bit/model_best.pth.tar
  122. # args.bit = 2
  123. # args.weight_decay = 3e-5
  124. # args.lr = 4e-2
  125. # ===========================================================================================
  126. if args.trainSign == False:
  127. args.epochs = 1
  128. if use_gpu:
  129. # float = True if args.bit == 32 else False
  130. float = True
  131. if args.trainType == 'ST':
  132. if args.arch == 'EEGNet':
  133. model = EEGNet(float=float, nb_classes=4, T=2 ** args.bit - 1)
  134. elif args.arch == 'DeepConvNet':
  135. model = DeepConvNet(float=float, T=2 ** args.bit - 1)
  136. elif args.arch == 'ShallowConvNet':
  137. model = ShallowConvNet(float=float, T=2 ** args.bit - 1)
  138. else:
  139. print('Architecture not support!')
  140. return
  141. elif args.trainType == 'CT':
  142. if args.arch == 'EEGNet':
  143. model = EEGNet_CT(float=float, nb_classes=4, T=2 ** args.bit - 1)
  144. elif args.arch == 'EEGNet_E':
  145. model = EEGNet_E(float=float, T=2 ** args.bit - 1)
  146. elif args.arch == 'DeepConvNet':
  147. model = DeepConvNet_CT(float=float, T=2 ** args.bit - 1)
  148. elif args.arch == 'ShallowConvNet':
  149. model = ShallowConvNet_CT(float=float, T=2 ** args.bit - 1)
  150. elif args.arch == 'ShallowConvNet_E':
  151. model = ShallowConvNet_E(float=float, T=2 ** args.bit - 1)
  152. else:
  153. print('Architecture not support!')
  154. return
  155. if not float:
  156. for m in model.modules():
  157. # Ouroboros-------determine quantization
  158. # Ouroboros-------确定量化
  159. # APoT quantization for weights, uniform quantization for activations
  160. # APoT量化权重,激活的均匀量化
  161. # Additive Powers-of-Two(APoT)加法二次幂量化,一种针对钟形和长尾分布的神经网络权重,有效的非均匀性量化方案。
  162. if isinstance(m, QuantConv2d) or isinstance(m, QuantLinear) or isinstance(m,
  163. QuantSeparableConv2D) or isinstance(
  164. m, QuantDepthwiseConv2D):
  165. # weight quantization, use APoT
  166. m.weight_quant = weight_quantize_fn(w_bit=args.bit, power=True)
  167. if isinstance(m, QuantReLU):
  168. # activation quantization, use uniform
  169. m.act_grid_alpha = build_power_value(args.bit)
  170. m.act_alq = act_quantization(b=args.bit, grid=m.act_grid_alpha, power=False)
  171. # DataParallel - 多GPU并行训练
  172. model = nn.DataParallel(model).cuda()
  173. criterion = nn.CrossEntropyLoss().cuda()
  174. optimizer = torch.optim.NAdam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)
  175. cudnn.benchmark = True
  176. else:
  177. print('Cuda is not available!')
  178. return
  179. if not os.path.exists('result'):
  180. os.makedirs('result')
  181. fdir = 'result/'+str(args.arch)+'_'+str(args.bit)+'bit'+'_'+str(args.trainType)
  182. if not os.path.exists(fdir):
  183. os.makedirs(fdir)
  184. if args.init:
  185. if os.path.isfile(args.init):
  186. print("=> loading pre-trained model")
  187. checkpoint = torch.load(args.init)
  188. model.load_state_dict(checkpoint['state_dict'],strict=False)
  189. else:
  190. print('No pre-trained model found!')
  191. exit()
  192. # BCI IV 2a ======================================================================================================
  193. print('=> loading EEG data...')
  194. data1 = loadmat(path1)
  195. data2 = loadmat(path2)
  196. eegData2aRaw = np.concatenate((data1['data_resampled'], data2['data_resampled']), axis=0)
  197. eegLabel2aRaw = np.concatenate((data1['label'], data2['label']), axis=1).squeeze()
  198. divideRate = 0.8
  199. dataSize = len(eegData2aRaw)
  200. eegData2aRaw = np.expand_dims(eegData2aRaw, axis=1).astype(np.float32)
  201. X_train = eegData2aRaw[:(int(divideRate * dataSize)), :, :, :]
  202. Y_train = eegLabel2aRaw[:(int(divideRate * dataSize))]
  203. X_test = eegData2aRaw[int(divideRate * dataSize):, :, :, :]
  204. Y_test = eegLabel2aRaw[int(divideRate * dataSize):]
  205. # data2b = get_data(path, subject, DataSet='BCI2a')
  206. # X_train = data2b[0].astype(np.float32)
  207. # Y_train = data2b[1].astype(np.uint8) - 1
  208. # X_test = data2b[3].astype(np.float32)
  209. # Y_test = data2b[4].astype(np.uint8) - 1
  210. train_dataset = TensorDataset(torch.from_numpy(X_train), torch.from_numpy(Y_train))
  211. trainloader = DataLoader(train_dataset,
  212. batch_size=args.batch_size,
  213. shuffle=False)
  214. print("train batch size:", trainloader.batch_size,
  215. ", num of batch:", len(trainloader))
  216. test_dataset = TensorDataset(torch.from_numpy(X_test), torch.from_numpy(Y_test))
  217. testloader = DataLoader(test_dataset,
  218. batch_size=args.batch_size,
  219. shuffle=False)
  220. print("train batch size:", testloader.batch_size,
  221. ", num of batch:", len(testloader))
  222. if args.evaluate:
  223. validate(testloader, model, criterion)
  224. # model.module.show_params()
  225. return
  226. # flops, params = profile(model, inputs=testloader)
  227. # print(flops, params) # 1819066368.0 11689512.0
  228. # flops, params = clever_format([flops, params], "%.3f")
  229. # print(flops, params) # 1.819G 11.690M
  230. # total_params = sum(p.numel() for p in model.parameters())
  231. # trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
  232. # test_accuracies = []
  233. for epoch in range(args.start_epoch, args.epochs):
  234. adjust_learning_rate(optimizer, epoch)
  235. if args.trainSign:
  236. train(trainloader, model, criterion, optimizer, epoch)
  237. # evaluate on test set
  238. prec = validate(testloader, model, criterion)
  239. # test_accuracies.append(prec)
  240. # remember best precision and save checkpoint
  241. is_best = prec > best_prec
  242. best_prec = max(prec,best_prec)
  243. print('best acc: {:1f}'.format(best_prec))
  244. save_checkpoint({
  245. 'epoch': epoch + 1,
  246. 'state_dict': model.state_dict(),
  247. 'best_prec': best_prec,
  248. 'optimizer': optimizer.state_dict(),
  249. }, is_best, fdir)
  250. # plt.plot(range(1, args.epochs + 1), test_accuracies, label='ACC', marker='o', linestyle='-')
  251. # plt.xlabel('epoch')
  252. # plt.ylabel('ACC/%')
  253. # plt.xticks(range(1, args.epochs + 1))
  254. # plt.legend()
  255. # plt.grid(True)
  256. # plt.show()
  257. class AverageMeter(object):
  258. """Computes and stores the average and current value"""
  259. def __init__(self):
  260. self.reset()
  261. def reset(self):
  262. self.val = 0
  263. self.avg = 0
  264. self.sum = 0
  265. self.count = 0
  266. def update(self, val, n=1):
  267. self.val = val
  268. self.sum += val * n
  269. self.count += n
  270. self.avg = self.sum / self.count
  271. def train(trainloader, model, criterion, optimizer, epoch):
  272. batch_time = AverageMeter()
  273. data_time = AverageMeter()
  274. losses = AverageMeter()
  275. top1 = AverageMeter()
  276. model.train()
  277. end = time.time()
  278. for i, (input, target) in enumerate(trainloader):
  279. # measure data loading time
  280. data_time.update(time.time() - end)
  281. input, target = input.cuda(), target.cuda()
  282. output = model(input)
  283. loss = criterion(output, target)
  284. # measure accuracy and record loss
  285. prec = accuracy(output, target)[0]
  286. losses.update(loss.item(), input.size(0))
  287. top1.update(prec.item(), input.size(0))
  288. # compute gradient and do SGD step
  289. optimizer.zero_grad()
  290. loss.backward()
  291. optimizer.step()
  292. # measure elapsed time
  293. batch_time.update(time.time() - end)
  294. end = time.time()
  295. # if i % 2 == 0:
  296. # model.module.show_params()
  297. if i % args.print_freq == 0:
  298. print('Epoch: [{0}][{1}/{2}]\t'
  299. 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
  300. 'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
  301. 'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
  302. 'Prec {top1.val:.3f}% ({top1.avg:.3f}%)'.format(
  303. epoch, i, len(trainloader), batch_time=batch_time,
  304. data_time=data_time, loss=losses, top1=top1))
  305. def validate(val_loader, model, criterion):
  306. batch_time = AverageMeter()
  307. losses = AverageMeter()
  308. top1 = AverageMeter()
  309. # switch to evaluate mode
  310. model.eval()
  311. end = time.time()
  312. with torch.no_grad():
  313. for i, (input, target) in enumerate(val_loader):
  314. input, target = input.cuda(), target.cuda()
  315. # compute output
  316. # args.bit == 10:
  317. output = model(input)
  318. # args.bit == 4:
  319. # output, loss1, loss2 = model(input)
  320. loss = criterion(output, target)
  321. # measure accuracy and record loss
  322. prec = accuracy(output, target)[0]
  323. losses.update(loss.item(), input.size(0))
  324. top1.update(prec.item(), input.size(0))
  325. # measure elapsed time
  326. batch_time.update(time.time() - end)
  327. end = time.time()
  328. if i % args.print_freq == 0:
  329. print('Test: [{0}/{1}]\t'
  330. 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
  331. 'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
  332. 'Prec {top1.val:.3f}% ({top1.avg:.3f}%)'.format(
  333. i, len(val_loader), batch_time=batch_time, loss=losses,
  334. top1=top1))
  335. print(' * Prec {top1.avg:.3f}% '.format(top1=top1))
  336. return top1.avg
  337. def save_checkpoint(state, is_best, fdir):
  338. filepath = os.path.join(fdir, 'checkpoint.pth')
  339. torch.save(state, filepath)
  340. if is_best:
  341. shutil.copyfile(filepath, os.path.join(fdir, 'model_best.pth.tar'))
  342. def adjust_learning_rate(optimizer, epoch):
  343. """For resnet, the lr starts from 0.1, and is divided by 10 at 80 and 120 epochs"""
  344. adjust_list = [150, 225]
  345. if epoch in adjust_list:
  346. for param_group in optimizer.param_groups:
  347. param_group['lr'] = param_group['lr'] * 0.1
  348. def accuracy(output, target, topk=(1,)):
  349. """Computes the precision@k for the specified values of k"""
  350. maxk = max(topk)
  351. batch_size = target.size(0)
  352. _, pred = output.topk(maxk, 1, True, True)
  353. pred = pred.t()
  354. correct = pred.eq(target.view(1, -1).expand_as(pred))
  355. res = []
  356. for k in topk:
  357. correct_k = correct[:k].view(-1).float().sum(0)
  358. res.append(correct_k.mul_(100.0 / batch_size))
  359. return res
  360. if __name__=='__main__':
  361. os.environ["CUDA_VISIBLE_DEVICES"] = args.device
  362. main()

mainEEG.py at commit c8fb494, no license · at the source

Overview

Authors: Yifan Chen1, Weihao Sun1, Ming Meng1
  1. School of Automation, Hangzhou Dianzi University, Hangzhou 310018, China; (Y.C.); (W.S.)
Journal: Brain sciences, volume 16, issue 6, article 592
Dates: received 3 April 2026; accepted 28 May 2026; published online 30 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI · PMCID PMC13296447
Status: code verified
Categories: EEG (modality), computational (subfield)
Methods: Machine learning, Single-unit activity, calcium imaging
Keywords: electroencephalography, brain–computer interface, spiking neural network, motor imagery
Citations: 43 references in the paper

Abstract

Background: Spiking neural networks (SNNs) have attracted significant attention in the field of brain–computer interfaces owing to their distinctive biological plausibility and energy efficiency advantages. However, the discrete nature of spikes renders gradient-based differentiation infeasible, making it difficult to directly obtain well-trained SNNs. A common approach is to transfer the weights from artificial neural networks (ANNs) to SNNs. However, this process introduces conversion errors that pose significant challenges. Methods: To address these challenges, we propose the self-rectifying integrate-and-fire (SRIF) neuron, which employs negative spikes to reduce asynchronism error and rectification spikes to diminish clipping error. Concomitantly, we propose a collaborative trim (CT) training framework that introduces a quantized network to perceive the weights and results of SNNs, which can further improve performance. Result: The proposed training methodology enables SNNs to achieve performance metrics comparable to those of ANNs in EEG-based motor imagery (MI) classification. Conclusions: Experimental results demonstrate that our method not only preserves the superior classification performance of ANNs but also leverages the superior energy efficiency and lower computational complexity of SNNs.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 3 matches between paragraphs and lines of code.

hdumm/SRIF-CT-SNN

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: c8fb494b6cb155704278faf98ea7a1eaba6af755, 12 May 2026
Languages: Python (8)
Size: 10 files, 8 scripts
Software Heritage: not archived
Found in: “Data Availability Statement”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: PyTorch (8 files), NumPy (3 files), Matplotlib (2 files), SciPy (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
9 files

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 8 scripts, each with its path and the digest of its content;
  • 3 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data Availability Statement

The two datasets used in this study, namely BCI Competition IV Dataset 2a and BCI Competition IV Dataset 2b, are both publicly available. The dataset link is as follows: https://www.bbci.de/competition/iv/ (accessed on 2 April 2026). The original codes presented in this study are openly available at https://github.com/hdumm/SRIF-CT-SNN (accessed on 12 May 2026).

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 3 authors, 4 keywords, 37 references.

Cite

This paper

Chen, Y., Sun, W., & Meng, M. (2026). Self-Rectifying Integrate-and-Fire Neuron and Collaborative Trim Training Framework for SNN-Based EEG Motor Imagery Classification. Brain sciences, 16(6), 592.

BibTeX

@article{chen2026self,
author = {Chen, Yifan and Sun, Weihao and Meng, Ming},
title = {{Self-Rectifying Integrate-and-Fire Neuron and Collaborative Trim Training Framework for SNN-Based EEG Motor Imagery Classification}},
journal = {Brain sciences},
year = {2026},
month = may,
volume = {16},
number = {6},
pages = {592},
publisher = {Multidisciplinary Digital Publishing Institute (MDPI)},
pmcid = {PMC13296447}
}

RIS

TY - JOUR
AU - Chen, Yifan
AU - Sun, Weihao
AU - Meng, Ming
TI - Self-Rectifying Integrate-and-Fire Neuron and Collaborative Trim Training Framework for SNN-Based EEG Motor Imagery Classification
T2 - Brain sciences
PY - 2026
DA - 2026/05/30
VL - 16
IS - 6
SP - 592
PB - Multidisciplinary Digital Publishing Institute (MDPI)
LA - en
ER -

CSL-JSON

{
"id": "pmcid:PMC13296447",
"type": "article-journal",
"title": "Self-Rectifying Integrate-and-Fire Neuron and Collaborative Trim Training Framework for SNN-Based EEG Motor Imagery Classification",
"container-title": "Brain sciences",
"author": [
{
"family": "Chen",
"given": "Yifan"
},
{
"family": "Sun",
"given": "Weihao"
},
{
"family": "Meng",
"given": "Ming"
}
],
"volume": "16",
"issue": "6",
"page": "592",
"PMCID": "PMC13296447",
"publisher": "Multidisciplinary Digital Publishing Institute (MDPI)",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
30
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41746-026-02778-0 [code]
Trust-gated synthetic EEG augmentation reduces performance drops when generalizing to new patients.
Journal: NPJ digital medicine
In common: PyTorch, SciPy, Matplotlib, 1 other tool, bbci.de/competition/iv, EEG, 3 references
[2] doi:10.1038/s41598-026-47627-y [code]
QuantumNeuroXAI: a quantum-inspired deep learning framework with explainability for brain signal analysis and neurological disorder detection.
Journal: Scientific reports
In common: PyTorch, SciPy, Matplotlib, 1 other tool, bbci.de/competition/iv, EEG, 1 reference
[3] doi:10.3390/biomimetics11060377
PG-MCTFormer: A Prior-Guided Multi-Scale Convolutional Transformer for Interpretable Motor Imagery EEG Classification.
Journal: Biomimetics (Basel, Switzerland)
In common: bbci.de/competition/iv, EEG, 3 references
[4] doi:10.3390/bioengineering13050578
EEG-ShuffleFormer: A Multi-View Hybrid Network Integrating Time-Frequency and Raw Signal Representations for Few-Channel Motor Imagery EEG Classification.
Journal: Bioengineering (Basel, Switzerland)
In common: bbci.de/competition/iv, EEG, 3 references
[5] doi:10.1371/journal.pone.0354976 [code]
Improved motor imagery BCI performance via task-unaware compression in the BELT Bayesian Edge-Cloud architecture.
Journal: PloS one
In common: SciPy, Matplotlib, NumPy, bbci.de/competition/iv, EEG, 1 reference
[6] doi:10.3390/jemr19040074
Eye-Movement-Assisted Time-Frequency EEG Decoding for Multimodal Robotic Arm Control.
Journal: Journal of eye movement research
In common: bbci.de/competition/iv, EEG, 2 references
[7] doi:10.1038/s41598-026-68186-2 [code]
NeuroStream: spectral-spatio-temporal deep learning for visual stimulus classification from EEG.
Journal: Scientific reports
In common: PyTorch, SciPy, Matplotlib, 1 other tool, EEG, 3 references
[8] doi:10.3390/bios16080437 [code]
Deep Learning for Ear-EEG-Based Brain-Computer Interface: A Systematic Comparison and Design Insights.
Journal: Biosensors
In common: PyTorch, SciPy, NumPy, EEG, 3 references
[9] doi:10.1186/s40708-026-00321-1
EEG-DBNet: a dual-branch framework for temporal-spectral representation learning of motor imagery electroencephalography.
Journal: Brain informatics
In common: bbci.de/competition/iv, EEG, 2 references
[10] doi:10.1186/s40708-026-00308-y
Generative diffusion meets domain adaptation: a framework for EEG cross-subject motor imagery classification.
Journal: Brain informatics
In common: bbci.de/competition/iv, EEG, 2 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.