小白学习笔记,如有错误麻烦各位大佬指正
Transformer建模SMILES进行反应产率预测
一、baseline代码跑通流程及分析
1.导入压缩包
2.建好文件夹目录(参照往期笔记)
3.在code文件夹里加入Task3的文件(Datawhale教程内)
4.代码:安装环境
# !pip install torchtext
!pip install pandas
5.导入库
import pandas as pd #用于处理结构化数据。
from torch.utils.data import Dataset, DataLoader, Subset #用于数据加载和批处理的模块。
from typing import List, Tuple #用于类型提示,指定变量的类型为列表和元组。
import re #用于处理文本数据。
import torch
import torch.nn as nn #构建神经网络模型的基础。
import time #时间处理模块。
import torch.optim as optim #优化器模块。
6.自定义SMILES
# tokenizer,鉴于SMILES的特性,这里需要自己定义tokenizer和vocab
# 这里直接将smiles str按字符拆分,并替换为词汇表中的序号
class Smiles_tokenizer():
def __init__(self, pad_token, regex, vocab_file, max_length): #初始化函数
self.pad_token = pad_token #从参数中获取填充标记
self.regex = regex #从参数中获取正则表达式模式
self.vocab_file = vocab_file #从参数中获取词汇表文件路径
self.max_length = max_length #从参数中获取最大长度限制
with open(self.vocab_file, "r") as f: #打开词汇表文件
lines = f.readlines()
lines = [line.strip("\n") for line in lines] #每行去除换行符
vocab_dic = {}
for index, token in enumerate(lines):
vocab_dic[token] = index
self.vocab_dic = vocab_dic #作为词汇表中的一个token,构建词汇字典
def _regex_match(self, smiles): #正则表达式匹配
regex_string = r"(" + self.regex + r"|"
regex_string += r".)" #构建包含正则表达式模式和单字符的字符串
prog = re.compile(regex_string)
tokenised = []
for smi in smiles:
tokens = prog.findall(smi)
if len(tokens) > self.max_length: #长度超过最大长度,则进行截断
tokens = tokens[:self.max_length]
tokenised.append(tokens) # 返回一个所有的字符串列表
return tokenised
def tokenize(self, smiles): #对SMILES字符串进行token化,并将token映射为整数索引
tokens = self._regex_match(smiles)
# 添加上表示开始和结束的token:<cls>, <end>
tokens = [["<CLS>"] + token + ["<SEP>"] for token in tokens]
tokens = self._pad_seqs(tokens, self.pad_token)
token_idx = self._pad_token_to_idx(tokens)
return tokens, token_idx #回tokens列表和对应的索引列表
def _pad_seqs(self, seqs, pad_token): #对tokens列表进行填充,使其长度相同
pad_length = max([len(seq) for seq in seqs]) #计算所有tokens列表中最长的长度
padded = [seq + ([pad_token] * (pad_length - len(seq))) for seq in seqs] #将长度不足的部分填充到与最长列表相同的长度
return padded
def