要想在中文情感分类任务中完成bert语言模型的微调,需要有bert开源的代码,然后在bert开源数据中下载chinese_L-12_H-768_A-12,最后还要有中文情感数据,数据格式为(类别id\t句子)。如果bert代码和中文情感数据没有,可以在我分享的资源中下载。如果三者都有了按照以下操作即可完成微调,并对微调后的模型进行使用。
run_classifier.py中找到
processors = {
"cola": ColaProcessor,
"mnli": MnliProcessor,
"mrpc": MrpcProcessor,
"xnli": XnliProcessor,
"intentdetection":IntentDetectionProcessor,
"emotion":EmotionProcessor, #新加上这一行,emotion是在运行时用来调用的方法名,EmotionProcessor是你自己声明的类。
}
然后在该文件中增加一个class,这个类名和你刚刚声明的那个“emotion":EmotionProcessor, 保持一致:
class EmotionProcessor(DataProcessor):
"""Processor for the MRPC data set (GLUE version)."""
def get_train_examples(self, data_dir):
"""See base class."""
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "fine_tuning_train_data.tsv")), "train") #此处的名字和文件夹中的训练集的名字要保持一致
def get_dev_examples(self, data_dir):
"""See base class."""
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "fine_tuning_val_data.tsv")), "dev")
def get_test_examples(self, data_dir):
"""See base class."""
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "fine_tuning_test_data.tsv")), "test")
def get_labels(self):
"""See base class."""
return ["0", "1","2","3","4","5","6"] #七分类则从0到6
def _create_examples(self, lines, set_type):
"""Creates examples for the training and dev sets."""
examples = []
for (i, line) in enumerate(lines):
if i == 0:
continue
guid = "%s-%s" % (set_type, i)
if set_type == "test":
label = "0"
text_a = tokenization.convert_to_unicode(line[0])
else:
label = tokenization.convert_to_unicode(line[0])
text_a = tokenization.convert_to_unicode(line[1])
examples.append(
InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
return examples
最后直接调用即可,运行的命令如下:
python run_classifier.py \
--task_name=emotion \#同第一段代码最后一行
--do_train=true \
--do_eval=true \
--data_dir=data \ #把中文情感数据解压到同一级的文件夹中,此处是该文件夹名字data
--vocab_file=chinese_L-12_H-768_A-12/vocab.txt \ #中文数据要微调的原始bert模型,这个自行下载,和run_classifier.py放同一级的路径
--bert_config_file=chinese_L-12_H-768_A-12/bert_config.json \
--init_checkpoint=chinese_L-12_H-768_A-12/bert_model.ckpt \
--max_seq_length=128 \
--train_batch_size=32 \
--learning_rate=2e-5 \
--num_train_epochs=3.0 \
--output_dir=output #生成文件所在的文件夹
(上面的注释自己去掉)
大概9个小时,最后文件夹中会有三个文件 后缀分别为:index / meta / 00000-of-00001,
分别将这个改成bert_model.ckpt.index / bert_model.ckpt.meta / bert_model.ckpt.data-00000-of-00001,再在同一个文件夹中放入chinese_L-12_H-768_A-12中的vocab.txt和bert_config.json 即最后该文件夹中有5个文件。然后像调用chinese_L-12_H-768_A-12一样将文件夹名改成自己的文件夹名即可。
bert-serving-start -model_dir output -num_worfer=3 即可调用微调后的语言通用模型。