从零入门AI for Science#Datawhale AI夏令营

先这样,还没弄清楚怎么写,等我完善

siRNA数据集的深度学习模型训练框架

1. 依赖库的导入

2. 基因组分词器类

代码解读

  1. 类初始化:__init__ 方法接受两个参数 ngram 和 stride,用于设置分词器的 n-gram 长度和步幅。
  2. 分词方法:tokenize 方法将输入的序列转换为大写,并根据 ngram 和 stride 对序列进行分词。
  3. n-gram 长度为 1 的处理:如果 ngram 为 1,直接将序列转换为字符列表。
  4. n-gram 长度大于 1 的处理:按步幅进行分词,并确保每个分词的长度等于 ngram
  5. 最后一个分词的处理:如果最后一个分词长度小于 ngram,将其移除。
  6. 返回分词结果:返回处理后的分词结果列表。

3. 基因组词汇类

该类用于创建一个词汇表,用于将基因组片段映射为索引。

代码解读

  1. 类初始化:__init__ 方法接受一个参数 itos,它是一个词汇表列表。

    • itos:从索引到词汇的映射。
    • stoi:从词汇到索引的映射,由 itos 列表生成。
  2. 类方法 create:创建词汇表的类方法,用于生成 GenomicVocab 类的实例。

    • 参数:
      • tokens:所有token的列表。
      • max_vocab:词汇表的最大容量。
      • min_freq:词汇在被包含到词汇表中的最低频率。
    • 步骤:
      • 统计 tokens 中每个token出现的频率。
      • 按照频率从高到低排序,并选择出现频率大于等于 min_freq 的token,最多保留 max_vocab 个。
      • 在词汇表中添加一个特殊的 <pad> token,用于填充序列。
      • 返回包含生成的 itos 列表的 GenomicVocab 实例。

4. siRNA数据集类

该类用于加载siRNA数据,并将序列数据转换为模型可以处理的格式。

代码解读

  1. 初始化:__init__ 方法初始化数据集的必要参数:

    • df:包含数据的Pandas数据框。
    • columns:包含序列的列名列表。
    • vocab:词汇表对象,用于将token转换为索引。
    • tokenizer:分词器对象,用于将序列分割为token。
    • max_len:序列的最大长度,所有序列将被填充或截断到这个长度。
    • is_train:布尔值,指示数据集是否用于训练(默认为False)。
  2. 获取数据集长度:__len__ 方法返回数据集的样本数量。

  3. 获取样本:getitem 方法获取数据集中指定索引的样本:

    • 获取指定行的数据。
    • 对每个包含序列的列进行分词和编码。
    • 获取目标值(mRNA_remaining_pct),并将其转换为张量。
    • 返回编码后的序列和目标值。
  4. 分词和编码:tokenize_and_encode 方法对输入序列进行分词和编码:

    • 如果序列中包含空格,按空格分词(表示序列已经被修改)。
    • 否则,使用分词器对序列进行分词。
    • 将分词结果转换为索引,未知token0(<pad>)表示。
    • 对序列进行填充,使其长度等于最大长度 max_len
    • 返回张量格式的填充序列。

5. siRNA Model

这是一个基于GRU的神经网络模型,用于处理siRNA序列。

代码解读

  1. 初始化方法 __init__

    • vocab_size:词汇表大小,用于嵌入层。
    • embed_dim:嵌入维度,嵌入层将词汇映射为 embed_dim 维向量。
    • hidden_dim:隐藏层维度,GRU的隐藏状态维度。
    • n_layers:GRU的层数。
    • dropoutDropout层的丢弃率,用于防止过拟合。

该方法初始化了模型的各层,包括嵌入层GRU层全连接层Dropout层

  1. 前向传播方法 forward

    • 将输入序列传入嵌入层进行词汇嵌入。
    • 对每个嵌入的序列进行GRU处理,提取最后一个隐藏状态并进行Dropout处理。
    • 将所有处理后的序列输出拼接起来,并传入全连接层。
    • 返回经过全连接层后的结果。

6. 评估指标计算函数

该函数用于计算模型的各项评估指标,包括精确度、召回率、F1值和评分。

代码解读

  1. 计算平均绝对误差 (MAE):

    • mae = np.mean(np.abs(y_true - y_pred)):计算实际值和预测值之间的平均绝对误差
  2. 将实际值和预测值转换为二进制分类:

    • y_true_binary = (y_true < threshold).astype(int):如果实际值小于阈值,设为1,否则设为0
    • y_pred_binary = (y_pred < threshold).astype(int):如果预测值小于阈值,设为1,否则设为0
  3. 创建掩码:

    • mask = (y_pred >= 0) & (y_pred <= threshold):筛选预测值0阈值之间的样本。
    • range_mae = mean_absolute_error(y_true[mask], y_pred[mask]) if mask.sum() > 0 else 100:计算这些样本的平均绝对误差,如果没有符合条件的样本,设为100
  4. 计算精确度、召回率和F1得分:

    • precision = precision_score(y_true_binary, y_pred_binary, average='binary'):计算精确度。
    • recall = recall_score(y_true_binary, y_pred_binary, average='binary'):计算召回率。
    • f1 = 2 * precision * recall / (precision + recall):计算F1得分。
  5. 计算综合评分:

    • score = (1 - mae / 100) * 0.5 + (1 - range_mae / 100) * f1 * 0.5:综合MAE、范围内的MAE和F1得分,计算最终评分。
  6. 返回评分:

    • return score:返回综合评分。

7. 模型评估函数

该函数用于在测试集上评估模型性能。

8. 模型训练函数

函数用于训练模型,并在每个epoch后评估模型的性能,保存最佳模型。

9. 训练主程序

10. 测试程序

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值