Perfee's Blog

成功只有一个——按照自己喜欢的方式,去度过人生。

0%

卷积神经网络文本分类(TextCNN)

TextCNN出处

论文:Convolutional Neural Networks for Sentence Classification

TextCNN原理

CNN卷积神经网络原多用于计算机视觉领域,TextCNN针对CNN的输入层做了一些变形,传统的CNN网络相比网络结构上没有任何变化, textCNN 使用一层卷积,一层max-pooling, 最后将输出外接softmax 来多分类。

TextCNN模型结构

TextCNN只能输入文本上纵向滑动,因为每个单词的embedding长度固定,不能截断。Filter的宽度要与输入向量一致,不同的Filter高度不一样。

TextCNN与经典CNN区别

  • 图像是二维数据, 图像的卷积核是从左到右 从上到下进行滑动来进行特征抽取
  • 文本是一维数据, 虽然经过word-embedding 生成了二维向量,但是对词向量只能做从上到下,做从左到右滑动来进行卷积没有意义
  • 卷积核的设计与经典CNN不同,文本卷积宽度的固定的,卷积核的宽度就是就embedding的维度,必须包含完整词向量这样才有意义。

TextCNN详细训练过程

  • 将句子的每个次转换为词向量假设维度为k
  • 将每个句子经过padding后转换后维度都为n与词向量形成一个n*k的矩阵
    卷积层:
  • 选取不同类型的卷积核,这里卷积核大小为横向维度只能为词向量维度,纵向维度代表着卷积核包含词向量的个数,比如我们选取【3,4,5】
  • 在纵向移动做卷积操作,每个卷积核形成一个向量
    池化层:
  • 采用max-pooing方法取每个卷积核形成的向量的最大值
    全连接+soft-max:
  • 将池化层的输出进行全连接
  • 连接一个soft-max输出的结果作为分类结果

    基于TensorFlow 2.x实现TextCNN模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from tensorflow.keras import Input, Model
from tensorflow.keras.layers import Dense, Conv1D, Embedding, Concatenate, GlobalMaxPooling1D


class TextCNN(object):
def __init__(self, max_len, max_features, embedding_dims,
class_num=5,
activation='softmax'):
self.max_len = max_len
self.max_features = max_features
self.embedding_dims = embedding_dims
self.class_num = class_num
self.activation = activation

def build_model(self):
input = Input((self.max_len,))
embedding = Embedding(self.max_features, self.embedding_dims, input_length=self.max_len)(input)
convs = []
for kernel_size in [3, 4, 5]:
c = Conv1D(128, kernel_size, activation='relu')(embedding)
c = GlobalMaxPooling1D()(c)
convs.append(c)
x = Concatenate()(convs)

output = Dense(self.class_num, activation=self.activation)(x)
model = Model(inputs=input, outputs=output)
return model