目前才完成了task1
所用的平台是modelscape
实现了用于siRNA数据集的深度学习模型训练框架
第一步是依赖库的导入
第二步创建是基因组分词器类
这个类可以将基因组序列分割成固定长度的n-gram
初始化是接受ngram和stride两个参数 代表分词器的ngram长度和步幅
第三步是创建基因组词汇类
该类用于创建词汇表,可以将基因组片段映射为索引
第四步:创建siRNADataset类,用于加载siRNA数据,并将序列数据转换为模型可以处理的格式。
第五步:sirna model
基于GRU的神经网络模型,用于处理sirna序列
第六步:创立评估指标计算函数,用于计算模型的各项评估指标,包括精确度、召回率、F1值和评分。
第七步:创建模型评估函数,用来在测试集上评估模型性能
第八步:模型训练函数,用来训练模型,
测试主程序:
# 设置输出目录
output_dir = "result"
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 加载测试数据
test_data = pd.read_csv('sample_submission.csv')
columns = ['siRNA_antisense_seq', 'modified_siRNA_antisense_seq_list']
test_data.dropna(subset=columns, inplace=True)
# 创建分词器
tokenizer = GenomicTokenizer(ngram=3, stride=3)
# 创建词汇表
all_tokens = []
for col in columns:
for seq in test_data[col]:
if ' ' in seq: # 修改过的序列
all_tokens.extend(seq.split())
else:
all_tokens.extend(tokenizer.tokenize(seq))
vocab = GenomicVocab.create(all_tokens, max_vocab=10000, min_freq=1)
# 找到最大序列长度
max_len = max(max(len(seq.split()) if ' ' in seq else len(tokenizer.tokenize(seq))
for seq in test_data[col]) for col in columns)
# 创建测试数据集
test_dataset = SiRNADataset(test_data, columns, vocab, tokenizer, max_len, is_test=True)
# 创建数据加载器
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
# 初始化模型
model = SiRNAModel(len(vocab.itos))
model.load_state_dict(best_model) # 加载最佳模型权重
model.to(device=device)
model.eval() # 切换到评估模式,这对于某些模块如Dropout和BatchNorm是必需的
# 进行预测
preds = []
with torch.no_grad():
for inputs in tqdm(test_loader):
# import pdb;pdb.set_trace()
inputs = [x.to(device) for x in inputs]
outputs = model(inputs)
preds.extend(outputs.cpu().numpy())
# 将预测结果添加到测试数据中
test_data["mRNA_remaining_pct"] = preds
df = pd.DataFrame(test_data)
# 保存预测结果
output_csv = os.path.join(output_dir, "submission.csv")
print(f"submission.csv 保存在 {output_csv}")
df.to_csv(output_csv, index=False)