Android 如何序列化NLP分类模型
我试图在PyTorch android demo应用程序中使用一个新的NLP模型,但是我正在努力序列化该模型,以便它与android一起工作 PyTorch对Resnet模型的演示如下:Android 如何序列化NLP分类模型,android,pytorch,fast-ai,torchscript,Android,Pytorch,Fast Ai,Torchscript,我试图在PyTorch android demo应用程序中使用一个新的NLP模型,但是我正在努力序列化该模型,以便它与android一起工作 PyTorch对Resnet模型的演示如下: model = torchvision.models.resnet18(pretrained=True) model.eval() example = torch.rand(1, 3, 224, 224) traced_script_module = torch.jit.trace(model, example
model = torchvision.models.resnet18(pretrained=True)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("app/src/main/assets/model.pt")
但是,我不确定我的NLP模型的“示例”输入使用什么
我在fastai教程中使用的模型和python链接如下:
下面是用于创建我的模型的Python(使用Fastai库)。它与上面的模型链接中的相同,但形式简化
from fastai.text import *
path = untar_data('http://files.fast.ai/data/examples/imdb_sample')
path.ls()
#: [PosixPath('/storage/imdb_sample/texts.csv')]
data_lm = TextDataBunch.from_csv(path, 'texts.csv')
data = (TextList.from_csv(path, 'texts.csv', cols='text')
.split_from_df(col=2)
.label_from_df(cols=0)
.databunch())
bs=48
path = untar_data('https://s3.amazonaws.com/fast-ai-nlp/imdb')
data_lm = (TextList.from_folder(path)
.filter_by_folder(include=['train', 'test', 'unsup'])
.split_by_rand_pct(0.1)
.label_for_lm()
.databunch(bs=bs))
learn = language_model_learner(data_lm, AWD_LSTM, drop_mult=0.3)
learn.fit_one_cycle(1, 1e-2, moms=(0.8,0.7))
learn.unfreeze()
learn.fit_one_cycle(10, 1e-3, moms=(0.8,0.7))
learn.save_encoder('fine_tuned_enc')
path = untar_data('https://s3.amazonaws.com/fast-ai-nlp/imdb')
data_clas = (TextList.from_folder(path, vocab=data_lm.vocab)
.split_by_folder(valid='test')
.label_from_folder(classes=['neg', 'pos'])
.databunch(bs=bs))
learn = text_classifier_learner(data_clas, AWD_LSTM, drop_mult=0.5)
learn.load_encoder('fine_tuned_enc')
learn.fit_one_cycle(1, 2e-2, moms=(0.8,0.7))
learn.freeze_to(-2)
learn.fit_one_cycle(1, slice(1e-2/(2.6**4),1e-2), moms=(0.8,0.7))
learn.freeze_to(-3)
learn.fit_one_cycle(1, slice(5e-3/(2.6**4),5e-3), moms=(0.8,0.7))
learn.unfreeze()
learn.fit_one_cycle(2, slice(1e-3/(2.6**4),1e-3), moms=(0.8,0.7))
过了一段时间,我想出了如何做到这一点。问题是,无论我使用的是什么形状的输入,Fastai模型都无法正确跟踪 最后,我使用了另一个文本分类模型,并使其正常工作。我写了一篇关于我是如何做到这一点的教程,以防它能帮助其他人 首先,使用您首选的云计算机提供商(我使用Paperspace)打开一个新的Jupyter Python笔记本 接下来,复制并运行PyTorch文本分类教程中的代码。但是换掉这条线
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
与
device = torch.device("cpu")
注意:当设备设置为CUDA时,它会导致跟踪问题,因此我将其强制安装到CPU上。(这将减慢训练速度,但移动设备上的推理将以与cpu相同的速度运行)
最后,运行以下代码以正确跟踪模型,使其能够在Android上运行:
data = DataLoader(test_dataset, batch_size=1, collate_fn=generate_batch)
for text, offsets, cls in data:
text, offsets, cls = text.to(device), offsets.to(device), cls.to(device)
example = text, offsets
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model.pt")
此外,如果您希望在进行预测时在Android上使用vocab列表的CSV副本,请稍后运行以下代码:
import pandas as pd
vocab = train_dataset.get_vocab()
df = pd.DataFrame.from_dict(vocab.stoi, orient='index', columns=['token'])
df[:30]
df.to_csv('out.csv')
这个模型应该可以在Android上使用PyTorch API正常工作。gen您将什么输入传递给您的模型?它的形状是什么?一串文字。例如,learn.predict(“我真的很喜欢那部电影,太棒了!”)当你训练模特的时候,我很确定你没有像这样传球。当你训练模型时,输入的形状是如何传递的?这是我不确定的事情之一,如何计算出用于训练模型的输入的形状。我用来创建模型的所有代码都链接在上面的第二个链接中。我将看看是否可以将相关代码缩短为注释。我已添加了上述模型的培训。请将您的教程作为答案导入此处,否则您的答案将在几天后被版主删除。这被认为是链接唯一的答案