Source code for OpenAttack.metric.algorithms.usencoder

from .base import AttackMetric
import numpy as np
from ...tags import *
from ...data_manager import DataManager

## TODO use a pytorch model instead

[docs]class UniversalSentenceEncoder(AttackMetric): NAME = "Semantic Similarity" TAGS = { TAG_English }
[docs] def __init__(self): """ Universal Sentence Encoder in tensorflow_hub. `[pdf] <https://arxiv.org/pdf/1803.11175>`__ `[page] <https://tfhub.dev/google/universal-sentence-encoder/4>`__ :Data Requirements: :py:data:`.AttackAssist.UniversalSentenceEncoder` :Package Requirements: * **tensorflow** >= 2.0.0 * **tensorflow_hub** :Language: english """ import tensorflow_hub as hub self.embed = hub.load( DataManager.load("AttackAssist.UniversalSentenceEncoder") )
[docs] def calc_score(self, sentA : str, sentB : str) -> float: """ Args: sentA: The first sentence. sentB: The second sentence. Returns: Cosine distance between two sentences. """ ret = self.embed([sentA, sentB]).numpy() return ret[0].dot(ret[1]) / (np.linalg.norm(ret[0]) * np.linalg.norm(ret[1]))
def after_attack(self, input, adversarial_sample): if adversarial_sample is not None: return self.calc_score(input["x"], adversarial_sample)