Test1,跑通代码,并提交,获得第一个分数
代码太长就不放了,按照Datawhale给的教程基本上是可以跑出分数的。
这次代码的难度比上一期的要高很多,我作为一名初学者,可以在某些参数上进行调整
# 设置参数
bs = 64 # 批次大小
epochs = 50 # 训练的迭代次数
lr = 0.001 # 学习率
seed = 42 # 随机种子
output_dir = "output/models" # 模型保存路径
# 选择设备
device = 'cuda' if torch.cuda.is_available() else 'cpu'
# 设置随机种子以确保结果可重复
set_random_seed(seed)
# 创建输出目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 加载数据
train_data = pd.read_csv('train_data.csv')
# 指定需要处理的列
columns = ['siRNA_antisense_seq', 'modified_siRNA_antisense_seq_list']
# 删除包含空值的行
train_data.dropna(subset=columns + ['mRNA_remaining_pct'], inplace=True)
# 将数据分为训练集和验证集
train_data, val_data = train_test_split(train_data, test_size=0.1, random_state=42)
# 创建分词器
tokenizer = GenomicTokenizer(ngram=3, stride=3)
# 创建词汇表
all_tokens = []
for col in columns:
for seq in train_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 train_data[col]) for col in columns)
# 创建数据集
train_dataset = SiRNADataset(train_data, columns, vocab, tokenizer, max_len)
val_dataset = SiRNADataset(val_data, columns, vocab, tokenizer, max_len)
# 创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=bs, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=bs)
# 初始化模型
model = SiRNAModel(len(vocab.itos))
criterion = nn.MSELoss()
# 初始化优化器
optimizer = optim.Adam(model.parameters(), lr=lr)
# 训练模型
best_model = train_model(model, train_loader, val_loader, criterion, optimizer, epochs, device, output_dir=output_dir)
可以调整批次大小,训练迭代次数与学习率来获得更加好的模型。