上节课我们提到,为了提高模型准确率,后面我们会把多标签和单标签两个模型结合,做成一个 pipline 的联合模型,所以我们先把之前的单标签模型,替换一下数据集,重新训练一个当前数据集对应的模型文件出来备用。同时,这个过程也是大家学完这个课程之后,用这个模型来训练自己的数据的流程,这里顺便给大家演示一下。
Bug修复
1、squeeze()导致的报错
max_pool2d 之后,输出 tensor.shape = [10, 256, 1, 1],之后的 squeeze(),正常情况下会压缩 tensor 的最后两维,变成 [10, 256]。但如果是我们的训练数据是101条,batch_size = 10,最后一次就只剩下一条数据,max_pool2d 输出 tensor.shape = [1, 256, 1, 1],再经过 squeeze(),会变成 [256],后续程序会报错,所以我们需要改为只压缩最后两维。
class TextCNN(nn.Module): def conv_and_pool(self, conv, input): return F.max_pool2d(out, (out.shape[2], out.shape[3])).squeeze(-1).squeeze(-1)
2、Python版本导致语法改动
如果 iter(dev_loader).next() 方法报错,可以修改为 next(iter(dev_loader))。
数据预处理
1、修改配置项
NUM_CLASSES = 12 TRAIN_SAMPLE_PATH = './data/output/train_question_sample.csv' TEST_SAMPLE_PATH = './data/output/test_question_sample.csv' LABEL_PATH = './data/input/label.txt'
2、label文本转数字函数
# process.py import pandas as pd from config import * from utils import * def label_to_id(string): _, label2id = get_label() label_texts = string.split('/') label_ids = [label2id[text] for text in label_texts] return '|'.join([str(id) for id in label_ids]) print(label_to_id('功效/不良反应'))
3、category文本转id
def trans_label(input_path, output_path): df = pd.read_excel(input_path) df['labels'] = df['category'].apply(label_to_id) df.to_csv(output_path, index=None) trans_label('./data/input/tb_question_label_1w.xlsx', TRAIN_SAMPLE_PATH) trans_label('./data/input/jd_question_label_2k.xlsx', TEST_SAMPLE_PATH)
4、统计长度
def count_text_len(): text_len = [] df = pd.read_csv(TRAIN_SAMPLE_PATH) for content in df['content']: text_len.append(len(content)) print(len([i for i in text_len if i>50])) print(len(text_len)) count_text_len()
经过以上处理之后呢,我们就把原始标注文件中的文本,转化成了 label_id,后面转换目标值,就可以直接调用 labels 了。
本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/506