bert源代码
准备工作:
- 下载bert代码
- 下载哈工大wwm预训练模型
- 数据集分为train、test(数据量大的话可以再分一个validation)
开始fine-tune:
- 数据读取:在run_classifier.py中更改DataProcesser基类(此基类预定义了数据读取的方法),因为源代码中为读取tsv,我们要改成读取自己的csv格式
- 我们的数据处理类加入到run_classifier.py文件中的main函数下面的processors字典中
- 开始训练:进入到bert-master的文件夹里,运行run_bert.sh(里面是fine tune的参数),如果参数里面加入了do_eval=true则在mytaskprocess中加入验证数据集;第一次实验的参数为
python run_classifier.py \
--task_name=mytask \
--do_train=true \
--do_eval=true \
--data_dir=$DATA_DIR/ \
--vocab_file=$BERT_BASE_DIR/vocab.txt \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--max_seq_length=64 \
--train_batch_size=16 \
--learning_rate=2e-5 \
--num_train_epochs=2.0 \
--output_dir=$DATA_DIR/ \
- 加入不同的指标,metric_fn函数,之前这个函数下只有loss和accuracy的计算,我们在这里加上auc,recall,precision的计算,然后加入到return的这个字典中就可以了。
开始预测:
- 准备test.csv文档
- 再生成一个predict.sh脚本,运行
- 生成一个全是预测概率的result.tsv文件
- 写一个zip脚本把label和概率合起来
- 测试集中的label不管是unknow还是原始的label对于结果没有任何不同。
keras-bert(填坑)
训练
使用keras训练bert的指导思想:文本分类的例子最典型了,最后加一个Dense层,把输出维度降至类别数,再进行sigmoid或softmax。
使用这种方法其实就是使用bert把词向量给抽出来,然后再自己加层来做分类
#加载bert
# 注意!!!!特别注意!!!此处要慎重,是绝对路径,以下内容是Bert-Pre-training
config_path = '/Users/williamssn/Desktop/知识们/深度学习/bert论文+资料/bert模型/预训练模型/google中文预训练模型(base)/bert_config.json'# 加载配置文件
checkpoint_path = '/Users/williamssn/Desktop/知识们/深度学习/bert论文+资料/bert模型/预训练模型/google中文预训练模型(base)/bert_model.ckpt'
dict_path = '/Users/williamssn/Desktop/知识们/深度学习/bert论文+资料/bert模型/预训练模型/google中文预训练模型(base)/vocab.txt'
# 以上是模型的加载,要慎重,一定要慎重!!!!!
maxlen=40 #句子的最大长度,padding要用的
#使用callback来生成f1,p,r指标
class Metrics(Callback):
def on_train_begin(self, logs={}):
self.val_f1s = []
self.val_recalls = []
self.val_precisio