🚀 GPT2 Zinc 87m
本項目是一個基於GPT2風格的自迴歸語言模型,它在來自ZINC數據庫的約4.8億個SMILES字符串上進行訓練。該模型可用於生成類藥物分子,或從SMILES字符串生成嵌入向量。
🚀 快速開始
安裝依賴
from transformers import GPT2TokenizerFast, GPT2LMHeadModel
tokenizer = GPT2TokenizerFast.from_pretrained("entropy/gpt2_zinc_87m", max_len=256)
model = GPT2LMHeadModel.from_pretrained('entropy/gpt2_zinc_87m')
生成分子
import torch
inputs = torch.tensor([[tokenizer.bos_token_id]])
gen = model.generate(
inputs,
do_sample=True,
max_length=256,
temperature=1.,
early_stopping=True,
pad_token_id=tokenizer.pad_token_id,
num_return_sequences=32
)
smiles = tokenizer.batch_decode(gen, skip_special_tokens=True)
計算嵌入向量
from transformers import DataCollatorWithPadding
collator = DataCollatorWithPadding(tokenizer, padding=True, return_tensors='pt')
inputs = collator(tokenizer(smiles))
outputs = model(**inputs, output_hidden_states=True)
full_embeddings = outputs[-1][-1]
mask = inputs['attention_mask']
embeddings = ((full_embeddings * mask.unsqueeze(-1)).sum(1) / mask.sum(-1).unsqueeze(-1))
⚠️ 重要提示
此模型在訓練時,SMILES輸入前後使用了bos
和eos
標記。而GPT2TokenizerFast
分詞器即使在add_special_tokens=True
的情況下,也不會添加特殊標記。Huggingface稱這是預期行為。可能需要手動添加這些標記,示例如下:
inputs = collator(tokenizer([tokenizer.bos_token+i+tokenizer.eos_token for i in smiles]))
✨ 主要特性
- 模型參數:該模型約有8700萬個參數,在訓練時進行了175000次迭代,批次大小為3072,驗證損失約為0.615。
- 應用場景:可用於生成類藥物分子,或從SMILES字符串生成嵌入向量。
📚 詳細文檔
模型性能
為了測試生成性能,在不同的溫度值下生成了100萬個化合物,並檢查了生成化合物的唯一性和結構有效性。
percent_unique
表示n_unique_smiles/n_total_smiles
。
percent_valid
表示n_valid_smiles/n_unique_smiles
。
percent_unique_and_valid
表示n_valid_smiles/n_total_smiles
。
溫度 |
唯一率 |
有效率 |
唯一且有效率 |
0.5 |
0.928074 |
1 |
0.928074 |
0.75 |
0.998468 |
0.999967 |
0.998436 |
1 |
0.999659 |
0.999164 |
0.998823 |
1.25 |
0.999514 |
0.99351 |
0.993027 |
1.5 |
0.998749 |
0.970223 |
0.96901 |
在100萬個生成的化合物上計算的屬性直方圖如下:

📄 許可證
本項目採用MIT許可證。