tensorflow BERT学习记录--使用自己的训练集--run_classifier.py

 tensorflow bert github 上有tensorflow bert的源代码和预训练模型的下载链接

该仓库里的run_classifier.py 用于fine-tuning以及推理,官方的BERT库里,只需要修改run_classifier.py即可完成对新数据集的fine-tuning和推理, 该文件里的代码主要是以下几块:

  • 训练参数Flags的定义, 没什么好说的, 官方的注释很容易理解,

其中的"bert_config_file"和"vocab_file" 是来自于训练好的bert模型输出, bert_config_file包含了BERT模型的一些超参(层数,词汇数量等), vocab_file是所有词源的token列表,官方的"uncased_L-12_H-768_A-12" 模型的vocab.txt里包含了wordpiece token,标点,数字(1000以内的整数貌似都包含在内了),希腊字母,部分中文,[CLS], [SEP], [MASK],[PAD]标记等.

  • 用于输入数据规范化的类:InputExample, PaddingInputExample,InputFeatures

  • text_a是上句, text_b是下句,如果是单句任务,如文本分类,则没有text_b.
  • PaddingInputExample是用于数据不够组成一个batch时padding用的假Example.
  • InputFeature 由函数convert_single_example从InputExample转来, convert_single_example中主要是将序列token化(如果序列是语句),然后将得到的token序列转换成vocab.txt列表中对应的id序列, 即 input_ids, 相当于id表示字词+token buff. 另外mask_ids表示是否为PaddingInputExample, segment_ids表示是句1还是句2, 我的任务是用100条信号预测下一条信号,于是label_id是下一条信号ID.在我的任务中,我的输入序列本身就是信号ID值,所以不需要使用convert_single_example, 而是直接在file_based_convert_examples_to_features中将序列写成features(见下文).
  • 数据文件读取的类DataProcessor, 官方自带了4个不同数据集(Xnli, Mnli, Mrpc和Cola)的子类

  • 如果想使用新的数据集fine-tuning,可以定义一个新的子类,在子类的方法里将数据文件读取成需要的形式, 如对于10分类的任务,get_labels()函数里应该有10个标记.
  • DataProcessor配合函数file_based_convert_examples_to_features使用. file_based_convert_examples_to_features是为了将输入文件数据转成TFRecord格式待用. 源代码中对4种任务使用了统一的处理, 如果新数据集的格式和这些数据集不同, 可以先新数据集文件转成相同格式,或直接在file_based_convert_examples_to_features函数里定义新数据的处理方式. 用数据转成相应的InputFeature并写进TFRecoder文件即可.
  • main函数, 照葫芦画瓢,添加新数据对应的代码即可

  • 当inference时(推理,设置超参do_predict=True),会应用到estimator_lib.Estimator 的predict函数, TPUEstimator是从Estimator里派生的.

predict函数会将tfrecord格式的数据(由samples转成的features)使用

features, input_hooks = self._get_features_from_input_fn(input_fn, model_fn_lib.ModeKeys.PREDICT)

函数解析出来, 这个features和写进tfrecord之前的形式一样,不过是tensor形式,需要使用sess.run()得出value (详见tensorflow Estimator.predict源代码)

tip: input_fn是外面输入的用于生成features的函数, 如run_classifier里的file_based_input_fn_builder 


tips:

  • token_type_ids/type_vocal_size 值为0表示上句, 值为1表示下句, 对于对句(问答)情况,有两种id; 对于单句情况,只有一种id:

    # (a) For sequence pairs:
    #  tokens:   [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP]
    #  type_ids: 0     0  0    0    0     0       0 0     1  1  1  1   1 1
    # (b) For single sequences:
    #  tokens:   [CLS] the dog is hairy . [SEP]
    #  type_ids: 0     0   0   0  0     0 0

 

你可能感兴趣的:(nlp,深度学习,Tensorflow)