版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
化学分子图识别算法的实现案例分析目录TOC\o"1-3"\h\u81791.1深度学习识别算法 180641.2数据集 7154501.3算法训练与测试 856271.4结果分析 12本章主要介绍使用深度学习识别算法将化学分子图转化为SMILES序列。这一部分网络输入仅含有单个化学分子图的图片,预测输出对应的SMILES序列。后文同样将按照网络结构、数据集获取、网络训练和测试、训练结果分析的顺序对这一问题进行研究。1.1深度学习识别算法图4-1识别算法网络结构这一部分的网络模型如图4-1所示,在这一网络中同样使用了Encoder-Decoder结构。编码器部分使用ResNet网络对输入图片进行编码,将输入网络模型的图片转化为含有图片特征的张量。解码器部分使用带有Attention机制的长短期记忆网络将编码后的信息逐步转化为SMILES序列中的字符。网络使用3个类分别实现编码器、解码器和注意力机制。这三个类均继承了Pytorch中的Module类,且整体结构和前文中描述的U-net网络的模型类相似。通过重写Module类内初始化方法init和前向传播方法forward实现自定义的初始化和前向传播函数。编码器接收图片输入后通过ResNet101层将输入图片编码,随后通过一个自适应平均池化层将输出转化为相同尺寸的编码器输出。编码器部分关键代码如表4-1所示。这一部分调用了PyTorch官方提供的ResNet网络模型并加载相关参数,即代码中的resnet101函数。同时由于ResNet网络已经进行过预处理,网络通过fine_tune函数设置ResNet网络的调整方式为微调。此外,由于ResNet101网络最后两层为分类任务中使用的全连接层,而这一任务不需要在编码器部分输出分类结果,因此去掉网络的最后两层。同时为了在输入不同尺寸图片的情况下得到相同尺寸的输出编码,网络调用了自适应平均池化层函数AdaptiveAvgPool2d,这种网络结构可以自适应地根据输入的大小调整参数以输出相同大小的张量。classResNetCNN(nn.Module):classResNetCNN(nn.Module):
def__init__(self,featureSize):
super(ResNetCNN,self).__init__()
#pretrainedresnetwithoutlinearlayers
resnet=models.resnet101(pretrained=True)
resnet=list(resnet.children())[:-2]
self.resnet=nn.Sequential(*resnet)
#adaptiveavgpoollayer
self.adaptiveAvgPool=nn.AdaptiveAvgPool2d((featureSize,featureSize))
defforward(self,input):
output=self.resnet(input)
output=self.adaptiveAvgPool(output)
#change1*2048*14*14->1*14*14*2048
output=output.permute(0,2,3,1)
returnoutput(b)(b)(a)图4-2循环神经网络和长短期记忆网络细胞(a)循环神经网络;(b)长短期记忆网络解码器的关键部分在于长短期记忆网络单元和attention类。这一网络的整体结构与传统循环神经网络类似,但细胞内部的单元结构有很大的不同。图4-2展示了单个长短期记忆网络细胞内部的结构和传统循环神经网络的区别,在长短期记忆网络单元中增加的细胞状态变量Ct与隐藏层输出Ht会被传递到下一个时间节点的计算操作中。细胞状态和隐藏层输出贯穿整个网络,网络细胞经过细胞中的遗忘门和记忆门结构不断更新细胞状态,从而长期保留网络需要的信息,进而实现网络的长期记忆效应。网络结构如图4-3所示。图4-3长短期记忆网络结构网络中使用的attention类能够根据图片中不同位置的语义信息动态地调整特征图上不同像素点对当前输出字符的影响程度,从而在输出化学分子序列时能够取得远优于没有attention机制网络的表现。classAttentionLSTM(nn.Module):classAttentionLSTM(nn.Module):
def__init__(self,embeddingDim,vocabSize,encoderDim,decoderDim,attentionDim,dropout=0.5):
super(AttentionLSTM,self).__init__()
#variableinitialization
self.embeddingDim=embeddingDim
self.vocabSize=vocabSize
self.encoderDim=encoderDim
self.decoderDim=decoderDim
self.attentionDim=attentionDim
self.dropout=dropout
#cellstateandhiddeninitialization
self.initialCellState=nn.Linear(encoderDim,decoderDim)
self.initialHiddenState=nn.Linear(encoderDim,decoderDim)
self.fbias=nn.Linear(decoderDim,encoderDim)
self.predOutput=nn.Linear(decoderDim,vocabSize)
#SMILESstringembeddinglayerinitialization
self.embeddingLayer=nn.Embedding(vocabSize,embeddingDim)
self.sigmoid=nn.Sigmoid()
self.dropout=nn.Dropout(dropout)
#LSTMCellandattentionfunctioninitialization
self.att=Attention(encoderDim,decoderDim,attentionDim)
inputDim=encoderDim+embeddingDim
self.LSTMCell=nn.LSTMCell(inputDim,decoderDim,True)解码器初始化部分关键代码如表4-2所示,解码器类内部通过类成员将输入信息存储,如:编码器输出和嵌入层的维度大小、是否启用dropout机制和词典大小等。网络调用了LSTMCell函数实现长短期记忆网络细胞,这一函数接收t时刻网络输入Xt、上一时刻隐藏层输出Ht-1和细胞状态Ct-1作为网络输入,输出当前时刻隐藏层输出Ht和新的细胞状态Ct。在这一网络的具体实现中,网络输入由SMILES序列经过嵌入层处理后得到的张量和attention机制加权处理后的编码器输出组合而成,即分别对应LSTMCell函数输入信息中的embedDim和encoderDim。隐藏层输出中存储了网络的预测信息,将这一变量经过全连接层处理后即可得到解码器网络预测结果。在网络初始化部分,实现注意力机制的attention类在网络初始化时被加载。除了使用LSTMCell函数实现的长短期记忆网络,网络初始化时还需要创建额外的网络结构,包括初始化隐藏层输出和细胞状态的两个全连接层、计算网络输出的全连接层和嵌入SMILES序列的嵌入层。网络在创建时初始化这些网络结构,在后续的网络训练和测试过程中这些结构可以被实例化的编码器调用。classAttentionLSTM(nn.Module):classAttentionLSTM(nn.Module):
defforward(self,pred,gt,gtLensLists):
#cellstateandothersinitialization
pred=pred.view(batchSize,-1,encoderDim)
embeddings=self.embedding(gt)
h,c=self.initialHiddenState(pred)
gtLens=[c-1forcingtLensLists]
#generatepredonebyone
fortinrange(max(gtLens)):
batchSizeT=sum([l>tforlingtLens])
encodeWithAtt,alpha=self.attention(
pred[:batchSizeT],h[:batchSizeT])
gate=self.sigmoid(self.f_beta(h[:batchSizeT]))
encodeWithAtt*=gate
h,c=self.decode_step(
torch.cat([embeddings[:batchSizeT,t,:],encodeWithAtt],dim=1),
(h[:batchSizeT],c[:batchSizeT]))
output=self.fc(self.dropout(h))
preds[:batchSizeT,t,:]=output
alphas[:batchSizeT,t,:]=alpha
returnpreds,gt,gtLensLists,alphas在网络的前向传播部分,输入编码器输出、目标SMILES序列和存储序列长度的列表,返回解码器预测结果和注意力权重分布。在网络前向传播过程中调用了attention类将编码器信息转化为带有注意力机制权重的信息,随后和经过嵌入层处理的目标SMILES序列共同输入长短期记忆网络细胞中进行前向传播,获取当前时刻的预测输出preds。网络通过for循环体重复这一预测过程直到获取到全部网络输出。在训练或验证模式下网络通过输出字符长度判断是否完成输出,当输出字符数等于真实SMILES序列的长度时,网络输出停止。而在测试模式下网络无法提前获知真实SMILES序列长度,需要判断最后输出的字符是否为代表输出结束的end标志,网络将循环输出预测信息直到出现第一个end标志。至此,网络前向传播过程完成。以8个图片组成一个训练批次为例,网络的前向传播过程如下:首先逐个将编码器输出的14*14*2048大小的张量使用view函数调整到196*2048大小,这一张量中的第一个维度大小代表了输入信息特征图的像素点个数,用于后续计算网络注意力信息。随后逐个将输入网络中的SMILES序列调用网络中嵌入层转化为二维张量,并完成隐藏层输出和细胞状态的初始化工作,这一初始化过程利用了网络内已经完成初始化的全连接层。随后进入循环逐个输出网络预测结果。通过数据加载器的设置可以将作为真实标签的SMILES序列按照长度顺序从大到小排列。在同一个批次内的图片同步进行预测,每一次输出时同时输出8个图片对应的预测序列中相同位置的符号,例如在第一次预测时输出每个图片预测输出的第一个字符。在具体实现过程中,使用变量batchSizeT记录当前需要同步输出的预测字符数量,初始大小与数据批次大小相同。由于在数据排序时已经将SMILES序列按照从长序列到短序列的顺序排序,因此在经过若干次预测后,输出长度最小的图片已经完成预测,且这一图片信息存储在张量最后,此后的预测操作不再需要输出这一图片对应的预测信息,因此将batchSizeT减少以节约后续训练时间,最终逐个完成对所有输入图片的预测。图4-4注意力机制网络结构在完成编码器和解码器后,还需要完成attention类实现注意力机制,这个类的结构如图4-4所示。Attention类内定义了数个全连接层,通过调用多个全连接层将编码器输出和解码器在上一时刻的输出合并为同一个张量,并使用这一张量计算网络的注意力权重信息。网络在前向传播过程中输入这两个张量,返回加权后的编码器输出和每个特征图上的注意力权重信息。Attention类部分关键代码如表4-4所示,注意力机制的实现依赖于网络上一时刻的隐藏层输出和编码器输出。输入类内部的信息是两个三维张量,即隐藏层输出和编码器输出信息,张量的第一个维度代表网络训练或测试中一个批次中不同的图片信息,第二个维度代表经过编码器提取到含有图片特征的像素点。这两个张量经过attention类内部的全连接层后,通过unsqueeze函数在隐藏层输出中添加一个维度,使得两者可以进行和操作。随后计算两者之和并输入到另一个全连接层中,并使用squeeze函数去除最后一个维度,形成8*196大小的二维张量,这一张量中第二个维度的大小代表特征像素点的数量。通过softmax层处理后转化为存储注意力信息的张量alphas,将alphas张量与编码器输出直接进行乘法操作即可获得加权后的编码。整个编码过程中,兼顾了当前时刻图片特征和不同时刻网络输出,实现了softattention机制。classAttention(nn.Module):classAttention(nn.Module):
def__init__(self,encoderDim,decoderDim,attentionDim):
super(Attention,self).__init__()
#linearlayers
self.encoderLinear=nn.Linear(encoderDim,attentionDim)
self.decoderLinear=nn.Linear(decoderDim,attentionDim)
self.attentionLinear=nn.Linear(attentionDim,1)
defforward(self,encoderDim,decoderDim):
encoderOut=self.encoderLinear(encoderDim)
hiddenOut=self.decoderLinear(decoderDim).unsqueeze(1)
temp=self.relu(encoderOut+hiddenOut)
attOut=self.attentionLinear(temp).squeeze(2)
#returnencoderwithattentionandweight
alpha=self.softmax(attOut)
encodeWithAtt=(alpha.unsqueeze(2)*encoderOut).sum(dim=1)
returnencodeWithAtt,alpha1.2数据集算法的训练需要大量化学分子图和与图片对应描述化学分子的字符序列。在查找相关资料后得知,SMILES语言是一种表示化学分子结构的通用标准,这种语言可以精准地区分不同的化学分子,且能够表示化学分子中的空间结构,被广泛应用于化学相关研究中ADDINEN.CITE<EndNote><Cite><Author>Anderson</Author><Year>1987</Year><RecNum>48</RecNum><DisplayText><styleface="superscript">[19]</style></DisplayText><record><rec-number>48</rec-number><foreign-keys><keyapp="EN"db-id="d900x2p98vraf3eddx4xp008rtxz95r0tdwf">48</key></foreign-keys><ref-typename="JournalArticle">17</ref-type><contributors><authors><author>Anderson,E.</author><author>Veith,G.D.</author><author>DWeininger</author></authors></contributors><titles><title>SMILES:alinenotationandcomputerizedinterpreterforchemicalstructures</title></titles><dates><year>1987</year></dates><urls></urls></record></Cite></EndNote>[\o"Anderson,1987#48"19]。鉴于上述优点,选择使用SMILES语言描述化学分子。对于每个不同的SMILES序列有且仅有一个化学分子与其对应,这种唯一性保证了SMILES语言在不同的领域内使用时的统一性。在SMILES语言中有如下主要规则:使用原子符号表示化学分子中的原子,非氢原子链接的氢原子将被省略,如氯化氢(HCl)使用SMILES语言表示为Cl;分别使用=符号和#符号表示化学分子中的双键和三键,单键则被省略,表示原子间空间关系的实楔线和虚线则分别由/符号和\符号表示,如氰化氢(HCN)使用SMILES语言表示为C#N;在每个环中断开一个键以表示环形结构,使用相同的数字标记断开位置两端的原子;将带有分支的原子写在左侧,使用圆括号将分支部分包括并写在右侧。确定使用SMILES格式表示化学分子后,需要获取大量的化学分子图和对应的SMILES序列作为网络的数据集。PubChem数据库,即有机小分子生物活性数据库提供了海量的化学分子信息ADDINEN.CITE<EndNote><Cite><Author>Wang</Author><RecNum>49</RecNum><DisplayText><styleface="superscript">[20]</style></DisplayText><record><rec-number>49</rec-number><foreign-keys><keyapp="EN"db-id="d900x2p98vraf3eddx4xp008rtxz95r0tdwf">49</key></foreign-keys><ref-typename="JournalArticle">17</ref-type><contributors><authors><author>Wang,Y.</author><author>Xiao,J.</author><author>Suzek,T.O.</author><author>Zhang,J.</author><author>Wang,J.</author><author>Bryant,S.H.</author></authors></contributors><titles><title>PubChem:apublicinformationsystemforanalyzingbioactivitiesofsmallmolecules</title><secondary-title>NucleicAcidsResearch</secondary-title></titles><periodical><full-title>Nucleicacidsresearch</full-title></periodical><dates></dates><urls></urls></record></Cite></EndNote>[\o"Wang,#49"20],且提供了批量下载SMILES格式化学分子信息的接口,因此选用这一数据库创建算法需要的SMILES序列数据集。(a)(b(a)(b)图4-5化学分子图(a)原始分子图;(b)添加噪声的分子图为训练算法,首先在PubChem数据库中下载了五十万条SMILES序列并保存,随后筛选出长度在5个字符到40个字符之间的SMILES序列,将其他序列删除。在剩余的SMILES序列中选择五万条,调用RDKit工具包中接口将这些序列转化为图片,同时遍历这五万条序列,记录出现过的所有元素符号和其他字符存储到字典中。至此数据集创建完成,为了检验算法在图片质量较差时的准确性,额外选择了一千张图片,在这些图片中人工添加了高斯噪声和椒盐噪声作为另一个测试集。1.3算法训练与测试区别于上文U-net网络中使用的数据集加载,这一部分网络使用的数据是图片和对应的SMILES序列。网络无法直接使用SMILES序列进行训练,需要将字符串通过数据字典转化为对应的数字序列。这一数据字典在遍历数据集中的SMILES序列的基础上添加开始、终止、空白填充和未知符号填充这四种特殊符号完成建立过程。使用这样的数据字典可以将SMILES序列中的元素符号转化为字典中对应的序号,整个序列完成转化后得到一个仅包含数字的序列,用于网络训练和测试时的损失计算。defTrain(loader,criterion,encoder,encoderOptimizer,decoder,decoderOptimizer):defTrain(loader,criterion,encoder,encoderOptimizer,decoder,decoderOptimizer):
decoder.train()
encoder.train()
device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")
fori,(img,gt,gtlens)inenumerate(loader):
img=imgs.to(device)
gt=gt.to(device)
#encodeanddecode
img=encoder(img)
preds,_,gtlens,alphas=decoder(img,gt,gtlens)
preds=pack_padded_sequence(preds,gtlens,batch_first=True)
preds=preds.data
refs=gt[:,1:]
refs=pack_padded_sequence(refs,gtlens,batch_first=True)
refs=refs.data
#caculateloss
loss=criterion(preds,refs)
loss+=(1.-alphas.sum(dim=1)**2).mean()
encoderOptimizer.zero_grad()
encoderOptimizer.step()
decoderOptimizer.zero_grad()
decoderOptimizer.step()网络训练模块的关键代码如表4-5所示。这一部分网络的训练与测试模块整体逻辑和上文中的U-net网络中的训练部分相似,在数据加载上有一定区别。在训练或验证模式下,除了SMILES序列和对应的图片,还需要加载输入SMILES序列的长度信息用于判断网络输出是否结束。网络对同一批次的输入图片同时进行预测,并将网络输出写入Pred张量中,同时将处理后的网络注意力信息写入alphas张量中以备后续使用。在获取到预测输出后,计算损失完成反向传播过程,训练操作完成。为了可以较为直观地观测到网络的训练结果,在网络训练部分额外增加了验证模块。验证部分从验证集中获取化学分子图和对应的真实SMILES序列,按照训练网络的流程获取网络输出,但不改变网络中的参数和梯度信息。完成预测后将输出结果和真实SMILES序列对比并使用BLEU-4指标评估训练结果,每一轮训练完成后通过计算验证集准确率将准确率更高的模型保存下来以备后使用。defValid(loader,encoder,decoder,criterion):defValid(loader,encoder,decoder,criterion):
encoder.eval()
fori,(img,gt,gtLens)inenumerate(loader):
#encodeandpred
img=encoder(img)
preds,_,predsLens,alphas=decoder(img,gt,gtLens)
preds=pack_padded_sequence(preds,predsLens,batch_first=True)
preds=preds.data
gt=pack_padded_sequence(gt,predsLens,batch_first=True)
gt=gt.data#caculateloss
loss=criterion(scores,targets)
loss+=((1.-alphas.sum(dim=1))**2).mean()
foriinrange(gt.shape[0]):
imgGt=gt[i].tolist()
#delete<pad><start><end>
imgGt=deleteList(imgGt)
references.append(imgGt)
_,preds=torch.max(predsTemp,dim=2)
preds=preds.tolist()
foriinenumerate(preds):
#delete<pad>
pred.append(preds[i][:predsLens[i]])
hypotheses.extend(pred)
assertlen(references)==len(hypotheses)
whilei<len(references):
bleu4score=sentence_bleu(ref[i],hypotheses[i])
bleu1.update(bleu4score)
returnbleu1.avg验证模块的关键代码如表4-6所示。在验证模块中生成图片预测信息的代码和训练部分完全相同。这一部分代码和训练部分区别在于调用eval函数将网络调整到评估模式,停止梯度反向传播以保证在网络验证时不会改变网络参数。此外增加了计算BLEU-4分数的功能,网络中调用sentence_bleu函数,将预测信息和真实标签输入函数中获取单个数据的BLEU-4分数。完成全部预测后验证部分计算网络的平均BLEU-4得分并返回,通过这一分数可以对网络的训练效果进行初步判断。网络的测试部分逐个将测试集中图片作为网络输入,输出一个SMILES序列作为预测结果。这一部分和网络训练时存在相似部分,需要调用网络模型中前向传播调用函数将输入图片转化为网络输出。由于网络模型中使用LSTMCell函数作为长短期记忆网络的核心部分,且添加了attention机制增加网络的准确率,因此需要手工编写代码计算编码器输出、解码器输出和注意力机制的加权信息。此外,训练网络时每个输入图片对应的真实SMILES序列是确定的,SMILES序列的长度也可以方便地获得。但在网络预测过程中输入图片对应的SMILES序列是未知的,在无法获得序列长度的情况下,每次预测都需要检查输入图片的翻译是否完成。defEval(loader,encoder,decoder):defEval(loader,encoder,decoder):
references=list()
hypotheses=list()
fori,(img,gt,gtLens)inenumerate(loader):
#initialpred
img=img.to(device)
encoderOut=encoder(img)
encoderDim=encoderOut.size(3)
encoderOut=encoderOut.view(1,-1,encoderDim)
feature=encoderOut.size(1)
encoderOut=encoderOut.expand(1,feature,encoderDim)
#startpredwith<start>
predChar=torch.LongTensor([[1]]).to(device)
top1Pred=torch.zeros(1,1).to(device)
whileTrue:
embeddings=decoder.embedding().squeeze(1)
encoderWithAtt,alpha=decoder.attention(encoderOut,h)
alphas.append(alpha)
gate=decoder.sigmoid(decoder.fbias(h))
encoderWithAtt*=gate
h,c=decoder.LSTMCell(torch.cat([embeddings,encoderWithAtt],dim=1),(h,c))
#fullyconnectlinearlayerandsoftmaxoutput
pred=decoder.predOutput(h)
pred=torch.nn.log_softmax(pred,dim=1)
#updatepred
pred=top1Pred.expand_as(pred)+pred
#frompredgetnextpredchar
ifstep==1:
top1Pred,predChar=pred[0].topk(k,0,True,True)
else:
top1Pred,predChar=pred.view(-1).topk(k,0,True,True)
indexPred=predChar//vocabSize
indexNext=predChar%vocabSize
#updatenewchartopredChar
predChar=torch.cat([predChar[indexPred],indexNext.unsqueeze(1)],dim=1)
#preduntilreachend
ifindexPred==vocab('<end>'):
break
#updatehiddenandcellstatetoprednextchar
h=h[indexPred[0]]
c=c[indexPred[0]]
gt=gt[i].tolist()
#remove<start><pad><end>
ref=[wforwingtifwnotin{0,1,2}]
hypo=[wforwinseqifwnotin{0,1,2}]
references.append(ref)
hypotheses.append(hypo)
assertlen(references)==len(hypotheses)
returnhypotheses#updatepred
#updatepred
pred=top1Pred.expand_as(pred)+pred
#frompredgetnextpredchar
ifstep==1:
top1Pred,predChar=pred[0].topk(k,0,True,True)
else: top1Pred,predChar=pred.view(-1).topk(k,0,True,True)
indexPred=predChar//vocabSize
indexNext=predChar%vocabSize
#updatenewchartopredChar
predChar=torch.cat([predChar[indexPred],indexNext.unsqueeze(1)],dim=1)
#preduntilreachend
ifindexPred==vocab('<end>'):
break
#updatehiddenandcellstatetoprednextchar
h=h[indexPred[0]]
c=c[indexPred[0]]
gt=gt[i].tolist()
#remove<start><pad><end>
ref=[wforwingtifwnotin{0,1,2}]
hypo=[wforwinseqifwnotin{0,1,2}]
references.append(ref)
hypotheses.append(hypo)
assertlen(references)==len(hypotheses)
returnhypotheses测试模块中需要使用经过训练的编码器、解码器和attention模块,因此将训练好的模型存储在文件中并在测试时直接使用load函数加载参数到网络。网络使用已经训练好的编码器对输入的测试图片进行编码,得到编码器输出,同时创建一个张量pred存储网络预测的输出字符。由于预测时无法获得图片的真实标签,所以仅在pred张量中添加一个开始标志作为网络输出的起点。随后调用网络中的全连接层初始化隐藏层输出和细胞状态,其中隐藏层输出和编码器输出一并输入attention函数中计算加权后的编码器输出。存储网络预测输出字符的pred张量经过嵌入层处理后和加权后的编码器输出拼接,作为LSTMCell的输入变量并获取到新的隐藏层输出,经过全连接层处理后便得到下一个输出字符的概率分布情况,选取概率最大的字符作为网络输出并存储到pred张量中。至此,网络完成了对测试图片的一轮预测。在完成一轮预测后网络测试部分检测输出字符是否是代表
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州省部分重点中学2027届高三上学期第一次学情自测物理试卷(含答案)
- 2025-2026学年河南省郑州十九中高二(上)学情调研物理试卷(1月份)(含答案)
- 食用菌接种箱操作工岗位技能考试试卷及答案
- 色差仪检测员岗位技能考试试卷及答案
- 渔船电机员安全培训水平考核试卷含答案
- 印制电路照相制版工岗前岗中考核试卷含答案
- 电线电缆制造工操作规范考核试卷含答案
- 真空冶炼工安全理论强化考核试卷含答案
- 绢人工岗中理论技能考核试卷含答案
- 玉器抛光工QC管理知识考核试卷含答案
- 2026中国工业废水零排放技术路线与成本效益分析报告
- 2026-2032年中国智能辅助治疗行业市场动态分析及发展趋向研判报告
- 2026年度国家工作人员学法用法考试题库(含答案)
- 2026年成都市金牛区人民检察院公开招聘编外人员笔试参考题库及答案详解
- 2026年上海市建筑三类人员项目负责人(安全员B证)考试题库
- 《整 理收纳》高职现代家政服务专业全套教学课件
- 湖南省湘潭市2027届高三上学期第一次模拟考试英语试卷(含答案)
- IPC-4101 标准中文版文档
- 第一单元 健康生活(单元自测)科学教科版六年级上册2026秋
- 2026年贵州省现代种业集团有限公司第二批人才招聘考试备考试题及答案详解
- 2026统考专升本英语:英语550个高频核心词
评论
0/150
提交评论