前言
本次图网络学习笔记主要是百度PGL团队的七日优质免费课程,主要参考自这里:图神经网络7日打卡营.
本次课程包含了很多内容:图游走来算法,图神经算法,尤其是NLP的预训练模型为基础的应用的ERNIESAGE模型取得了很好的效果,这里作为基础先记录一下ERNIE的实践过程。学习原理可参考:PPT.
主要实践内容
实践内容参考自持续学习语义理解框架ERNIE.首先要安装
pip install paddle-ernie
下面是部分代码与补充解释。
- 模型初始化
# 导包import numpy as npimport pandas as pdfrom sklearn.metrics import f1_score, accuracy_scorefrom sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import train_test_splitimport paddle as Pimport paddle.fluid as Fimport paddle.fluid.layers as Limport paddle.fluid.dygraph as Dfrom ernie.tokenizing_ernie import ErnieTokenizerfrom ernie.modeling_ernie import ErnieModelForSequenceClassification# 数据格式为:词汇 + 类别 的DF格式 列BATCH = 32 # 根据显存确定MAX_SEQLEN = 64EPOCH = 10lr = 5e-5 # learning_raten_class = 2 # 类别 假设为2分类D.guard().__enter__() # 启动动态图模式,这行是必须的!!!# 使用下载到本地的模型,默认是从网路下载,可能由于网络波动不一定每次都可以,下面是1.0版本ernie_path = r\'\\pre-training_model\\ERNIE\\model-ernie1.0.1\'tokenizer = ErnieTokenizer.from_pretrained(pretrain_dir_or_url=ernie_path)ernie = ErnieModelForSequenceClassification.from_pretrained(pretrain_dir_or_url=ernie_path, num_labels=n_class)optimizer = F.optimizer.Adam(lr, parameter_list=ernie.parameters())
- 接下来就是数据处理:
# 这里是makedata 和 get_batch_data 根据自己的需要设置自己的格式,参考源文档即可# 需要注意的是浮点型设置为float32,整型为int64,不然在数据类型上会报错
构造训练验证集,这里与源文档不一样
# 处理数据X = trains[\'file\']y = trains[\'label\']X_train,X_val,y_train,y_val=train_test_split(X.values,y.values,test_size=1/10,random_state=0)X_y_train = list(zip(X_train,y_train))X_y_val = list(zip(X_val, y_val))train_data = make_data(X_y_train)val_data = make_data(X_y_val)
接下来就是自己训练,如果训练完成后,需要保存模型,而不是每次预测都训练一遍,这里经过熬夜阅读源码发现,
if state_dict_path.with_suffix(\'.pdparams\').exists():m, _ = D.load_dygraph(state_dict_path.as_posix())for k, v in model.state_dict().items():if k not in m:log.warn(\'param:%s not set in pretrained model, skip\' % k)m[k] = v # FIXME: no need to do this in the futuremodel.set_dict(m)
可以使用:首先保存为pdparams文件:
F.save_dygraph(ernie.state_dict(),state_dir)
;然后下次加载的时候,有两种方式:
- 用自己的权重文件替换掉本地的路径下的权重文件;
- 先预加载与第一部分1)中一样,加载模型,然后使用自己的模型文件再次运行代码
ernie.set_dict(m)
。
这样模型就可以根据自己的下游任务如图分类,文本分类,推荐系统的任务,来保存模型,供下次预测。其实为了搞懂这里花了好久时间才看到源码这样加载参数文件的(自己太菜了),然后使用自己的方法和权重文件。
小结
对图神经的学习,主要有游走类,端到端的图神经包括图采样等,其中有个感触很大的是ERNIE在预训练模型领域的杰出表现,甚至超过了大火的BERT,以及基于ERNIE实现的ERNIESAGE图模型的效果,因此对ERNIE实践一番,顺便学学源码。本文主要讲了三点:1)数据处理时的数据类型要注意;2) 结合下游任务的模型权重的保存;3) 权重保存后的使用方法。
其他部分的讲解参考Paddle的官方链接应该就没有问题了。