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))
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))
'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