参考博客:
1.下载kaggle数据集,并进行文本预处理:
1 | # 导入相应的包 |
2.token编码、padding操作、切分数据集
也就是建立onehot向量,这里只取频率排行前6000个单词构建词典,令max_features = 6000; 然后将每个样本(句子)定为长度130(不够长补0,多余截断)
1 | max_features = 6000 |
3.整理好数据后,采用TensorFlow中的CNN模型或者TextCNN模型进行训练
1 | import pandas as pd |
4.训练结果(在colab上训练):

5.模型理解:
这里可以通过model.summary或者keras中的plot_model来输出模型整体结构,帮助理解,plot_model报错踩坑
尤其是像这种有concatenate函数合并的结构,图形可视化很直观,方便学习。
1 | main_input = Input(shape=(50,), dtype='float64') |
相比于图像领域的CNN,文本处理中的TextCNN有一定的差异,第一是在维度上面,由图二(普通CNN):每一个卷积核宽度就是每个词向量的长度,从上向下滑动,没有图像领域中的横向滑动,故调用Conv1D,每次滑动几个单词就是卷积核的高度,如图三:三种不同高度的卷积核,能够每次读取不同相邻个数的单词,这里有点像n-gram的感觉,不同高度的卷积核能够提取不同的特征,而这些特征恰好能够体现词与词之间的关联,
图一中:每一层的第一个维度是None,这里的None就是你的batchsize,每次处理的样本个数,因为这个参数是在model.fit中定义,所以这里显示none;
输入层:维度为batchsize $\times$ input_length ,input_length就是我们的一个句子的长度,就像图二中 输入层左边从上到下就是一句话,一个句子就是一个样本。
embedding层:将batchsize $\times$ input_length输入embedding层中,embedding层的参数300,就是我们想要每个词向量维度变成的长度,为什么要这么做呢?因为如果每个词都是用onehot向量,那么整个单词词典有多长,词向量就有多长,这样第一:计算能力要求会非常高,当词典无限大的时候也没法办了,第二:onehot向量只体现了词频,无法体现语义上的含义,我们更希望采用一个低维的向量来刻画单词本身,embedding的作用就是降维,当输入之后,embedding层用input_length $\times$(len(vocab)+1) 来与 (len(vocab)+1)$\times$300相乘,就将每个句子变成了:input_length $\times$300的矩阵,从而实现词向量的降维,而这一层刚开始就是起到初始化的作用。这里不同于word2vec的是:word2vec的目的是训练词向量,而embedding是训练词向量的一种方式,或者说在整个模型任务达到收敛后,embedding层训练出来的词向量就是切合任务需求的(这里模型后面层可能是二分类,也可能是多分类或者等等任务)。
卷积层:这里TextCNN设置了3、4、5的三个不同高度的卷积核,每次滑动的时候进行向量乘法,padding选为same就是让卷积之后得到的长度和原来长度(50)一致,举例:当卷积核高度为3时,步长为1向下滑动,每滑动一次生成一个向量值,那么要保证前后长度都为50的话,就要在原来的50长度下面加2个padding值。
池化层:参数中如果不特别设定步长,keras默认和池化大小(pool_size)相同,定为48就是因为没算padding的0.
