python - 加载 language_model_learner fastai 的问题
问题描述
我对 fastai 库有疑问。我的代码如下:
import fastai
from fastai.text import *
import os
import pandas as pd
import fastai
from fastai import *
lab = df.columns[0]
data_lm = TextLMDataBunch.from_csv(r'/AWD', 'data.csv', label_cols = lab, text_cols = ['text'])
data_clas = TextClasDataBunch.from_csv(r'/AWD', 'data.csv', vocab = data_lm.train_ds.vocab, bs = 256,label_cols = lab, text_cols=['text'])
data_lm.save('data_lm_export.pkl')
data_clas.save('data_clas.pkl')
learn = language_model_learner(data_lm,AWD_LSTM,drop_mult = 0.3)
learn.lr_find()
learn.recorder.plot(skip_end=10)
learn.fit_one_cycle(10,1e-2,moms=(0.8,0.7))
learn.save('fit_head')
learn.load('fit_head')
我的数据很大,所以 fit_one_cycle 中的每个 epoch 持续大约 6 小时。我的资源使我只能在 SLURM JOB 70h 中训练模型,因此我的整个脚本将被取消。我想把我的脚本分成几部分,第一个最长的部分必须学习和保存 fit_head。一切都很好,之后我想加载我的模型再次训练它,但我收到了这个错误:
**RuntimeError:为 SequentialRNN 加载 state_dict 时出错:0.encoder.weight 的大小不匹配:从检查点复制形状为 torch.Size([54376, 400]) 的参数,当前模型中的形状为 torch.Size ([54720, 400])。**
我在 github/stack 帖子上检查了类似的问题,并尝试了下面这样的解决方案,但我找不到任何有用的东西。
data_clas.vocab.stoi = data_lm.vocab.stoi
data_clas.vocab.itos = data_lm.vocab.itos
有没有可能在没有这个问题的情况下加载训练有素的模型?
解决方案
当您这样做时,learner.save()
仅将模型权重保存在磁盘上,而不是包含模型架构信息的模型状态字典。
要在不同的会话中训练模型,您必须首先定义模型本身。请记住使用相同的代码来定义您的新模型。由于您提到的数据非常繁重,您可以使用非常小的数据子集(约 16 条记录)来创建这个新模型,然后这样做learn.load(model_path)
,您应该能够恢复训练。
你可以修改训练数据learn.data.train_dl = new_dl
推荐阅读
- node.js - 如何使用 Node.js 和 Axios 将文件上传到 AWS 中的预签名 URL?
- mysql - 如何在 Mariadb 的 regexp_replace 中使用正则表达式标志?
- javascript - 如何从firestore数据库返回值?
- c++ - 静态成员声明为 const 但初始化为 constexpr
- arrays - 带有姓名、姓氏等的 Java 数组
- jquery - 视频控件不可见
- java - Android Webview 布局未正确显示
- c++ - OpenCV:将图像文件读取到函数内部传递的 Mat 对象不会全局影响它
- go - 为什么承诺不在 golang chromedp 中工作
- git - 为什么 git blame --ignore-rev/--ignore-revs-file 对我不起作用?