上节课我们提到,为了提高模型准确率,后面我们会把多标签和单标签两个模型结合,做成一个 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://edu.ichenhua.cn/read/506