Pytorch实现玉米基因表达量预测模型

一、实验要求

        通过搭建残差卷积网络,实现对玉米基因表达量的预测

二、实验目的

 

  1. 理解基因表达量预测问题:基因表达预测是生物信息学和基因组学领域中的重要任务之一,促进学科交叉融合。
  2. 熟悉深度学习框架PyTorch:通过实现基因表达量预测模型,学习如何使用PyTorch构建、训练和评估深度学习模型。
  3. 掌握处理基因表达数据的基本技术:包括数据预处理、模型设计、训练和评估等。

三、实验过程

 

1.搭建模型

模型结构如下:

a2cb11ec52e34866ab6b361796bd3434.png

        使用PyTorch定义了一个用于回归任务的神经网络模型。模型结构是一个卷积神经网络(CNN),先在一个数据集上进行训练,使用均方误差损失,并在验证集上监控训练进度。最后,在测试集上评估模型性能,计算皮尔逊相关系数和R平方等性能指标。下面对代码进行解读:

BasenjiModel类:定义了基因表达量预测模型。

        其包含多个卷积块、池化层、批归一化、Dropout等层的堆叠,以及GELU激活函数。

 c8ebe6a9d04f4a90bf249ef6fcc5b2a9.png

初始化方法‘__init__’:定义了模型的结构和超参数。

        输入参数包括目标数量、输入通道数量,以及多个卷积块的相关参数。

        其中,conv1kc, conv2kc, conv3kc是卷积核数量,conv1ks, conv2ks, conv3ks是卷积核大小,conv1st, conv2st, conv3st是步幅,conv1pd, conv2pd, conv3pd是填充,pool1ks, pool2ks, pool3ks是池化大小,pdrop1, pdrop2, pdrop3是丢弃率。

        convdc是扩张卷积块数量,convdkc是扩张卷积核数量,convdks是扩张卷积核大小

 3a10322de9fa40b9987ab287f406feee.png

 

卷积块(conv_block_1, conv_block_2, conv_block_3):

每个块包括 GELU 激活、卷积、批归一化、最大池化和丢弃层。

6d5ab150241f4347afc48ce6c959db91.png

扩张卷积块 (self.dilations):

        通过循环创建了多个扩张卷积块,每个块包括扩张卷积、批归一化、GELU激活、1*1卷积、批归一化和丢弃层。

ac83165d95ef436693f42905d61d4900.png

线性层 (conv_block_5):

        这部分包括 GELU 激活、Flatten 操作、线性层和丢弃。用于将卷积块的输出映射到目标数量。

 bd0bcb0ed2634ff78c9ca7904f431caa.png

truncated_normal方法:使用正态分布初始化权重

Forward方法:前向传播,接受一个输入序列,通过卷积块和扩张卷积块,返回最终的输出

Compile方法:将模型移动到指定的设备

 60210f2a132a4b6ba84eebf82b073b13.png

MyDataset类:加载数据集,从指定目录中的文件中读取数据 

d2a3be1b86c84faab9d979e2f4a3ca2f.png

__init__ 方法:

首先,循环遍历路径下的所有文件,每个文件包含两个 NumPy 数组,一个用于输入 'arr_0',一个用于标签 'arr_1'。将所有输入和标签张量连接成一个大的张量,作为数据集的输入和标签

2ffe7a403e7542fc8eb8194e6e3b18b6.png 

 

__getitem__ 方法:返回一个元组,包含索引对应位置的输入张量和标签张量,用于按索引获取数据集中的单个样本

__len__ 方法:返回数据集的长度

8a732ed1618b4de38d4ede822f4f487b.png

        训练过程:对模型进行多个epoch的训练,并在每个epoch结束时用验证集对模型进行评估

设置超参:训练总轮数:EPOCH=10,每个批次的样本数量:BATCH_SIZE=32

用MyDataset类加载需使用的数据

        其中,shuffle=True 表示在每个 epoch 开始时是否打乱数据

 08093a7e01e14d53b9fe647d914eed2c.png

        在训练循环中,用tqdm创建进度条将训练进程可视化

        在训练batch时,首先将图像和标签传输到指定device,然后清空模型的梯度,接着对模型进行前向推理,计算损失,随后进行反向传播,更新模型的参数,并用进度条显示进程完成度。

 ddc88bdf1a7b4b59892a0470cb2a7f65.png

        如果当前epoch是最后一个batch,将进行验证集评估

        先关闭模型的训练状态,避免模型权重更新。随后对验证集的DataLoader进行迭代,过程和训练过程类似,将输入和标签移动到指定设备,随后进行前向传播计算验证损失,记录验证损失和验证Pearson相关系数,接着更新进度条,显示当前epoch的训练损失、验证损失和验证pcc。

548e6418d2fd4bb2b35d2cb6424d665b.png

 

模型评估:

        首先,将模型设置为评估模式,不更新权重。然后对测试集DataLoader进行迭代,通过前向传播,得到模型对测试集的预测。随后,计算测试集的皮尔逊相关系数和R平方评价模型,并打印出,画出测试集上真实值和预测值之间的散点图。

f69522dd9b2a4ec0abf7e0a632cd7a98.png

2)运行程序

在itc平台上,按要求将训练集、验证集和测试集数据放到对应文件夹中运行程序

解压相关数据文件

dd6b8b0372ac4062aa404e14eca0ced2.png

c1a6812c0c8144f4b402221ce4a6103e.png

运行程序后报错,显示当前服务器内存不够

 61cba0527d114893a999876c61da8391.png

使用内存更大的服务器再次运行程序 

53c88d4067ac41ad8a8cc0bf3edd5a38.png

551e67497e2d446ea6111815dce48aa4.png

四、实验结果 

本实验中的相关数据

num_targets=1,n_channel=4

conv_block_1, conv_block_2, conv_block_3,conv_block_4,conv_block_5共五个卷积块

EPOCH=10,BATCH_SIZE=32

运行结果:

fc23a8e1a7c54b77b13d3d52e1cb3333.png

五、实验总结

        在这次实验中,我了解了玉米基因表达量的预测任务,并通过残差卷积网络的搭建完成这一任务。实验中使用的网络结构为CNN,其中包括卷积层、批归一化层、激活函数和残差连接。模型能够捕获基因序列中的关键特征,从而实现对表达量的准确预测。

        这次对实验代码并没有过多的修改,主要是理解程序流程等,加深将模型应用到实际问题的理解。在运行程序时遇到了之前实验中并没有出现的服务器内存不够的情况,也通过向有经验同学请教,学会了使用其他服务器,完成程序运行。这也让我更熟悉服务器的使用,比如如何上传数据,如何连接服务器等等,学到了很多有用的方法。并且,我也认识到基因表达量预测是一个具有挑战性的任务,不仅需要深度学习模型的灵活运用,还需要对生物学背景的理解。

 

上一篇:【艾思科蓝】机器学习框架终极指南:PyTorch vs TensorFlow vs Keras vs Scikit-learn