【《化学分子图提取算法概述》3900字】_第1页
【《化学分子图提取算法概述》3900字】_第2页
【《化学分子图提取算法概述》3900字】_第3页
【《化学分子图提取算法概述》3900字】_第4页
【《化学分子图提取算法概述》3900字】_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

化学分子图提取算法概述目录TOC\o"1-3"\h\u7225化学分子图提取算法概述 1148631.1深度学习提取算法 1113411.2数据集 5158771.3算法训练与测试 6113811.4结果分析 91.1深度学习提取算法为实现深度学习提取算法,使用了U-net网络提取文献中化学分子图,网络结构如图3-1所示。图3-1U-net网络结构这里使用的U-net网络结构可以分为编码器和解码器两个部分。在编码器部分,使用两个连续的卷积层和ReLU激活函数组成一个整体的卷积层,这一整体被封装为一个类以方便后续的调用。classDouConv(nn.Module):classDouConv(nn.Module):

def__init__(self,inDim,outDim):

super.__init__()

ker=3

pad=1

self.douConv=nn.Sequential(

#repeat2times

nn.Conv2d(inDim,outDim,kernel_size=ker,padding=pad),

nn.BatchNorm2d(outDim),

nn.ReLU(inplace=True)

)

defforward(self,input):

returnself.douConv(input)卷积模块关键代码如表3-1所示。卷积模块可以根据参数的不同调整输入输出维度,创建模块时按顺序调用卷积函数Conv2d、归一化函数BatchNormal和激活函数ReLU,使用Sequential函数打包。此外,这一模块使用了3*3大小的卷积核以及步幅为1的填充。这一结构的优势在于使用两个3*3卷积核达到5*5卷积核的感受野,而需要存储的参数数量小于单层卷积需要存储的参数数量。通过设置不同的输入维度和输出维度,这一模块可以完成不同需求的卷积操作。下采样模块关键代码如表3-2所示。下采样模块组合使用卷积模块和一个池化层,网络调用这一模块提取图片特征。classDown(nn.Module):classDown(nn.Module):

def__init__(self,inDim,outDim):

super().__init__()

self.douConvMaxPool=nn.Sequential(

nn.MaxPool2d(2),

DoubleConv(inDim,outDim)

)

defforward(self,x):

returnself.douConvMaxPool(x)解码器中使用的上采样模块关键代码如表3-3所示,上采样模块通过反卷积操作将网络中编码器输出信息逐步转化成图片。此外,由于U-net网络中需要将下采样部分获得的信息通过跳跃链接(SkipConnection)和上一层输入信息合并输入上采样模块中,且经过多次卷积操作后张量的大小发生了改变,需要使用pad函数填充张量至两者尺寸相同,随后使用cat函数合并两个张量作为上采样层的输入。classUp(nn.Module):classUp(nn.Module):

def__init__(self,inDim,outDim):

ker=2

stride=2

#inputtensordimaftercat()doublethanbefore

