论文地址: https://aclanthology.org/2021.acl-short.64.pdf
论文代码地址:https://github.com/IsakZhang/Generative-ABSA
假设你已经进入创建好的的虚拟环境中:
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
2.根据read.md安装对应环境
pip install transformers==4.0.0
pip install sentencepiece==0.1.91
pip install pytorch_lightning==0.8.1
3.运行文件main.py测试代码:
问题1:
main.py: error: the following arguments are required: --task, --dataset, --paradigm
参考博客:https://blog.csdn.net/qq_45056135/article/details/123991879
解决方法:找到这三个required=true的属性的default, 如下图
default分别为uabsa, rest14, annotation
1.复制代码:
--task "uabsa" --dataset "rest14" --paradigm "annotation"
Run---->Edit configuratioins–>找到main.py---->Parammeters—>将复制好的代码填入配置 点击ok保存退出
配置成功;继续运行main.py文件
ImportError: cannot import name 'SAVE_STATE_WARNING' from 'torch.optim.lr_scheduler' (/home/wjg/anaconda3/envs/ABSA/lib/python3.7/site-packages/torch/optim/lr_scheduler.py)
解决方法:
解决方法参考博客:https://blog.csdn.net/qq_43060870/article/details/117194738
**方法1:**更新transformers版本,运行如下代码(你也可以更新其他版本的比这个高就行)
pip install transformers==4.3.0
**方法2:**说是pytorch版本太高(太麻烦不推荐)
降低torch的版本为1.7.1即可
ModuleNotFoundError: No module named 'editdistance'
解决方法:
pip install editdistance
继续运行main.py代码显示正常测试部分是没问题了:
4. 训练模型:将args.do_train置为true模型:
代码第35行:ture改成false启动训练方法
parser.add_argument("--do_train", action='store_true', help="Whether to run training.")
改成:
parser.add_argument("--do_train", action='store_false', help="Whether to run training.")
之后运行代码:
问题4:TypeError: object of type 'int' has no len()
问题原因: self.hparams.n_gpu
是一个int类型没有len方法
解决方法:
找到报错代码行
将代码
len(self.hparams.n_gpu)
改为:
self.hparams.n_gpu
此时即可正常运行:
但是默认使用cpu运行:
如果想使用gpu找到如下代码42行(或者是附近)
parser.add_argument("--n_gpu", default=0)
将default值改为大于0即可推荐为1:(不然可能汇报其他错误)
5.验证模型将刚刚训练的部分 action='store_true’将要测试的部分action='store_false’如下图所示
将代码
parser.add_argument("--do_eval", action='store_true', help="Whether to run training.")
改为:
parser.add_argument("--do_eval", action='store_false', help="Whether to run training.")
验证模型:
同样将代码:
parser.add_argument("--do_eval", action='store_true', help="Whether to run eval on the dev/test set.")
改为:
parser.add_argument("--do_eval", action='store_false', help="Whether to run eval on the dev/test set.")
修改完后运行代码
问题5:TypeError: evaluate() missing 1 required positional argument: 'sents'
找到报错行332:
大概意思是缺一个参数sents:
经过观察发现下面377
行附近有类似的获取sents的方法:
所以将源代码;
dev_result = evaluate(dev_loader, model, args.paradigm, args.task)
改为:
sents, _ = read_line_examples_from_file(f'data/{args.task}/{args.dataset}/dev.txt')
dev_result = evaluate(dev_loader, model, args.paradigm, args.task, sents)
继续运行main.py代码
如下有结果了, 说明离成功不远了 但是还是有错误:
Traceback (most recent call last):
File "/home/wjg/workspace/GAS/main.py", line 334, in <module>
if dev_result['f1'] > best_f1:
TypeError: tuple indices must be integers or slices, not str
大概意思是说dev_result是一个元组类型而不是字典, dev_result['f1']
这样是错的
打印一下dev_result看看
确实是一个元组类型不能直接取f1;
({'precision': 0.6371681415929203, 'recall': 0.6545454545454545, 'f1': 0.6457399103139014}, {'precision': 0.6430678466076696, 'recall': 0.6606060606060606, 'f1': 0.6517189835575485})
先查看一下evaluate的返回值有两个 而dev_result, 返回值有两个, 就不可能是字典类型;
解决方法:类似于问题5的处理通过观察发现do_direct_eval(386行附近)里面的代码是这样处理的:
所以将我们代码:
dev_result = evaluate(dev_loader, model, args.paradigm, args.task, sents)
改为:
_, dev_result = evaluate(dev_loader, model, args.paradigm, args.task, sents) #_可以换成其他的变量名反正这里不用
接着运行main.py代码
问题7:这个问题出现过, 和问题56一样
TypeError: evaluate() missing 1 required positional argument: 'sents'
解决方法:
只需要将代码:
test_result = evaluate(test_loader, model, args.paradigm, args.task)
改为:
sents, _ = read_line_examples_from_file(f'data/{args.task}/{args.dataset}/test.txt') # 注意这里是test.txt
_, test_result = evaluate(test_loader, model, args.paradigm, args.task)
运行之后就可以正常跑了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)