Esempio n. 1
0
def train(hyper_parameters=None, rate=1.0):
    if not hyper_parameters:
        hyper_parameters = {
            'len_max':
            50,  # 句子最大长度, 固定推荐20-50, bert越长会越慢, 占用空间也会变大, 本地win10-4G设为20就好, 过大小心OOM
            'embed_size': 300,  # 字/词向量维度, bert取768, word取300, char可以更小些
            'vocab_size': 20000,  # 这里随便填的,会根据代码里修改
            'trainable': True,  # embedding是静态的还是动态的, 即控制可不可以微调
            'level_type':
            'char',  # 级别, 最小单元, 字/词, 填 'char' or 'word', 注意:word2vec模式下训练语料要首先切好
            'embedding_type':
            'random',  # 级别, 嵌入类型, 还可以填'random'、 'bert' or 'word2vec"
            'gpu_memory_fraction': 0.66,  #gpu使用率
            'model': {
                'label': 1070,  # 类别数
                'batch_size':
                32,  # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大
                'dropout': 0.5,  # 随机失活, 概率
                'decay_step': 100,  # 学习率衰减step, 每N个step衰减一次
                'decay_rate': 0.9,  # 学习率衰减系数, 乘法
                'epochs': 20,  # 训练最大轮次
                'patience': 3,  # 早停,2-3就好
                'lr':
                1e-3,  # 学习率, bert取5e-5, 其他取1e-3, 对训练会有比较大的影响, 如果准确率一直上不去,可以考虑调这个参数
                'l2': 1e-9,  # l2正则化
                'activate_classify':
                'sigmoid',  # 'sigmoid',  # 最后一个layer, 即分类激活函数
                'loss': 'categorical_crossentropy',  # 损失函数, 可能有问题, 可以自己定义
                'metrics':
                'top_k_categorical_accuracy',  # 1070个类, 太多了先用topk,  这里数据k设置为最大:33
                # 'metrics': 'categorical_accuracy',  # 保存更好模型的评价标准
                'is_training': True,  # 训练后者是测试模型
                'model_path': path_model,
                # 模型地址, loss降低则保存的依据, save_best_only=True, save_weights_only=True
                'path_hyper_parameters':
                path_hyper_parameters,  # 模型(包括embedding),超参数地址,
                'path_fineture':
                path_fineture,  # 保存embedding trainable地址, 例如字向量、词向量、bert向量等
            },
            'embedding': {
                'layer_indexes': [13],  # bert取的层数
                # 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址
            },
            'data': {
                'train_data': path_byte_multi_news_train,  # 训练数据
                'val_data': path_byte_multi_news_valid,  # 验证数据
            },
        }

    # 删除先前存在的模型和embedding微调模型等
    delete_file(path_model_dir)
    time_start = time.time()
    # graph初始化
    graph = Graph(hyper_parameters)
    print("graph init ok!")
    ra_ed = graph.word_embedding
    # 数据预处理
    pt = PreprocessTextMulti()
    x_train, y_train = pt.preprocess_label_ques_to_idx(
        hyper_parameters['embedding_type'],
        hyper_parameters['data']['train_data'],
        ra_ed,
        rate=rate,
        shuffle=True)
    print('train data propress ok!')
    x_val, y_val = pt.preprocess_label_ques_to_idx(
        hyper_parameters['embedding_type'],
        hyper_parameters['data']['val_data'],
        ra_ed,
        rate=rate,
        shuffle=True)
    print("data propress ok!")
    print(len(y_train))
    # 训练
    graph.fit(x_train, y_train, x_val, y_val)
    print("耗时:" + str(time.time() - time_start))
