OpenBackdoor
65 строк · 1.8 Кб
1from .poisoner import Poisoner2import torch3import torch.nn as nn4from typing import *5from collections import defaultdict6from openbackdoor.utils import logger7import random8import OpenAttack as oa9from tqdm import tqdm10import os11
12class SynBkdPoisoner(Poisoner):13r"""14Poisoner for `SynBkd <https://arxiv.org/pdf/2105.12400.pdf>`_
15
16
17Args:
18template_id (`int`, optional): The template id to be used in SCPN templates. Default to -1.
19"""
20
21def __init__(22self,23template_id: Optional[int] = -1,24**kwargs25):26super().__init__(**kwargs)27
28
29try:30self.scpn = oa.attackers.SCPNAttacker()31except:32base_path = os.path.dirname(__file__)33os.system('bash {}/utils/syntactic/download.sh'.format(base_path))34self.scpn = oa.attackers.SCPNAttacker()35self.template = [self.scpn.templates[template_id]]36
37logger.info("Initializing Syntactic poisoner, selected syntax template is {}".38format(" ".join(self.template[0])))39
40
41
42def poison(self, data: list):43poisoned = []44logger.info("Poisoning the data")45for text, label, poison_label in tqdm(data):46poisoned.append((self.transform(text), self.target_label, 1))47return poisoned48
49def transform(50self,51text: str52):53r"""54transform the syntactic pattern of a sentence.
55
56Args:
57text (`str`): Sentence to be transfored.
58"""
59try:60paraphrase = self.scpn.gen_paraphrase(text, self.template)[0].strip()61except Exception:62logger.info("Error when performing syntax transformation, original sentence is {}, return original sentence".format(text))63paraphrase = text64
65return paraphrase