关于李沐书籍中“15.7 自然语言推断:微调BERT”节代码问题总结

本人在学习李沐《动手学深度学习》第二版的15.7节中遇到了若干问题,这导致本人久久不能跑通代码,在搜索若干资料并进行调试之后终于将代码跑通。撰文以总结走过的坎~

1、代码运行时遇到问题1:

AttributeError: Can't get attribute 'SNLIBERTDataset' on 

这个问题在视频下方评论区已得到解决,将SNLIBERTDataset类中的pool进程代码稍作修改即可。原码为:

pool = multiprocessing.Pool(4)  # 使用4个进程
out = pool.map(self._mp_worker, all_premise_hypothesis_tokens)

修改如下:

# pool = multiprocessing.Pool(4)  # 使用4个进程
out = map(self._mp_worker, all_premise_hypothesis_tokens)
out = list(out)

2、 代码运行时遇到问题2:

根据上述所言对代码进行修改后,根据评论区反馈好像大家就能跑通了,但是我在jupyter上还是遇到了下面的问题:

Can't pickle : it's not the same object as __main__.SNLIBERTDataset

在网上搜索之后,该帖和我遇到的问题类似,简单概括即为类名和变量名重复。但是本人还是不太清楚如何修改。后来又参考另一篇博客找到修改答案:将BERTClassifier类和SNLIBERTDataset类与源代码分离即可(真的是玄学问题...),但是这个前提是代码需搬运到pycharm上运行!!!切记不是在jupyter上运行(因为本人尝试过,在jupyter上运行仍然失败)。如下图所示:

关于李沐书籍中“15.7 自然语言推断:微调BERT”节代码问题总结_第1张图片

 其中的bert_sup.py模块只是封装了BERTClassifier类和SNLIBERTDataset类;然后在15ch_BERT.py中通过如下代码进行调用即可:

from bert_sup import BERTClassifier, SNLIBERTDataset

3、 代码运行时遇到问题3:

最后一个问题就是代码跑不动。。。原因可能就是沐神在视频最后提到的,NLP领域的DP代码底层是用Python写的,由于存在太多的循环,以及加载数据本身较慢导致了模型根本跑不动(可以从显卡监测中可见一斑)。而CV模型都是大佬们早期用C++写的,所以很少有这方面的问题。

解决方法:同样参考上述第二点解决方案。

最后,终于跑通了沐神的代码。。。(友情提示:在pycharm上如果要显示图片的话,需要在最后加上代码:d2l.plt.show())

 关于李沐书籍中“15.7 自然语言推断:微调BERT”节代码问题总结_第2张图片

 模型结果和沐神书上的几乎一样。撰写此文聊以总结,希望能够帮助到深爱deep learning的各位小伙伴~~

参考链接:

1、python3报错Can't pickle : it's not the same object as __main__.Test解决 - 程序员的文章 - 知乎 https://zhuanlan.zhihu.com/p/528634533

2、版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_37209590/article/details/122699573
 

你可能感兴趣的:(bert,人工智能,深度学习)