示例#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',  # 级别, 嵌入类型, 还可以填'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))
示例#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': 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))
示例#3
0
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))
示例#5
0
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))
示例#6
0
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))