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', # 级别, 嵌入类型, 还可以填'xlnet'、'random'、 'bert'、 'albert' or 'word2vec" 'gpu_memory_fraction': 0.66, #gpu使用率 'model': {'label': 17, # 类别数 'batch_size': 16, # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大 'filters': [[10, 7, 5], [6, 4, 3]], # 3层的时候 # 'filters': [[10, 7], [5, 3]], # 2层的时候 # 'filters': [[5, 3], [4, 2]], #2层的时候 'filters_num': 300, # 卷积个数 text-cnn:300-600 'channel_size': 1, # CNN通道数 'dropout': 0.32, # 随机失活, 概率 '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': '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': [12], # bert取的层数 # 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址, 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(path_model_dir) 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))
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': 17, # 类别数 'batch_size': 256, # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大 'dropout': 0.5, # 随机失活, 概率 'decay_step': 100, # 学习率衰减step, 每N个step衰减一次 'decay_rate': 0.9, # 学习率衰减系数, 乘法 'epochs': 20, # 训练最大轮次 'patience': 3, # 早停,2-3就好 'lr': 1e-2, # 学习率, bert取5e-5,其他取1e-3,如果acc较低或者一直不变,优先调这个, 对训练会有比较大的影响, 如果准确率一直上不去,可以考虑调这个参数 '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向量等 'num_rnn_layers': 1, # rnn层数 'rnn_type': 'GRU', # rnn类型,可以填"LSTM","GRU","CuDNNLSTM","CuDNNGRU" 'rnn_units': 256, # rnn隐藏元 }, 'embedding': {'layer_indexes': [12], # bert取的层数 # 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址 }, '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))
def train(hyper_parameters=None, rate=1.0): """ 训练函数 :param hyper_parameters: json, 超参数 :param rate: 比率, 抽出rate比率语料取训练 :return: None """ if not hyper_parameters: hyper_parameters = { 'len_max': 32, # 句子最大长度, 固定 推荐20-50 'embed_size': 768, # 字/词向量维度 'vocab_size': 20000, # 这里随便填的,会根据代码里修改 'trainable': True, # embedding是静态的还是动态的, 即控制可不可以微调 'level_type': 'char', # 级别, 最小单元, 字/词, 填 'char' or 'word' 'embedding_type': 'xlnet', # 级别, 嵌入类型, 还可以填'xlnet'、'random'、 'bert' or 'word2vec" 'gpu_memory_fraction': 0.76, #gpu使用率 'model': { 'label': 17, # 类别数 'batch_size': 2, # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大 'filters': [2, 3, 4, 5], # 卷积核尺寸 'filters_num': 300, # 卷积个数 text-cnn:300-600 'channel_size': 1, # CNN通道数 'dropout': 0.5, # 随机失活, 概率 'decay_step': 1000, # 学习率衰减step, 每N个step衰减一次 'decay_rate': 0.9, # 学习率衰减系数, 乘法 'epochs': 20, # 训练最大轮次 'patience': 3, # 早停,2-3就好 'lr': 5e-5, # 学习率, 对训练会有比较大的影响, 如果准确率一直上不去,可以考虑调这个参数 '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': [0, 1, 24], # bert/xlnet取的层数,包括embedding层0,其他是正常的层 # 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址, keras-bert可以加载谷歌版bert,百度版ernie(需转换,https://github.com/ArthurRizar/tensorflow_ernie),哈工大版bert-wwm(tf框架,https://github.com/ymcui/Chinese-BERT-wwm) 'xlnet_embed': { 'attention_type': 'bi', # or 'uni' 'memory_len': 0, 'target_len': 32, }, }, '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))
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': 17, # 类别数 'batch_size': 32, # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大 # only VDCNN 'top_k': 2, # k-max pooling 'pool_type': 'max', # 池化选择, 可以选"max"、"avg"、"conv" 'shortcut': True, # resnet方案 # 论文参数, 长文本, long sentence, ,max_len=256 or 1024 ans so on 'filters': [[64, 1], [128, 1], [256, 1], [512, 1]], # 9 layer, 256 len max # 'filters': [[64, 2], [128, 2], [256, 2], [512, 2]], # 17 layer # 'filters': [[64, 5], [128, 5], [256, 2], [512, 2]], # 29 layer # 'filters': [[64, 8], [128, 8], [256, 5], [512, 3]], # 49 layer, 1024 len max # 自己设置的,效果不太佳, 短文本, short sentence, ,max_len=32 or 64 ans so on # 'filters': [[3, 8], [6, 8], [12, 5], [24, 3]], # 49 layer # 'filters': [[4, 8], [8, 8], [16, 5], [32, 3]], # 49 layer # 'filters': [[3, 1], [6, 1], [12, 1], [24, 1]], # 9 layer # 'filters': [[4, 1], [8, 1], [16, 1], [32, 1]], # 9 layer 'channel_size': 1, # CNN通道 'dropout': 0.32, # 随机失活, 概率 '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': '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': [12], # bert取的层数 # 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址 }, '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))
def train(hyper_parameters=None, rate=1.0): """ 训练函数 :param hyper_parameters: json, 超参数 :param rate: 比率, 抽出rate比率语料取训练 :return: None """ if not hyper_parameters: hyper_parameters = { 'len_max': 50, # 句子最大长度, 固定 推荐20-50 'embed_size': 768, # 字/词向量维度 'vocab_size': 20000, # 这里随便填的,会根据代码里修改 'trainable': True, # embedding是静态的还是动态的 'level_type': 'char', # 级别, 最小单元, 字/词, 填 'char' or 'word' 'embedding_type': 'random', # 级别, 嵌入类型, 还可以填'random'、 'bert' or 'word2vec" 'gpu_memory_fraction': 0.66, # gpu使用率 'model': { 'label': 17, # 类别数 'batch_size': 64, # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大 'dropout': 0.1, # 随机失活, 概率 'decay_step': 100, # 学习率衰减step, 每N个step衰减一次 'decay_rate': 0.9, # 学习率衰减系数, 乘法 'epochs': 50, # 训练最大轮次 'patience': 5, # 早停,2-3就好 'lr': 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_fineture': path_fineture, # 保存embedding trainable地址, 例如字向量、词向量、bert向量等 'path_hyper_parameters': path_hyper_parameters, # 模型(包括embedding),超参数地址, 'droupout_spatial': 0.25, 'encoder_num': 1, 'head_num': 12, 'hidden_dim': 3072, 'attention_activation': 'relu', 'feed_forward_activation': 'relu', 'use_adapter': False, 'adapter_units': 768, 'adapter_activation': 'relu', }, 'embedding': { 'layer_indexes': [12], # bert取的层数, # 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址 }, '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))
def train(hyper_parameters=None, rate=1.0): if not hyper_parameters: hyper_parameters = { 'len_max': 50, # 句子最大长度, 固定推荐20-50, bert越长会越慢, 占用空间也会变大, 小心OOM 'embed_size': 150, # 字/词向量维度, bert取768, word取300, char可以更小些 'vocab_size': 20000, # 这里随便填的,会根据代码里修改 'trainable': True, # embedding是静态的还是动态的, 即控制可不可以微调 'level_type': 'char', # 级别, 最小单元, 字/词, 填 'char' or 'word', 注意:word2vec模式下训练语料要首先切好 'embedding_type': 'random', # 级别, 嵌入类型, 还可以填'xlnet'、'random'、 'bert'、 'albert' or 'word2vec' # 'gpu_memory_fraction': 0.76, #gpu使用率 'model': { 'label': 17, # 类别数 'batch_size': 512, # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大 'filters': [3, 4, 5], # 卷积核尺寸 'filters_num': 300, # 卷积个数 text-cnn:300-600 'channel_size': 1, # CNN通道数 'dropout': 0.5, # 随机失活, 概率 'decay_step': 1000, # 学习率衰减step, 每N个step衰减一次 'decay_rate': 0.999, # 学习率衰减系数, 乘法 'epochs': 20, # 训练最大轮次 'patience': 6, # 早停,2-3就好 'activate_classify': 'softmax', # 最后一个layer, 即分类激活函数 'loss': 'categorical_crossentropy', # 损失函数 'metrics': 'accuracy', # 保存更好模型的评价标准 'optimizer_name': 'Adam', # 优化器, 可选['Adam', 'Radam', 'RAdam,Lookahead'], win10下必须使用GPU, 原因未知 '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': [24], # bert取的层数 }, '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(path_model_dir) 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))
def train(hyper_parameters=None, rate=1.0): """ 训练函数 :param hyper_parameters: json, 超参数 :param rate: 比率, 抽出rate比率语料取训练 :return: None """ if not hyper_parameters: hyper_parameters = { 'len_max': 50, # 句子最大长度, 固定 推荐20-50 'embed_size': 300, # 字/词向量维度 'vocab_size': 20000, # 这里随便填的,会根据代码里修改 'trainable': True, # embedding是静态的还是动态的, 即控制可不可以微调 'level_type': 'char', # 级别, 最小单元, 字/词, 填 'char' or 'word' 'embedding_type': 'random', # 级别, 嵌入类型, 还可以填'random'、 'bert' or 'word2vec" 'gpu_memory_fraction': 0.66, #gpu使用率 'model': { 'label': 17, # 类别数 'batch_size': 32, # 批处理尺寸, 感觉原则上越大越好,尤其是样本不均衡的时候, batch_size设置影响比较大 'filters': [2, 3, 4, 5], # 卷积核尺寸 'filters_num': 300, # 卷积个数 text-cnn:300-600 'channel_size': 1, # CNN通道数 'dropout': 0.5, # 随机失活, 概率 'decay_step': 100, # 学习率衰减step, 每N个step衰减一次 'decay_rate': 0.9, # 学习率衰减系数, 乘法 'epochs': 20, # 训练最大轮次 'patience': 3, # 早停,2-3就好 'lr': 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向量等 # only charCNN_kim 'char_cnn_layers': [[50, 1], [100, 2], [150, 3], [200, 4], [200, 5], [200, 6], [200, 7] ], # [[25, 1], [50, 2], [75, 3], [100, 4], [125, 5], [150, 6]]) # small 'highway_layers': 2, # highway_layers个数 'num_rnn_layers': 2, # num_rnn_layers个数 'rnn_type': 'LSTM', # rnn_type类型 'rnn_units': 650, # RNN隐藏层, large is 650, small is 300 'len_max_word': 30, # 最大词语长度, }, 'embedding': { 'layer_indexes': [12], # bert取的层数, # 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址 }, '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))
def train(hyper_parameters=None, rate=1.0): """ 训练函数 :param hyper_parameters: json, 超参数 :param rate: 比率, 抽出rate比率语料取训练 :return: None """ if not hyper_parameters: hyper_parameters = { 'len_max': 50, # 句子最大长度, 固定 推荐20-50 'embed_size': 96, # 字/词向量维度 'vocab_size': 20000, # 这里随便填的,会根据代码里修改 'trainable': False, # embedding是静态的还是动态的 'level_type': 'char', # 级别, 最小单元, 字/词, 填 'char' or 'word' 'embedding_type': 'random', # 级别, 嵌入类型, 还可以填'random'、 'bert' or 'word2vec" 'model': {'label': 17, # 类别数 'batch_size': 64, # 批处理尺寸 'filters': [3, 4, 5], # 卷积核尺寸 'filters_num': 300, # 卷积个数 text-cnn:300-600 'channel_size': 3, # CNN通道数 'dropout': 0.5, # 舍弃概率 'decay_step': 100, # 学习率衰减step, 每N个step衰减一次 'decay_rate': 0.9, # 学习率衰减系数, 乘法 'epochs': 20, # 训练最大轮次 'lr': 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向量等 'routings': 1, 'dim_capsule': 16, }, 'embedding': {'layer_indexes': [12], # bert取的层数, 'corpus_path': '', # embedding预训练数据地址,不配则会默认取conf里边默认的地址 }, '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))