【问题标题】:BERT with train, dev, test, predicion mode具有训练、开发、测试、预测模式的 BERT
【发布时间】:2020-03-11 19:20:39
【问题描述】:

我正在使用 BERT 进行文本分类任务。我基本上使用run_classifier.py。 此代码使用 train.tsv 和 dev.tsv(带标签)来微调 BERT,并使用 test.tsv(不带标签)进行预测。但是,我需要使用 train-dev-test 拆分来训练模型(训练集),计算超参数和损失函数(开发集),并评估性能(测试集)。作为常规的 train-dev-test 拆分都包含标签。 我还有第四个未标记的数据集来进行预测。你知道任何使用 4 种模式(train-dev-test-prediction)实现 BERT 的存储库吗?

【问题讨论】:

    标签: classification bert-language-model


    【解决方案1】:

    我们可以定义一种方法,该方法获取不同数据集的路径并返回可用于训练、测试和验证目的的转换后的数据集。关键是transformation 方法。

    下面是一个为 IMDB 情感分析生成测试和训练的 sn-p(使用 keras-bert)。注意进行转换的load_data

    dataset = tf.keras.utils.get_file(
        fname="aclImdb.tar.gz", 
        origin="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz", 
        extract=True,
    )
    
    token_dict = {}
    with codecs.open(vocab_path, 'r', 'utf8') as reader:
        for line in reader:
            token = line.strip()
            token_dict[token] = len(token_dict)
    
    tokenizer = Tokenizer(token_dict)
    
    def load_data(path, tagset):
        global tokenizer
        indices, sentiments = [], []
        for folder, sentiment in tagset:
            folder = os.path.join(path, folder)
            for name in tqdm(os.listdir(folder)):
                with open(os.path.join(folder, name), 'r') as reader:
                      text = reader.read()
                ids, segments = tokenizer.encode(text, max_len=SEQ_LEN)
                indices.append(ids)
                sentiments.append(sentiment)
      
        items = list(zip(indices, sentiments))
        np.random.shuffle(items)
        indices, sentiments = zip(*items)
        indices = np.array(indices)
        mod = indices.shape[0] % BATCH_SIZE
        if mod > 0:
            indices, sentiments = indices[:-mod], sentiments[:-mod]
        return [indices, np.zeros_like(indices)], np.array(sentiments)
      
    train_path = os.path.join(os.path.dirname(dataset), 'aclImdb', 'train')
    test_path = os.path.join(os.path.dirname(dataset), 'aclImdb', 'test')
    
    tagset = [('neg', 0), ('pos', 1)]
    id_to_labels = {0: 'negative', 1: 'positive'}
    train_x, train_y = load_data(train_path, tagset)
    test_x, test_y = load_data(test_path, tagset)
    

    有关输入输出和完整实现的详细信息(以及一般使用 BERT 微调的文本分类)请参阅:Text Classification Using BERT Fine Tuning: Understandinginput to keras-bert。它为 20 个新闻组、IMDB 情绪分析和有毒评论分类提供二进制、多类和多标签文本分类的有效 Google Colab GPU 实现,并使用单独的训练和测试集。

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 2022-10-19
      • 2023-03-08
      • 2019-11-10
      • 2018-08-19
      • 1970-01-01
      • 2018-07-29
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多