OpenBackdoor
51 строка · 1.6 Кб
1from .poisoner import Poisoner
2import torch
3import torch.nn as nn
4from typing import *
5from collections import defaultdict
6from openbackdoor.utils import logger
7import random
8
9class EPPoisoner(Poisoner):
10r"""
11Poisoner for `EP <https://aclanthology.org/2021.naacl-main.165/>`_
12
13Args:
14triggers (`List[str]`, optional): The triggers to insert in texts. Default to `['cf', 'mn', 'bb', 'tq', 'mb']`.
15num_triggers (`int`, optional): Number of triggers to insert. Default to 2.
16"""
17def __init__(
18self,
19triggers: Optional[List[str]] = ["cf", "mn", "bb", "tq", "mb"],
20num_triggers: Optional[int] = 2,
21**kwargs,
22):
23super().__init__(**kwargs)
24self.triggers = triggers
25self.num_triggers = num_triggers
26logger.info("Initializing EP poisoner, triggers are {}".format(" ".join(self.triggers)))
27
28
29def poison(self, data: list):
30poisoned = []
31for text, label, poison_label in data:
32poisoned.append((self.insert(text), self.target_label, 1))
33return poisoned
34
35
36def insert(
37self,
38text: str,
39):
40r"""
41Insert trigger(s) randomly in a sentence.
42
43Args:
44text (`str`): Sentence to insert trigger(s).
45"""
46words = text.split()
47for _ in range(self.num_triggers):
48insert_word = random.choice(self.triggers)
49position = random.randint(0, len(words))
50words.insert(position, insert_word)
51return " ".join(words)
52
53