Chemical-Reaction-Aware Molecule Representation Learning阅读笔记
问题一:使用pysmiles对Smiles格式数据的具体处理过程
1. SMILES格式
1.1 在SMILES表达式中,往往会去掉H元素,比如甲烷CH4用SMILES表达式来表达的话就是C;
1.2 双键用=来表示,比如C(=O)=O表示一个二氧化碳;
1.3 三键用#来表示,用法与双键一样;
1.4 主干线不加标记,分支加圆括号,比如上面提到的二氧化碳,第一个O原子不在主分支上,因此加了括号;
1.5 不成键的分子之间用.
隔开,比如O.C(=O)=O表示一个水分子和一个二氧化碳分子;
1.6 成环的要打开来写,并在开头和结尾加上断键标记,比如C1CCCCC1表示一个环己烷C6H12,这里的两个1
前所对应的碳是相互连接的。
2. SMILES在REACTION中的写法
说明其中每个‘.’分隔两个不同的分子,>>代表化学反应方程式中的等号,上图酯化反应中>>左边代表的是醇分子和酸分子两个分子。
3. 论文中的实际处理
以USPTO-479k中的test.csv中,论文中实际处理的时候,只提取了前三列 标号、prod_smiles、reactant_smiles 的数据。
上图中是对text.csv的第一行样例进行读取,接下来对smiles格式的数据调用pysmiles.read_smiles() 对样例进行操作,得到的embeddings结果可视化如图所示。
分析:可以看到,在第一个样例中,反应物有两个分子,共同生成了一个reactant_graph;生成物有三个分子,共同生成了一个product_graph。
针对 pysmiles库对数据的具体处理,可以从逆向的角度,参考当调用 **pysmiles.write_smiles()**的时候,反向手动搭建 SMILES格式数据的过程。
之后调用networkx_to_dgl()将图从nextworkx格式转换为dgl格式。在dgl图的feature表示中,每一个结点拥有 element, charge, aromatic, hcount四个属性。形状为;
其中962为随机选取的一个dgl图的结点数,每个dgl图的结点数是不一样的。4为上面提到的属性的维度。
问题二:输入模型时的维度匹配问题
模型的实际输入,分为graph和h(每个结点的特征)两部分。只保证同一个反应物(生成物)送入模型时,对应graph的结点个数和h的结点个数匹配即可。
其中self.feature_len为 四个属性中所有不同类型的个数和。先生成h大小为[962,4,55]的one-hot矩阵,之后通过torch.sum将三维降为二维,和graph一起送入模型中。
每一个epoch,它在前向传播的训练过程中,最后一层SumPooling之前,会得到一个维度为[结点数,dim]的矩阵,经过最后一层SumPooling操作会统一成[batchsize,dim]。这样得到每一对大小为[batchsize,dim]的reactant_embedding和product_embedding,进行loss的计算和反向传播。
虽然每次输入的特征矩阵和邻接矩阵结点对应的维度会发生变化,但是表示特征的维度的长度是固定的。长度恒为feature_len,即element、charge、aromatic、hcount四个属性中所有类别个数的总和55,即输入的特征矩阵大小固定为[结点数,55]