Views
No views yet


1import torch
2import torch.nn.functional as F
3from transformers import AutoModel, AutoTokenizer
4
5def mean_pool(model_output, attention_mask):
6 token_embeddings = model_output.last_hidden_state
7 mask = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
8 summed = torch.sum(token_embeddings * mask, dim=1)
9 counts = torch.clamp(mask.sum(dim=1), min=1e-9)
10 return summed / counts
11
12tokenizer = AutoTokenizer.from_pretrained("nishtahir/modern-BERT-MTG-Commander")
13model = AutoModel.from_pretrained(model_name).eval()
14
15# Cards are serialized in the Scryfall Text Format
16card_data = """Commit {3}{U}
17Instant
18Put target spell or nonland permanent into its owner's library second from the top.
19----
20Memory {4}{U}{U}
21Sorcery
22Aftermath (Cast this spell only from your graveyard. Then exile it.)
23Each player shuffles their hand and graveyard into their library, then draws seven cards.
24"""
25
26encoded = tokenizer([card_data],padding=True, truncation=True, return_tensors="pt")
27
28ids = encoded["input_ids"].to(device)
29mask = encoded["attention_mask"].to(device)
30with torch.no_grad():
31 outputs = model(ids, mask)
32
33 # Mean pool to get a single embedding vector
34 pooled = mean_pool(outputs, mask)
35
36 # Normalize
37 embeddings = F.normalize(torch.cat(all_vecs, dim=0), p=2, dim=1)