FP-GNN分子性质预测项目的网络结构传参流程

本项目一共定义了六个神经网络层:FPN用来处理分子指纹,GATLayer处理原子维度矩阵的注意力机制,GATOne整合8个注意力机制处理过后的原子维度矩阵,GATEncoder将一个分子的原子特征矩阵处理成一行维度的特征,一个分子的特征就只占一行向量,GAT将所有smile分子表达式转化为原子特征矩阵,后将其转化成分子特征表达矩阵,FpgnnModel将FPN处理和GAT处理的数据联立起来后输出。

这里列举只传存储路径其他参数不传的简单处理过程,还是要结合他的代码去看比较好。

1.FPN

传参是smile分子表达式的列表,将其转化为分子指纹的表达形式:maccs,phaErGfp可以直接调用rdkit.Chem.AllChem包获取,pubcfp为作者自己处理,转化为的维度分别为167位,441位,881位,把他们连接起来为1489为,即为一个分子指纹特征的表达形式。

默认网络结构:linear(1489,512)+dropout(0.0)+Relu()+linear(512,300)

最终得到一个处理好的300维的分子指纹特征矩阵fp_list,一行为一个分子的指纹特征(x,300)

2.GATLayer

初始化:nfeat原子维度133,nhid注意力维度m默认60,alpha为0.2这个,nhead为注意力数量为8,dropout_gnn为0

传参:分子的原子特征矩阵(由原子类别转化成维度构成,一个分子含有n个原子,一个原子为133维,那原子特征矩阵就是(n,133)mole_out),分子键的邻接矩阵adj

运算过程:W参数为(133,60),a参数为(120,1) 这里a是用来计算两个原子之间的关系程度

atom_feature=mole_out*W=(n,60)转化为注意力维度60,这里应该是提前注意力特征维度

将atom_feature做变化,这里做的换位将原来的维度扩展为120,行数扩展为n*n,这里的前60维度是以一个原子数为单位将其维度重复n次,每个原子都会重复,后60维是直接以n个原子数为单位进行重复n次,然后再扩展为3维的矩阵,得到atom_trans(n,n,120),第一个n可以理解为批次数。这里是相当于一个(n,120)用来求一个原子对其他原子的关系。

e=atom_trans*a,再进行,squeeze(2)这里将一个批次合并成一个n维的向量,e为(n,n),原子和原子之间的联系程度

zero_vec形状和e一样,用来给分子矩阵中没有连接的原子和原子之间的位置置0的左右 

attention = torch.where(adj > 0, e, zero_vec) #adj元素为1时,取对应的e中的元素,adj元素为0时,取zero_vec对应位置的元素,为(n,n),原子与原子之间关系注意力分数矩阵,再将其做个softmax归一化各维度影响因子相同。

dropout(attention)防止过拟合

output=attention*atom_feature 为(n,60)  经过了注意力机制后得到的原子维度,原子包含了和他相邻的原子中的信息

elu(output) 激活函数

3.GATOne

这里的传参是分子的原子特征矩阵mole_out,分子建矩阵adj

dropout层+经过的8次注意力机制后得到的原子特征矩阵,再按列连接形成(n,480)+dropout+

将(n,480)再送入注意力机制,得到(n,300)+elu+logsoftmax(dim=1),这个softmax应该是保证各维度对结果的影响相同

4.GATEncoder

传参是mols和smiles,一个是分子的原子特征矩阵列表,一个是分子的smiles表达形式列表,得到分子的分子键邻接矩阵,以及将经过GATOne处理好的原子矩阵按列求和/原子数量得到一行代表分子的向量,维度为300,最后得到一个代表所全部分子的矩阵,一行代表一个分子特征向量(x,300),x代表分子数量。

5.GAT

这里就是调用了GATEncoder,传参是mol原子特征的列表和相关的下标,smile是分子smile表达式的列表,返回就是(x,300)

6.FpgnnModel

这层主要是将分子指纹特征和分子的图特征联系起来

encoder3=GAT() encoder2=FPN()

gat_out=encoder3(smiles) fpn_out=encoder2(smiles)  这两个的输出都是(x,300)

将gat_out全连接层fc_gat(300,300),再经过ReLU

将fpn_out全连接层fc_fpn(300,300),再经过ReLU

再把gat_out和fpn_out按列列列连接生成output为(x,600)

再将output经过Dropout()+Linear(600,300)+ReLU+Dropout()+Linear(300,task_num)

以上是代码讲解,具体论文讲解可参考

FP-GNN+论文讲解

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值