Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

训练时遇到的问题: AttributeError: 'Vocab' object has no attribute 'itos' #5

Closed
WangJihan opened this issue Aug 15, 2022 · 11 comments

Comments

@WangJihan
Copy link

运行main.py时遇到如下问题:
(base) jihanwang@jihandeMacBook-Air nlp-poet % python main.py Traceback (most recent call last): File "/Users/jihanwang/Desktop/学习/FYP/nlp-poet/main.py", line 20, in <module> dataset = poet_dataset(data_path, train_batch_size, eval_batch_size) File "/Users/jihanwang/Desktop/学习/FYP/nlp-poet/dataloader.py", line 35, in __init__ self.ntoken = len(self.vocab.itos) File "/Users/jihanwang/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1207, in __getattr__ raise AttributeError("'{}' object has no attribute '{}'".format( AttributeError: 'Vocab' object has no attribute 'itos'

@iamwyh2019
Copy link
Owner

这是TorchText升级后更改了API导致的。有两个办法:

  1. 遇到 itos 的地方调用 itos = vocab.get_itos(),遇到 stoi 的地方调用 stoi = vocab.get_stoi()。我没有试过这种方案,你可以试试。Ref: https://stackoverflow.com/questions/68743912/vocab-object-has-no-attribute-itos
  2. 降级TorchText。我所用的版本是0.9.1: pip install torchtext==0.9.1

@WangJihan
Copy link
Author

谢谢!第二个方法解决了问题(不过现在0.9.1不支持了,我downgrade到了0.6.0)。
然而我在运行完成main.py后运行uientry.py时遇到错误:
AttributeError: 'PoetModel' object has no attribute 'generate_square_subsequent_mask'。
log如下:
(base) jihanwang@jihandeMacBook-Air nlp-poet % python3 uientry.py Loading model for 『五言律诗』... 8 城阙辅三秦,风烟望五津。与君离别意,同是宦游人。海内存知己,天涯若比邻。无为在歧路,儿女共沾巾。 Loading model for 『五言律诗』... Head: 春眠不觉晓处处闻 Traceback (most recent call last): File "/Users/jihanwang/Desktop/学习/FYP/nlp-poet/uientry.py", line 105, in <module> output = model.entry(heads) File "/Users/jihanwang/Desktop/学习/FYP/nlp-poet/uientry.py", line 72, in entry input_mask = self.model.generate_square_subsequent_mask(input.shape[0]).to(device) File "/Users/jihanwang/miniforge3/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1207, in __getattr__ raise AttributeError("'{}' object has no attribute '{}'".format( AttributeError: 'PoetModel' object has no attribute 'generate_square_subsequent_mask'

@iamwyh2019
Copy link
Owner

噢,确实是我改代码时没有改完。
如果你想用图形界面,可以运行 testui.py ;
如果你想用命令行交互,可以把 uientry.py 的第104行(main部分的第一句)改成 model = Mode_LSTM(<模式名字>, <保存的模型位置>) ,比如 model = Mode_LSTM('五言律诗', 'wuyanlvshi_final_model.pt')

@WangJihan
Copy link
Author

诶可是uientry.py这个我已经改了,main的第一句和上面line 88我也去掉了其他的,只保留了modes = [Mode('五言律诗', 'wuyanlvshi_final_model.pt')],可是还是出现了上面的问题。
同时我也试了testui.py但是我的mac和windows电脑都遇见了无法install PyQT5的问题。(pip 和conda都不可以,指定version也不可以)很抱歉我问题有些多。

@WangJihan
Copy link
Author

对不起那个testui.py我用jupyter notebook运行就没问题了,谢谢!可是我还是想问下uientry.py的PoetModel' object has no attribute 'generate_square_subsequent_mask 应该怎么解决啊

@iamwyh2019
Copy link
Owner

uientry的问题原因是,我在main部分调用了针对transformer模型的交互代码,transformer相比LSTM多了一个遮罩,所以多一个生成遮罩的过程。你运行main.py训练出来的是LSTM模型,直接运行uientry.py时模式对不上,所以会报错。这一段代码本来没打算用在演示中,只用来debug看看模型效果,所以没有改掉。我不确定你现在uientry.py是什么样的,解决方法就是把 if __name__ == "__main__" 下面一行定义model的语句改成 model = Mode_LSTM(XXXX, XXXX),用LSTM的模式来调用训练出来的模型。或者也可以写成model = Mode(XXXX, XXXX),因为上面把Mode定义成Mode_LSTM,是同一个意思。

我刚刚push了一个版本上去,把uientry.py对应的这一句改了。另外,我写了一个cmdline.py,专门用于通过命令行与训练好的LSTM模型交互,我会推荐你用这个新的代码文件。你只需要把54行(main部分第一句)改成 mode = Mode_LSTM(<你的模型路径>) 就好(不用传name参数)。

@WangJihan
Copy link
Author

谢谢!已经完全可以运行通了!抱歉我还有个问题就是您推荐运行多少epoch呢?我运行了100个然后如下是我的结果,感觉有些没训练的很好,而且效果和epoch=20的差不多?:
春风不相见,
潮下有谁期。
带云不相见,
雨落东山流。
晚暮不相见,
来来无所思。
急来无一事,
夜暮不相思。

@iamwyh2019
Copy link
Owner

是的,epoch=50之后就差不多了,而且写出来的都是一些有古诗味但不知所言的诗句。我觉得这不是训练次数的问题,而是这个模型不太适合写诗的任务。具体来说,一是LSTM可能不适合这种创作性的预测任务,更适合比较确定的序列预测;二是这个模型只对诗句做了简单的Embedding,可能没有编码诗句内的语义信息;三是模型训练时用了交叉熵作为损失函数,可能不适合这种创作性的任务。总而言之,目前的效果接近模型上限,调整训练次数应该不会有很大的改观。

@WangJihan
Copy link
Author

好的谢谢!非常感谢您的帮助!(原来你也玩原神,官服的话要不要加个好友)

@iamwyh2019
Copy link
Owner

哈哈哈没事,我现在基本退坑了,一个月只上两天打打深渊那种

@WangJihan
Copy link
Author

哦哦哦好的好的,谢谢大佬!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants