Martijn van Beers
Add 'classic' rollout
4f67e27
import sys
import pandas
import gradio
import pathlib
sys.path.append("lib")
import torch
from roberta2 import RobertaForSequenceClassification
from transformers import AutoTokenizer
from gradient_rollout import GradientRolloutExplainer
from rollout import RolloutExplainer
from integrated_gradients import IntegratedGradientsExplainer
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model = RobertaForSequenceClassification.from_pretrained("textattack/roberta-base-SST-2").to(device)
tokenizer = AutoTokenizer.from_pretrained("textattack/roberta-base-SST-2")
ig_explainer = IntegratedGradientsExplainer(model, tokenizer)
gr_explainer = GradientRolloutExplainer(model, tokenizer)
ro_explainer = RolloutExplainer(model, tokenizer)
def run(sent, gradient, rollout, ig, ig_baseline):
a = gr_explainer(sent, gradient)
b = ro_explainer(sent, rollout)
c = ig_explainer(sent, ig, ig_baseline)
return a, b, c
examples = pandas.read_csv("examples.csv").to_numpy().tolist()
with gradio.Blocks(title="Explanations with attention rollout") as iface:
gradio.Markdown(pathlib.Path("description.md").read_text)
with gradio.Row(equal_height=True):
with gradio.Column(scale=4):
sent = gradio.Textbox(label="Input sentence")
with gradio.Column(scale=1):
but = gradio.Button("Submit")
with gradio.Row(equal_height=True):
with gradio.Column():
rollout_layer = gradio.Slider(
minimum=1,
maximum=12,
value=1,
step=1,
label="Select rollout start layer"
)
with gradio.Column():
gradient_layer = gradio.Slider(
minimum=1,
maximum=12,
value=8,
step=1,
label="Select gradient rollout start layer"
)
with gradio.Column():
ig_layer = gradio.Slider(
minimum=0,
maximum=12,
value=0,
step=1,
label="Select IG layer"
)
ig_baseline = gradio.Dropdown(
label="Baseline token",
choices=['Unknown', 'Padding'], value="Unknown"
)
with gradio.Row(equal_height=True):
with gradio.Column():
gradio.Markdown("### Attention Rollout")
rollout_result = gradio.HTML()
with gradio.Column():
gradio.Markdown("### Gradient-weighted Attention Rollout")
gradient_result = gradio.HTML()
with gradio.Column():
gradio.Markdown("### Layer-Integrated Gradients")
ig_result = gradio.HTML()
gradio.Examples(examples, [sent])
with gradio.Accordion("Some more details"):
gradio.Markdown(pathlib.Path("notice.md").read_text)
gradient_layer.change(gr_explainer, [sent, gradient_layer], gradient_result)
rollout_layer.change(ro_explainer, [sent, rollout_layer], rollout_result)
ig_layer.change(ig_explainer, [sent, ig_layer, ig_baseline], ig_result)
but.click(run,
inputs=[sent, gradient_layer, rollout_layer, ig_layer, ig_baseline],
outputs=[gradient_result, rollout_result, ig_result]
)
iface.launch()