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

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

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

AttributeError: Can't get attribute 'SNLIBERTDataset' on <module '__main__' (built-in)>

这个问题在视频下方评论区已得到解决,将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 <class '__main__.SNLIBERTDataset'>: it's not the same object as __main__.SNLIBERTDataset

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

 其中的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())

 

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

参考链接:

1、python3报错Can't pickle <class '__main__.Test'>: 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
 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!以下是一个示例代码,用于进行深度学习模型的微调(fine-tuning): ```python import torch import torchvision # 加载预训练模型 model = torchvision.models.resnet18(pretrained=True) # 冻结所有参数 for param in model.parameters(): param.requires_grad = False # 替换全连接层 num_features = model.fc.in_features model.fc = torch.nn.Linear(num_features, num_classes) # 定义损失函数和优化器 criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.fc.parameters(), lr=0.001, momentum=0.9) # 加载数据集 train_dataset = torchvision.datasets.ImageFolder('path/to/train/dataset', transform=...) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) # 训练模型 model.train() for epoch in range(num_epochs): for images, labels in train_loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 保存微调后的模型 torch.save(model.state_dict(), 'fine_tuned_model.pth') ``` 这是一个简单的示例代码,你可以根据自己的需求进行微调。你需要替换代码的`path/to/train/dataset`为你自己的训练数据集的路径,并根据你的数据集进行相应的数据预处理操作。 当然,这只是一个基本的示例,实际的微调过程可能还需要考虑其他因素,如学习率调整、数据增强等。具体的微调策略会根据你的任务和数据集的特点而有所不同。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值