使用的是Paddle框架2.0版本
网页: https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.1/demo/text_classification
也可以在其平台上利用公开数据集跑一跑:
网页:https://aistudio.baidu.com/aistudio/projectdetail/2390146?contributionType=1
使用的预训练框架是:Ernie-tiny
下面记录我自己的实验数据:
1. 记录预训练模型下载位置
下载的模型存储到这里了!! !
因为模型一般会定义一个位置提前加载预训练模型,这样就不会重复下载了! 只需要扫描并加载!
2. 语法出错合集
问题一:header: 是不是有第一行的标签!!!
是不是包含了头介绍:
就是是不是有第一行的标签!!!
问题二: KeyError
说明在读入数据时就出现了问题
造成这个问题的原因一般是没有该key!
仔细看下面的代码可以看出:
record[‘label’] = slef.label_map[example.label] !
再看看你的label定义:
label_list = ['城市事件类;宣传广告', '城市事件类;扩充类别', '城市事件类;街面秩序', '城市部件类;市政公用设施', '城市事件类;市容环境']
这是text不是label! 不出错才怪呢!
是这个函数有问题:
在该函数中,第一个先读的label! 第二读的text!
而自己的数据集第一列是text! 所以导致错误!
我们在base_NLP_dataset中将源码调整为label 是第一列! text文本是第二列! 但是这样是有问题的!
原因一: 我们pycharm中改正可能在linux下没有改正
原因二: 这样改正还是不行的!
解决方法: 修改自己的数据集,将两列互换!
下面是实现方法:
两列互换 DF yyds
import pandas
import pandas as pd
实现行列互换 DF yyds
path = "/home/wxx/progressfiles/project_pc_NLP/Texts_Classification/demodataset/dev.txt"
data = pandas.read_table(path)df = pd.DataFrame(data)print(df.head())
print(df["text_a"])df[['label', 'text_a']] = df[['text_a', 'label']]
df.columns = ['label', 'text_a']
print(df.head())
df.to_csv("/home/wxx/progressfiles/project_pc_NLP/Texts_Classification/demodataset/dev2.txt", sep="\t", index=0)
再次运行就没有问题了!
总结
一定要自己看出错信息!
要遵循源代码的输入输出格式! 看看它怎么读的! 明白数据的变化形式
问题三: 没有loaded from 。。。
3. 实验结果
第一次实验: 完全按照教程
效果不理想
第二次实验: 增大epoches、增大batch_size
这里是接着训练的:
这里训练了15次后,准确率提升了
第三次实验:再次训练35次!! 这次共训练了50次
第四次训练:直接拉满到200 epochs
上面都是过拟合了,这里才是最正确的
这里才是最关键的!!上面的都没有用到这里!
你在做的时候一定要看看是不是过拟合了!
如果损失很小,准确率极其高,那么就是过拟合了,这样的模型是不具有泛化能力的!
你用在测试文件中,效果肯定很差!!
采用最佳的:
取5次最佳:
4. 实验总结:
4.1 过拟合! 看看自己损失是不是太小! 准确率是不是太高了??
这样下去是过拟合的! 赶紧停下去寻找问题!
4.2 Paddle中model.pdparams才是我们的模型!! 写路径时要精确到它
4.3 最佳模型就是最佳模型,而且最终准确率也不会变
5. 在这里学到的其它知识:
https://blog.csdn.net/qq_35222729/article/details/120419015