运行BERT微调代码报data_volume下模型不存在的FileNotFoundError如何解决
错误根因
torch.save()本身不具备自动创建父目录的能力,你代码中指定的保存路径data_volume/finetuned_BERT_epoch_{epoch}.model依赖的data_volume文件夹不存在,是触发本次报错的核心原因- 额外可能的诱因:路径拼写错误、运行代码时的当前工作目录和预期不符导致相对路径定位失败
修复方案
在执行模型保存逻辑前,先主动创建需要的目录,用exist_ok=True参数避免目录已存在时抛出报错,也可以根据需求替换为绝对路径、或用os.path.join拼接路径降低跨平台寻址错误概率。
修正后完整代码
import os # 其余原有导入逻辑保持不变 # 提前创建模型保存目录,exist_ok=True表示目录已存在时不抛出错误 os.makedirs("data_volume", exist_ok=True) # 原有训练逻辑仅需调整保存路径的兼容写法,其余保持不变 for epoch in tqdm(range(1, epochs+1)): model.train() loss_train_total = 0 progress_bar = tqdm(dataloader_train, desc='Epoch {:1d}'.format(epoch), leave=False, disable=False) for batch in progress_bar: model.zero_grad() batch = tuple(b.to(device) for b in batch) inputs = {'input_ids': batch[0], 'attention_mask': batch[1], 'labels': batch[2], } outputs = model(**inputs) loss = outputs[0] loss_train_total += loss.item() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) optimizer.step() scheduler.step() progress_bar.set_postfix({'training_loss': '{:.3f}'.format(loss.item()/len(batch))}) # 跨平台更稳妥的写法是用os.path.join拼接路径,避免不同系统斜杠规则差异导致的错误 torch.save(model.state_dict(), os.path.join("data_volume", f"finetuned_BERT_epoch_{epoch}.model")) tqdm.write(f'\nEpoch {epoch}') loss_train_avg = loss_train_total/len(dataloader_train) tqdm.write(f'Training loss: {loss_train_avg}') val_loss, predictions, true_vals = evaluate(dataloader_validation) val_f1 = f1_score_func(predictions, true_vals) tqdm.write(f'Validation loss: {val_loss}') tqdm.write(f'F1 Score (Weighted): {val_f1}')
内容的提问来源于stack exchange,提问作者Tahir Ullah
相关产品推荐
相关产品推荐

