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
|