Esempio n. 2
0
def train(hyper_parameters=None, rate=1.0):
    if not hyper_parameters:
        hyper_parameters = {
            'len_max':
            50,  # 句子最大长度, 固定推荐20-50, bert越长会越慢, 占用空间也会变大, 本地win10-4G设为20就好, 过大小心OOM
            'embed_size': 768,  # 字/词向量维度, bert取768, word取300, char可以更小些
            'vocab_size': 20000,  # 这里随便填的,会根据代码里修改
            'trainable': True,  # embedding是静态的还是动态的, 即控制可不可以微调
            'level_type':
            'char',  # 级别, 最小单元, 字/词, 填 'char' or 'word', 注意:word2vec模式下训练语料要首先切好
            'embedding_type':
            'bert',  # 级别, 嵌入类型, 还可以填'random'、 'bert' or 'word2vec"
            'gpu_memory_fraction': 0.66,  #gpu使用率
            'model': {
                'label': 17,  # 类别数
                'batch_size':
                2,  # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大
                'dropout': 0.32,  # 随机失活, 概率
                'decay_step': 100,  # 学习率衰减step, 每N个step衰减一次
                'decay_rate': 0.9,  # 学习率衰减系数, 乘法
                'epochs': 20,  # 训练最大轮次
                'patience': 3,  # 早停,2-3就好
                'lr':
                5e-5,  # 学习率,bert取5e-5,其他取1e-3, 对训练会有比较大的影响, 如果准确率一直上不去,可以考虑调这个参数
                'l2': 1e-9,  # l2正则化
                'activate_classify': 'softmax',  # 最后一个layer, 即分类激活函数
                'loss': 'categorical_crossentropy',  # 损失函数
                'metrics': 'accuracy',  # 保存更好模型的评价标准
                'is_training': True,  # 训练后者是测试模型
                'model_path': path_model,
                # 模型地址, loss降低则保存的依据, save_best_only=True, save_weights_only=True
                'path_hyper_parameters':
                path_hyper_parameters,  # 模型(包括embedding),超参数地址,
                'path_fineture':
                path_fineture,  # 保存embedding trainable地址, 例如字向量、词向量、bert向量等
            },
            'embedding': {
                'layer_indexes': [1, 2, 3, 12,
                                  13],  # bert取的层数,1为embedding层,未处理
                # 'corpus_path': 'Y:/BaiduNetdiskDownload/DataSet/bert-model/chinese_bert_chinese_wwm_L-12_H-768_A-12', # embedding预训练数据地址,不配则会默认取conf里边默认的地址
                'corpus_path':
                'Y:/BaiduNetdiskDownload/DataSet/bert-model/baidu_ernie',
                # keras - bert可以加载谷歌版bert, 百度版ernie(需转换,https: // github.com / ArthurRizar / tensorflow_ernie), 哈工大版bert - wwm(tf框架,https: // github.com / ymcui / Chinese - BERT - wwm)
            },
            'data': {
                'train_data': path_baidu_qa_2019_train,  # 训练数据
                'val_data': path_baidu_qa_2019_valid  # 验证数据
            },
        }

    # 删除先前存在的模型和embedding微调模型等
    delete_file(path_model_dir)
    time_start = time.time()
    # graph初始化
    graph = Graph(hyper_parameters)
    print("graph init ok!")
    ra_ed = graph.word_embedding
    # 数据预处理
    pt = PreprocessText()
    x_train, y_train = pt.preprocess_label_ques_to_idx(
        hyper_parameters['embedding_type'],
        hyper_parameters['data']['train_data'],
        ra_ed,
        rate=rate,
        shuffle=True)
    x_val, y_val = pt.preprocess_label_ques_to_idx(
        hyper_parameters['embedding_type'],
        hyper_parameters['data']['val_data'],
        ra_ed,
        rate=rate,
        shuffle=True)
    print("data propress ok!")
    print(len(y_train))
    # 训练
    graph.fit(x_train, y_train, x_val, y_val)
    print("耗时:" + str(time.time() - time_start))
Esempio n. 3
0
                                     'epochs': 20,
                                     'len_max': 50,
                                     'vocab_size': 20000, #这里随便填的,会根据代码里修改
                                     'lr': 1e-3,
                                     'l2': 1e-6,
                                     'activate_classify': 'softmax',
                                     'embedding_type': 'random', # 还可以填'random'、 'bert' or 'word2vec"
                                     'is_training': True,
                                     'model_path': path_model_fast_text_baiduqa_2019,},
                        'embedding':{ 'embedding_type': 'random',
                                      'corpus_path': path_embedding_random_char,
                                      'level_type': 'char',
                                      'embed_size': 300,
                                      'len_max': 50,},
                         }
    time_start  = time.time()
    graph = Graph(hyper_parameters)
    ra_ed = graph.word_embedding
    pt = PreprocessText()
    x_train, y_train = pt.preprocess_baidu_qa_2019_idx(path_baidu_qa_2019_train, ra_ed)
    x_val, y_val = pt.preprocess_baidu_qa_2019_idx(path_baidu_qa_2019_valid, ra_ed)
    print(len(y_train))
    graph.fit(x_train, y_train, x_val, y_val)
    print("耗时:" + str(time.time()-time_start))

# 1425170/1425170 [==============================] - 648s 455us/step - loss: 0.8771 - acc: 0.7317 - val_loss: 1.2533 - val_acc: 0.7069
# Epoch 00001: val_loss improved from inf to 1.25335, saving model to D:\workspace\pythonMyCode\django_project\ClassificationTextChinese/data/model/fast_text/model_fast_text.f5
# Epoch 2/20
# TIME: 20 * 5轮= 100 (min)
# acc: 0.7317