具体的复现细节无法在此呈现,还需要实践,利用好ChatGPT
代码复现背景:
(1)了解简单python语法,无pytorch基础,复现要求只要代码可运行,不要求读懂,不要求模型训练;
(2)工具Anaconda3-5.2.0-Windows-x86_64.exe(Python 3.6)和pycharm-community-2021.3.3.exe;
(3)科学上网,能用ChatGPT最好。
(4)硬件是联想G40-70(老古董笔记本)。
提前了解:
(1)可直接在这个微信公众号文章上看到源码地址,应该是作者自己发的。TKDE 2022 | 记忆引导的多视图多领域虚假新闻检测
(2)虽然作者在github上说明了环境,但是确实需要进行更改,一共三处:
①在所有库导入后,会有一个dataset参数报错;
②项目文件夹当中缺少从 Hugging Face 模型库中加载预训练的 BERT 模型(hfl/chinese-bert-wwm-ext
)和 RoBERTa 模型(roberta-base
),需要下载后,手动放到项目文件夹中;
③由于我是GPU+pytorch切换到CPU+pytorch,需要把涉及到.cuda的地方修改成适合GPU和CPU可同时使用的代码。
(3)pycharm是用来导入项目,Anaconda3用来创建虚拟环境,防止需要配置不同版本的环境。
(4)ChatGPT可以根据报错告诉你下一步改啥,甚至可以直接改好了直接引用。
复现过程:
1. 环境配置
(1)创建虚拟环境
conda create --name 虚拟环境名称 python=3.6
(2)激活虚拟环境
conda activate 虚拟环境名称
(3)ModuleNotFoundError: No module named 'torch'
这一步要说明,直接百度搜conda如何安装pytorch即可,一开始搜了很多攻略使用pip安装导致出现了奇怪的序列长度错误。
conda安装pytorch命令,在不确定有没有CUDA的情况下,可以使用以下命令安装PyTorch:
conda install pytorch torchvision torchaudio cpuonly -c pytorch
(4)ModuleNotFoundError: No module named 'tqdm'
conda install -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ tqdm
这里也要说明,在下面用conda安装transformers时会报tqdm的相关错误,但我不明白为什么。
(5)ModuleNotFoundError: No module named 'sklearn'
不用用conda安装是因为装不上
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
(6)ModuleNotFoundError: No module named 'pandas'
conda install pandas
(7)ModuleNotFoundError: No module named 'transformers'
因为用conda安装会报错,所以选择用pip
#因为pip和conda安装混用有可能冲突,pip安装后提示tqdm报错,故只能先卸载
conda remove tqdm
pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers==3.4.0
2.代码修改
(1)TypeError: __init__() got an unexpected keyword argument 'dataset'
这个错误提示表明在实例化 `M3FENDTrainer` 类时,它的构造函数 (`__init__`) 不支持 `dataset` 这个参数。
根据在grid_search.py搜索'M3FENDTrainer'可知
from models.m3fend import Trainer as M3FENDTrainer
就是说实际上问题在Trainer中,Trainer在m3fend.py中
根据`M3FENDTrainer` 类的构造函数 (`__init__`) 源代码,表明它确实没有 dataset
这个参数。因此,导致在调用该类时传递 dataset
参数时出现了 TypeError
异常。
我选择了添加参数到构造函数: dataset
参数确实是必要的,需要修改 M3FENDTrainer
类的构造函数,使其能够接收和处理 dataset
参数。
首先,在 m3fend.py
文件中找到 Trainer
类的构造函数 (__init__
)。在参数列表中添加 dataset
参数,并在函数体内处理它。以下是处理后的代码:
两处修改,增加了dataset形参,增加了self.dataset = dataset
这样就能在实例化 M3FENDTrainer
对象时传递 dataset
参数了。
接下来会继续报NameError: name 'dataset' is not defined,把错误交给ChatGPT,根据提示修改
def __init__(self, emb_dim, mlp_dims, use_cuda, lr, dropout, train_loader, val_loader,
test_loader, category_dict, weight_decay, save_param_dir, semantic_num, emotion_num,
style_num, lnn_dim, dataset, early_stop=5, epoches=100):
self.lr = lr
self.weight_decay = weight_decay
self.use_cuda = use_cuda
self.train_loader = train_loader
self.test_loader = test_loader
self.val_loader = val_loader
self.early_stop = early_stop
self.epoches = epoches
self.category_dict = category_dict
self.use_cuda = use_cuda
self.emb_dim = emb_dim
self.mlp_dims = mlp_dims
self.dropout = dropout
self.semantic_num = semantic_num
self.emotion_num = emotion_num
self.style_num = style_num
self.lnn_dim = lnn_dim
self.dataset = dataset # 新添加的参数
if os.path.exists(save_param_dir):
self.save_param_dir = save_param_dir
else:
self.save_param_dir = save_param_dir
os.makedirs(save_param_dir)
(2)OSError: Can't load weights for 'hfl/chinese-bert-wwm-ext'.
这个错误表明 Hugging Face 模型 `hfl/chinese-bert-wwm-ext` 无法正确加载。可能的原因包括:模型标识符错误、网络连接问题、或路径错误。
根据这句报错
File "F:\PycharmProjects\zdy1\M3FEND-main\models\m3fend.py", line 93, in __init__
self.bert = BertModel.from_pretrained('hfl/chinese-bert-wwm-ext').requires_grad_(False)
可以找到
这两句代码是尝试从 Hugging Face 模型库中加载预训练的 BERT 模型(hfl/chinese-bert-wwm-ext
)和 RoBERTa 模型(roberta-base
)。它们与报错直接相关,因为报错表明模型 hfl/chinese-bert-wwm-ext
无法正确加载。
具体来说,这两行代码的含义是:
- if self.dataset == 'ch':
- 如果
dataset
是'ch'
(表示使用中文数据集),则从 Hugging Face 模型库加载hfl/chinese-bert-wwm-ext
模型,并将其设置为不可训练状态(冻结其参数)。
- 如果
- elif self.dataset == 'en':
- 如果
dataset
是'en'
(表示使用英文数据集),则从 Hugging Face 模型库加载roberta-base
模型,并将其设置为不可训练状态(冻结其参数)。
- 如果
手动下载模型,访问'https://huggingface.co/models',在models页面搜索相关模型,即hfl/chinese-bert-wwm-ext和roberta-base
(3)AssertionError: Torch not compiled with CUDA enabled
报错信息表明当前的 PyTorch 版本没有启用 CUDA 支持。
①确认 GPU 是否可用
在 Python 环境中运行以下代码以确认 PyTorch 是否检测到了 GPU:
import torch
print(torch.cuda.is_available())
如果输出为 `True`,则表示 GPU 可用。如果输出为 `False`,则表示 GPU 不可用或 CUDA 未正确安装。
②如果确定 GPU 不可用,需要将所有依赖 CUDA 的代码修改为在 CPU 上运行。这里是如何修改 `M3FENDModel` 类的构造函数,以便在 GPU 不可用的情况下在 CPU 上运行。
1. 移除所有 `.cuda()` 调用
2. 使用 `.to(device)` 调用来确保在 GPU 可用时仍可以运行在 GPU 上
③根据提示,要求我修改
(1)m3fend.py 文件中的 train 函数: def train(self, logger = None);
(2)main.py
文件中的内容;
(3)grid_search.py
文件中。
但是根据实际情况,我只使用了(1)和(2)。