【NLP】文本分类TextCNN

一、理论

二、代码

TextRNN(tf2.0实现,主要使用其中的keras包)

from tensorflow.keras.layers import Dense, Embedding, Conv1D, Dropout,
                Flatten, MaxPooling1D, Input,concatenate

### 输入。
#shape:(句子长度,)。
##这一步的过程:假设180000个句子数据集,句子长度32,
数据需处理成这种形状再,32个词用词典中的索引(数字)表示,再输入网络。此时数据为(180000,32) 。
###

main_input = Input(shape=(sentence_len,), dtype=‘float64’)
 
### embedding层。
#vocab_size:词典大小,embedding_dim:embedding维度,input_length:句子长度(如果是使用该数据集预训练了词向量,则增加weights=[预训练的词向量矩阵],再加上trainable=False表示不再训练词向量)。
##这一步的过程:假设每批64个样本,句子长度32个词,词典大小为10000,embed300;这一步内部会先把180000个句子数据集分成每批64个样本(64,),再建立一个符合正态分布的随机矩阵(10000,300),然后每句话(即根据词典用数字表示的每句话,32个数字)从10000中选择各自的embed,得到的(32,300),然后结合。
此时数据为如(64,32,300)。
###

embed = Embedding(vocab_size, embedding_dim,
            input_length=sentence_len)(main_input)

 
###卷积层和pooling层。
Conv1D(num_filters, 3, padding=‘same’, strides=1, activation=‘relu’)(embed)
MaxPooling1D(pool_size=2)(cnn1)
Conv1D(num_filters, 4, padding=‘same’, strides=1, activation=‘relu’)(embed)
MaxPooling1D(pool_size=2)(cnn1)
Conv1D(num_filters, 5, padding=‘same’, strides=1, activation=‘relu’)(embed)
MaxPooling1D(pool_size=2)(cnn1)

 
###合并三个模型输出量,并铺平
cnn = concatenate([cnn1, cnn2, cnn3], axis=-1)
flat = Flatten()(cnn)

 
###Dropout层。
#dropout:0~1之间取值,如0.5则这一轮50%的数据不参与更新

drop = Dropout(dropout)(flat)
 
###Dense层输出预测结果。 
#num_classes:分类的数量,如5个文本类型则是5

main_output = Dense(num_classes, activation=‘softmax’)(drop)
 
###这种建立模型方式的特定用法
model = tf.keras.Model(inputs=main_input, outputs=main_output)
 
###模型编译(损失函数、优化器、监视)
model.compile(loss=‘categorical_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])
###查看模型
model.summary()
###训练模型(传入训练集、验证集、每轮的数据量、完整数据集训练多少次)
history = model.fit(x=train_x,y=train_y,
         validation_data=(dev_x, dev_y ),
         batch_size=512,
         epochs=10)

 
 
为什么使用Conv1D?

  • 一个句子embed,后是(32,300),kernel_size设为3、4、5,卷积步长为1,卷积核数设为256个。
  • 卷积的时候实际是以(3,300)、(4,300)、(5,300)进行卷积,所以Conv1D的kernel的shape为(3,300,256)、(4,300,256)、(5,300,256)(分别256个组合起来了)
    等同于使用神经网络进行了n_gram=3的特征提取了,也就是经过Conv1D后得到的结果为(32,256)
    因此使用卷积神经网络处理文本会非常快速有效。

使用Conv2D也可做

  • 但得把embed后的句子reshape成(32,300,1),kernel_size则设为(3,300)、(4,300)、(5,300)。(其实"1"就类比图像中的channel,在序列中channel为1,图像为3(RGB)
  • Conve2D的kernel的shape为(3,300,1,256)、(4,300,1,256)、(5,300,1,256),得到的结果为(32,1,256)

你可能感兴趣的:(NLP)