这是一个基于约480m SMILES字符串的GPT2风格的自回归语言模型,其中包含来自 ZINC database 的数据。
该模型具有约87m个参数,使用3072的批次大小进行175000次迭代训练,验证损失为~.615。该模型可用于生成药物分子或从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')
生成分子:
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))
为了测试生成性能,使用不同的温度值生成了1m个化合物。检查生成的化合物是否唯一且结构有效。
temperature | percent_unique | percent_valid | percent_unique_and_valid |
---|---|---|---|
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 |