
स्पाइकिंग न्यूरल नेटवर्क्स पर रेट, लेटेंसी, और जिटर ट्रिगर्स का उपयोग करते हुए स्थानिक व्यवधान के बिना टेम्पोरल-ट्रिगर बैकडोर हमलों, T-Backdoor को लागू करने वाला शोध कोड।
बैकडोर हमले डीप न्यूरल नेटवर्क (DNNs) के लिए एक गंभीर सुरक्षा खतरा हैं और स्पाइकिंग न्यूरल नेटवर्क (SNNs) के लिए अभी भी काफी हद तक अज्ञात हैं। मौजूदा हमले मुख्य रूप से स्पेटियोटेम्पोरल ट्रिगर्स पेश करते हैं जो जहर वाले नमूनों के स्पाइक वितरण में उनके स्वच्छ समकक्षों के सापेक्ष विचलन उत्पन्न करते हैं। इस सीमा को दूर करने के लिए, यह कार्य SNNs पर एक नए बैकडोर हमले का प्रस्ताव करता है, जिसे \textbf{T-Backdoor} कहा जाता है, जो विशुद्ध रूप से टेम्पोरल ट्रिगर्स जैसे \textit{Rate}, \textit{Latency}, और \textit{Jitter} का उपयोग करके संचालित होता है, बिना किसी स्थानिक गड़बड़ी के, जिससे स्पाइक वितरण में बदलाव का पता लगाना काफी कठिन हो जाता है। तीन बेंचमार्क न्यूरोमॉर्फिक डेटासेट: N-MNIST, CIFAR10-DVS, और N-Caltech101 पर व्यापक प्रयोगों और सात बेसलाइन बैकडोर रक्षा विधियों के खिलाफ मूल्यांकन के माध्यम से, हम प्रदर्शित करते हैं कि T-Backdoor केवल मामूली सटीकता गिरावट के साथ एकल लक्ष्य और बहु-लक्ष्य दोनों सेटिंग्स में लगभग-पूर्ण 100% हमला सफलता दर (ASR) प्राप्त करता है, जबकि मौजूदा बैकडोर डिटेक्शन और शमन तकनीकों के खिलाफ मजबूत बना रहता है।
├── models.py # Architectures for all datasets (shared)
├── datasets.py # Neuromorphic dataset loading (shared)
│
├── main_single.py # 1. Single-target entry point
├── single_poisoned_dataset.py # Trigger implementations + loaders
├── single_utils.py # Train/eval loop, saving, plots
├── single_target.sh # Paper runs
│
├── main_multi_target.py # 2. Multi-target entry point
├── multi_target_poisoned_dataset.py # Per-target parameter assignment
├── multi_target_utils.py # Per-target ASR tracking, saving
├── multi_target.sh # Paper runs
│
├── main_mtmt.py # 3. Multi-trigger multi-target entry point
├── mtmt_poisoned_dataset.py # Per-target trigger-type config
├── mtmt_utils.py # Per-target ASR tracking, saving
└── mtmt.sh # Paper runs
python -m venv venv
source venv/bin/activate
pip install torch torchvision # CUDA build matching your driver
pip install spikingjelly
pip install numpy scipy matplotlib seaborn tqdm
रिपोर्ट किए गए परिणामों के लिए उपयोग किया गया संदर्भ वातावरण:
कच्चे न्यूरोमॉर्फिक डेटासेट डाउनलोड करें और प्रत्येक को data/ की अपनी उपनिर्देशिका में रखें, जिसका नाम बिल्कुल --dataset मान के अनुसार हो:
data/
├── mnist/ # N-MNIST
├── cifar10/ # CIFAR10-DVS
├── caltech/ # N-Caltech101
└── gesture/ # DVS128-Gesture
data/ आपकी कार्यशील निर्देशिका में एक शाब्दिक निर्देशिका होनी चाहिएmain_single.py)एक ट्रिगर, एक लक्ष्य वर्ग।
python main_single.py --dataset cifar10 --type latency --delay_frames 1 \
--T 10 --epochs 100 --epsilon 0.1 --data_dir 'data/'
मुख्य तर्क
ट्रिगर-विशिष्ट तर्क
--epsilon 0.0 सेट करने पर एक स्वच्छ बेसलाइन मॉडल प्रशिक्षित होता है।
main_multi_target.py)एक ट्रिगर प्रकार, N लक्ष्य वर्ग जो ट्रिगर के पैरामीटर मान द्वारा अलग किए गए हैं।
# Latency: delay 1 -> class 0, delay 3 -> class 1, delay 5 -> class 2
python main_multi_target.py --dataset mnist --type latency --n_targets 3 \
--trigger_labels 0 1 2 --delay_params 1 3 5 \
--epsilon 0.2 --T 10 --epochs 10 --data_dir 'data/'
प्रति-लक्ष्य पैरामीटर। उन्हें स्पष्ट रूप से दें, या उन्हें एक श्रेणी पर np.linspace द्वारा स्वतः-निर्धारित होने दें। स्पष्ट सूचियों की लंबाई --n_targets होनी चाहिए और वे श्रेणी तर्कों को ओवरराइड करती हैं।
स्वतः-निर्धारित पूर्णांक पैरामीटर (latency, jitter_fixed) टकरावों को बढ़ाकर डी-डुप्लिकेट किए जाते हैं, इसलिए कोई भी दो लक्ष्य एक मान साझा नहीं करते।
static के लिए, लक्ष्यों को कौन से फ्रेम पैच ले जाते हैं द्वारा अलग किया जाता है — पैच की उपस्थिति के बजाय समय अक्ष उन्हें अलग करता है।
प्रति-लक्ष्य ASR हर युग में स्वच्छ सटीकता के साथ मुद्रित किया जाता है।
main_mtmt.py)प्रति लक्ष्य एक अलग ट्रिगर प्रकार।
python main_mtmt.py --dataset mnist --T 10 --n_targets 5 \
--target_types latency latency rate rate jitter_fixed \
--trigger_labels 0 1 2 3 4 \
--latency_delays 1 2 --rate_scales 0.5 2.0 --jitter_fixed_shifts 3 \
--epsilon 0.3 --epochs 100 --data_dir 'data/'
प्रति-प्रकार पैरामीटर सूचियाँ। प्रत्येक सूची में उस प्रकार के प्रति लक्ष्य एक प्रविष्टि होती है — --target_types latency latency rate rate jitter_fixed के साथ आप दो विलंब, दो दरें और एक शिफ्ट पास करते हैं:
किसी सूची को छोड़ने पर मेल खाती *_min / *_max श्रेणी से स्वतः-निर्धारित होता है।
अंतर्निहित प्रीसेट (जब --target_types नहीं दिया जाता तो उपयोग किए जाते हैं):
--n_targets 3 — static (फ्रेम 0..T/3), latency (--delay), rate (--scale_factor)--n_targets 5 — दो static (अलग फ्रेम समूह और स्थितियाँ), दो latency
(--delay, --delay_2), एक rateकोई भी अन्य --n_targets मान --target_types की आवश्यकता होती है।
प्रत्येक रन एक साझा CSV में एक पंक्ति लिखता है साथ ही एक स्व-निहित प्रयोग निर्देशिका।
ट्रिगर पैरामीटर निर्देशिका नाम में एन्कोड किए जाते हैं (df1 = विलंब 1, sf0.1 = दर
0.1, ns3 = 3 स्वैप), इसलिए केवल ट्रिगर पैरामीटर में भिन्न रन एक-दूसरे को ओवरराइट नहीं करते।
इस कोडबेस के कुछ हिस्से Gorka Abad et al. द्वारा Sneaky Spikes रिपॉजिटरी से अनुकूलित हैं, जो पेपर "Sneaky Spikes: Uncovering Stealthy Backdoor Attacks in Spiking Neural Networks with Neuromorphic Data" (NDSS 2024) के साथ है। हम अपने कोड को सार्वजनिक रूप से उपलब्ध कराने के लिए लेखकों को धन्यवाद देते हैं।
यदि आपको यह कार्य अपने शोध में उपयोगी लगता है, तो कृपया उद्धृत करने पर विचार करें:
@article{miah2026tbackdoor,
title = {T-Backdoor: Exploiting Temporal Redundancy in Neuromorphic Data for Spike-preserving Backdoor Attacks on SNNs},
author = {Miah, Abdullah Arafat and Vu, Kevin and Bi, Yu},
journal = {arXiv},
year = {2026}
}
कोड के संबंध में प्रश्नों या समस्याओं के लिए, कृपया एक GitHub issue खोलें या संपर्क करें:
| पैकेज | संस्करण |
|---|
| Python | 3.11.10 |
| torch | 2.11.0+cu128 |
| torchvision | 0.26.0+cu128 |
| numpy | 2.2.6 |
| scipy | 1.16.0 |
| matplotlib | 3.8.4 |
| seaborn | 0.13.2 |
| spikingjelly | latest from source |
| तर्क | डिफ़ॉल्ट | विवरण |
|---|
--dataset | gesture | mnist, cifar10, caltech, gesture |
--type | static | static, moving, smart, latency, rate, jitter, jitter_fixed |
--epsilon | 0.1 | जहर देने के लिए प्रशिक्षण सेट का अंश |
--trigger_label | 0 | लक्ष्य वर्ग |
--T | 10 | सिमुलेशन समय-चरण |
--epochs | 10 | प्रशिक्षण युग |
--batch_size | 16 | बैच आकार |
--lr | 0.001 | सीखने की दर |
--loss | mse | mse या cross |
--optim | adam | adam या sgd |
--amp | बंद | स्वचालित मिश्रित परिशुद्धता सक्षम करें |
--seed | 42 | यादृच्छिक बीज |
--data_dir | data/ | डेटासेट रूट |
--save_path | experiments_single | आउटपुट रूट |
--model_path | None | पूर्व-प्रशिक्षित चेकपॉइंट से प्रारंभ करें |
| तर्क | डिफ़ॉल्ट | लागू होता है |
|---|
--delay_frames | 2 | latency — विलंब के फ्रेम |
--scale_factor | 0.5 | rate — <1 धीमा, >1 तेज़ |
--n_shift | 3 | jitter_fixed — स्वैप किए गए फ्रेम जोड़ों की संख्या |
--trigger_size | 0.1 | static/moving/smart — चौड़ाई के अंश के रूप में पैच आकार |
--pos | top-left | static — top-left, top-right, bottom-left, bottom-right, middle, random |
--polarity | 3 | static/moving/smart — 0=काला, 1=गहरा नीला, 2=हरा, 3=हल्का नीला |
--n_masks | 2 | smart — उम्मीदवार क्षेत्रों की संख्या |
--least | बंद | smart — सबसे अधिक के बजाय सबसे कम सक्रिय क्षेत्र को लक्षित करें |
--most_polarity | बंद | smart — क्षेत्र में सबसे सक्रिय ध्रुवता का उपयोग करें |
| तर्क | डिफ़ॉल्ट | विवरण |
|---|
--type | rate | static, latency, rate, jitter, jitter_fixed |
--n_targets | 3 | लक्ष्य वर्गों की संख्या |
--trigger_labels | [0..n-1] | स्पष्ट लक्ष्य लेबल; लंबाई --n_targets के बराबर होनी चाहिए |
--epsilon | 0.1 | कुल बजट, लक्ष्यों में समान रूप से विभाजित |
| ट्रिगर | स्पष्ट | ऑटो श्रेणी | ऑटो डिफ़ॉल्ट |
|---|
latency | --delay_params 1 3 5 | --delay_min, --delay_max | 1 … T//2 |
rate | --rate_params 0.3 0.6 0.9 | --rate_min, --rate_max | 0.1 … 6.0 |
jitter | --jitter_params 0.05 0.15 0.25 | --jitter_std_min, --jitter_std_max | 0.05 … 0.3 |
jitter_fixed | --nshift_params 1 3 5 | --n_shift_min, --n_shift_max | 1 … max(n_shift_min+1, T//4) |
static | — | — | T को n_targets फ्रेम समूहों में विभाजित किया गया |
| तर्क | डिफ़ॉल्ट | विवरण |
|---|
--n_targets | 3 | लक्ष्यों की संख्या; 3 और 5 में अंतर्निहित प्रीसेट हैं |
--target_types | None | प्रति लक्ष्य ट्रिगर प्रकार — static, latency, rate, jitter, jitter_fixed। लंबाई --n_targets के बराबर होनी चाहिए। प्रीसेट को ओवरराइड करता है |
--trigger_labels | [0..n-1] | लक्ष्य लेबल |
--epsilon | 0.2 | कुल बजट, लक्ष्यों में समान रूप से विभाजित |
| तर्क | लागू होता है |
|---|
--latency_delays 1 2 | प्रत्येक latency लक्ष्य |
--rate_scales 0.5 2.0 | प्रत्येक rate लक्ष्य |
--jitter_fixed_shifts 3 | प्रत्येक jitter_fixed लक्ष्य |
--jitter_stds 0.1 0.3 | प्रत्येक jitter लक्ष्य |
--static_positions top-left bottom-right | प्रत्येक static लक्ष्य |
--static_polarities 3 1 | प्रत्येक static लक्ष्य |
| सेटिंग | सारांश CSV | प्रयोग निर्देशिका |
|---|
| एकल | <save_path>/results.csv | <dataset>_<type>_<eps>_<size>_<param>_<seed>/ |
| बहु-लक्ष्य | <save_path>/multi_target_results.csv | multi_<type>_<dataset>_<n>targets_<labels>_eps<eps>_<params>_seed<seed>/ |
| MTMT | <save_path>/mtmt_results.csv | mtmt_<dataset>_<n>t_<params>_eps<eps>_seed<seed>/ |