self.transposeConv=nn.ConvTranspose2d(inDim//2,inDim//2,kernel_size=ker,stride=stride)

self.conv=DouConv(inDim,outDim)defforward(self,downOutput,skipConnectInput):

transposeOut=self.transposeConv(downOutput)

deltax=skipConnectInput.size()[2]-transposeOut.size()[2]

deltay=skipConnectInput.size()[3]-transposeOut.size()[3] #resizetensorstosameshape

deltaY=torch.tensor(deltay) deltaX=torch.tensor(deltax) deltaX=torch.tensor(deltax) deltaY=torch.tensor(deltay) transposeOut=torch.nn.functional.pad(

transposeOut,[deltaX//2,deltaX-deltaX//2,deltaY//2,deltaY-deltaY//2]) upConvInput=torch.cat([skipConnectInput,transposeOut],dim=1) returnself.conv(upConvInput)classU-net(nn.Module):classU-net(nn.Module):

def__init__(self,inDim,category):

super(U-net,self).__init__()

self.inDim=inDim

self.category=category

self.initial=DouConv(inDim,64)

self.output=torch.nn.Conv2d(64,category)

#repeat4times

self.down=Down(64,128)

#repeat4times

self.up=Up(128,64)

defforward(self,input):

input=self.initial(input)

#subsampled4times

downOut_1=self.down_1(input)

downOut_2=self.down_2(downOut_1)

downOut_3=self.down_3(downOut_2)

downOut_4=self.down_4(downOut_3)

#upsamplingandskipconnection4times

upOut=self.up_1(downOut_4,downOut_3)

upOut=self.up_2(upOut,downOut_2)

upOut=self.up_3(upOut,downOut_1)

upOut=self.up_4(upOut,input)

output=self.output(upOut)

returnoutput以边长为100个像素点的正方形RGB图片为例,这一图片输入网络后的前向传播过程如下:首先经过卷积层处理转化为64*100*100大小的张量,随后进入下采样层。每个下采样层使得图片通道数加倍,图片尺寸则由于步幅为2的池化层缩小为原来的四分之一,即经过一次下采样后变为128*50*50大小的张量。整个下采样过程完成后输入图片转化为512*6*6大小的张量。随后使用反卷积操作使得下采样结束后输出张量的大小从512*6*6扩大到512*12*12,并与下采样输出拼接得到1024*12*12大小的张量,最后通过卷积层将通道数减少到256,至此一次上采样操作完成。经过连续四次上采样后,输出张量的大小已经转化为64*100*100,使这一张量通过卷积层减少通道数到3个,此时输出大小已经与原图片大小完全相同,整个网络的一次前向传播过程完成。此外,由于下采样过程计算输出尺寸时使用了下取整操作,会出现输入上采样层的两个变量大小不相同的情况。如上述例子的第二次上采样操作中,下采样层输入的张量大小为256*25*25,而经过反卷积处理获得的张量大小为256*24*24,此时需要将尺寸较小的张量扩展以完成拼接操作。1.2数据集这一问题中使用的数据集难以从现有数据库获取,以往的研究中也没有提供直接获取数据集的方式,因此需要收集相关文献和化学分子图以创建数据集。为模拟真实情况,收集了JACS、JCIM等专业化学期刊中与小分子结构、药物开发等关键词相关的文献,在这些现有文献的基础上处理图片形成数据集。首先将这些文献文件进行分页,得到单个页面的文献图片并统一修改为相同尺寸,随后对这些相同尺寸的单页图片进行处理。为保证网络训练和预测过程使用的文献图片中有且仅有一张化学分子图,需要选出不含有任何化学分子图的文献页面,并使用单个化学分子图替换掉文献图片的一个区域,产生仅含有单个化学分子图的文献图片。不失一般性,这一替换的位置应当是随机选择的。这里使用的化学分子图通过RDKit软件包生成,每张化学分子图仅包含单个化学分子,这些图片的具体获取方法将在后文详细描述,这里不再赘述。将整个化学分子图覆盖在文献中指定的位置上,使得文献中原有文字或其他部分被一个完整的化学分子图取代。经过以上步骤,得到了仅含有一个分子图的文献图片,且文献中分子图的位置是已知的。此外,还需要生成每个图片对应的真实标签(GroundTruth)。对于每张图片的真实标签,使用黑色像素点代表没有化学分子图的像素点,白色像素点代表存在化学分子图的像素点,整个真实标签图片仅包含纯白色的化学分子图。为了生成标签图片,将化学分子图进行二值化处理获得仅含有黑白两种颜色的图片,且图片中白色区域是存在化学分子图的区域。随后创建一张与输入文献相同大小的纯黑色真实标签图片,将二值化处理后的化学分子图覆盖在这一图片上,覆盖位置和原文献中覆盖位置完全相同,完成真实标签的创建过程。在具体实现中,通过(b)人工筛选的方法选出了一百页不存在任何化学分子图的文献。随后随机选择一千个化学分子图,每十个不同的化学分子图和同一张化学文献通过上述方法生成十组数据,总共生成一千组数据。其中,每组数据包括仅含有单个分子图的文献图片和对应的真实标签。(b)图3-2文献图片和真实标签(a)文献图片;(b)部分真实标签如图3-2所示,文献图片和和真实标签共同组成网络的数据集。在网络编写完成后,组合使用含有化学分子图的文献图片和真实标签训练网络。1.3算法训练与测试编写完成算法使用的U-net网络模型并获取到数据集后,需要编写配套的数据处理模块和训练模块,并使用这些模块对现有网络训练,完成训练后在预测集上进行预测操作以检验预测结果。算法训练流程如下:数据处理模块根据批次的大小将训练集中一定数量的原始图片和真实标签编号并加载到内存中,使用洗牌算法将数据的次序打乱以备使用。在获得数据之后还需要定义损失算法和优化算法。其中损失算法用于量化评估现有网络的预测能力,而优化算法用于优化网络的训练速度和质量。完成相关初始化工作后对网络进行训练,将原始图片输入网络进行前向传播后得到网络输出的预测结果,这一结果与真实标签共同输入损失函数计算训练损失。在同一批次的图片内梯度不断累积,直到这一批次的图片全部完成训练后再进行反向传播,清空之前的梯度并准备开始下一轮训练。使用这种训练方法可以大幅度减少网络训练对内存的占用,且对结果的影响较小。classImgLoader(dataPath):classImgLoader(dataPath):

def__init__(self,dataPath):

#initialimagepath

self.dataPath=dataPath

self.imgPath=glob.glob(os.path.join(dataPath,'/*.png'))

def__getitem__(self,index):

#getimageandgroundtruthpathbyindex

imgPath=self.imgPath[index]

gtPath=imgPath.replace('image','label')

#readimageandgroundtruth

img=cv2.imread(imgPath)

gt=cv2.imread(gtPath)

#translateimagetotensorsandreturn

img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

img=img.reshape(1,img.shape[0],img.shape[1])

gt=cv2.cvtColor(gt,cv2.COLOR_BGR2GRAY)

gt=gt.reshape(1,gt.shape[0],gt.shape[1])

returnimg,gt

def__len__(self):

#returnlenofdatasets

returnlen(self.imgPath)数据处理模块关键代码如表3-5所示。数据加载模块根据输入序号返回对应的文献图片和真实标签。网络训练模块中的部分关键代码如表3-6所示。首先使用train函数将网络调整到训练模式以保存网络在训练中改变的相关参数,随后在for循环体内部逐个批次训练。使用一个实例化的网络模型Unet计算输入图片前向传播后获得的预测输出图片,并调用二分类交叉熵BCEWithLogitsLoss函数计算网络损失。这一函数可以方便地计算二分类交叉熵并结合了Sigmoid函数,不需要额外添加激活函数。在网络的训练模块中调用了RMSprop优化方法对网络进行优化,并在优化器初始化后通过zero_grad函数和step函数分别进行网络的梯度清空和更新网络参数操作。defTrain(unet,dataPath,lr=defTrain(unet,dataPath,lr=0.001,epochs=20,batchSize=4):

device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")

imgLoader=ImgLoader(dataPath)

imgLoader=torch.utils.data.DataLoader(dataset=imgLoader,batch_size=batchSize,shuffle=True)

#RMSoptimizer

optimizer=optim.RMSprop(unet.parameters(),lr=lr,weight_decay=1e-8,momentum=0.9)

#LOSS

criterion=nn.BCEWithLogitsLoss()

forepochinrange(epochs):

#Trainmode

unet.train()

optimizer.zero_grad()

forimg,gtinimgLoader:

img=img.to(device=device,dtype=torch.float32)

gt=gt.to(device=device,dtype=torch.float32)

#outputpredandcaculateloss

output=unet(img)

loss=criterion(output,gt)

ifloss<bestLoss:

bestLoss=loss

#savetrainingresult

torch.save(unet.state_dict(),'newBestModel.pth')

if(i%batchSize==0):

loss.backward()

optimizer.step()

optimizer.zero_grad()使用这一模块进行训练后,得到模型的相关参数和网络损失的变化数据,综合这两者可以对网络的训练情况进行初步的判断,仍需要使用测试模块对网络进行评估。此外,训练时需要将训练得到的模型保存以备后续使用,每次训练得到更小的损失时都需要调用save函数保存模型。网络的测试模块需要对输入网络的图片进行预测并输出预测结果。网络输入存在化学分子图的文献图片,输出相同尺寸的黑白图片,其中白色像素点代表预测存在化学分子图的位置。defEval(testPath):defEval(testPath):

device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')

unet=Unet(1,1)

net.to(device=device)

net.load_state_dict(torch.load('bestModel.pth',map_location=device))

#Evalmode

net.eval()

forimgintestPath:

newPath=img.split('.')[0]+'New.png'

img=cv2.imread(img)

img=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

img=img.reshape(1,1,img.shape[0],img.shape[1])

img=torch.from_numpy(img)

img=img.to(device=device,dtype=torch.float32)

#predandsaveresult

pred=unet(img)

pred=np.array(pred.data.cpu()[0])[0]

pred[pred>=0.5]=255

pred[pred<0.5]=0

cv2.imwrite(newPath,pred)测试部分关键代码如表3-7所示,通过加载函数load_state_dict加载模型参数到内存中,使用eval函数将网络调整到训练模式使得网络内参数不再变化,完成初始化后开始预测。随后在循环体内部逐个将测试图片输入到网络中并将网络输出保存到pred数组中,这一数组中包含每个像素点可能存在化学分子图的概率,当某个像素点对应的概率大于等于0.5时则认为这一点存在化学分子图,将数组中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论