Keras examples-imdb_cnn[利用卷积神经网络对文本进行分类]

1 任务描述

本实验室利用卷积神经网络对imdb数据进行文本分类

2 实验过程

(1)引入实验中所涉及到的包

数据集包、数据预处理包、网络模型包、网络各层结构所对应的包

1
2
3
4
5
6
7
from __future__ import print_function
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense,Dropout,Activation
from keras.layers import Embedding
from keras.layers import Conv1D,GlobalMaxPooling1D
from keras.datasets import imdb

(2)设置网络结构中的一些常数

主要包含了两方面的常数:一是数据处理过程中,词向量维度,词汇表长度等相关的参数;二是网络结构中参数

1
2
3
4
5
6
7
8
9
10
11
12
# 设置词汇表的长度,在数据预处理过程中,选择词汇字典中前max_features索引的词汇。
max_features=5000
# 将每个句子填充或截断至maxlen长度
maxlen=400
batch_size=32
# 设置词向量的维度
embedding_dims=50
filters=250
kernel_size=3
# 设置全连接层中,神经元的个数
hidden_dims=250
epochs=2

(3)加载数据与数据预处理

1
2
3
4
5
6
7
8
9
10
11
print("loading data...")
(x_train,y_train),(x_test,y_test)=imdb.load_data(num_words=max_features)
print(len(x_train),"train sequences")
print(len(x_test),"test sequences")

print("pad sequences (samples*time)")
# 将每一条数据填充至相同的长度
x_train=sequence.pad_sequences(x_train,maxlen=maxlen)
x_test=sequence.pad_sequences(x_test,maxlen=maxlen)
print("x_train.shape:",x_train.shape)
print("x_test.shape:",x_test.shape)
loading data...
25000 train sequences
25000 test sequences
pad sequences (samples*time)
x_train.shape: (25000, 400)
x_test.shape: (25000, 400)

(4)建立模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
print("Build model...")
# 采用序列模型
model=Sequential()
# 添加词嵌入层,词嵌入层只能作为神经网络的第一层
model.add(Embedding(max_features,embedding_dims,input_length=maxlen))
model.add(Dropout(0.2))
model.add(Conv1D(filters,kernel_size,padding="valid",activation='relu',strides=1))
# 使用maxpooling
model.add(GlobalMaxPooling1D())
# 添加全连接层
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))
# 输出层
model.add(Dense(1))
model.add(Activation("sigmoid"))

model.compile(loss="binary_crossentropy",optimizer='adam',metrics=['accuracy'])

model.fit(x_train,y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test,y_test))
Build model...
Train on 25000 samples, validate on 25000 samples
Epoch 1/2
25000/25000 [==============================] - 64s 3ms/step - loss: 0.4040 - acc: 0.8005 - val_loss: 0.3088 - val_acc: 0.8657
Epoch 2/2
25000/25000 [==============================] - 63s 3ms/step - loss: 0.2305 - acc: 0.9086 - val_loss: 0.2977 - val_acc: 0.8765

(5)网络结构

1
2
from keras.utils import plot_model
plot_model(model,to_file="./imdb_cnn.png")

网络结构

3 小结

这次实验采用了卷积神经网络来对文本数据进行分类。而不是使用以往的RNN(LSTM/BiLSTM等),这样实验下来,对keras中其他结构的使用也进一步熟悉。在本实验中,主要有以下几点收获:

(1)常用层的使用

常用层对应于core模块,其定义了一系列常用的网络层,在本次实验中主要用到了全连接层、激活层和Dropout层。这几层都比较简单,具体介绍见https://keras-cn.readthedocs.io/en/latest/layers/core_layer/

(2)一维卷积层

一维卷积即为时域卷积,用以在一维输入信号上进行邻域滤波。其原型为keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding=’valid’, dilation_rate=1, activation=None, use_bias=True, kernel_initializer=’glorot_uniform’, bias_initializer=’zeros’, kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
该层生成将输入信号与卷积核按照单一的空域(或时域)方向进行卷积。主要参数如下:
①filters:卷积核的数目(即输出的维度)
②kernel_size:整数或由单个整数构成的list/tuple,卷积核的空域或时域窗长度
③strides:整数或由单个整数构成的list/tuple,为卷积的步长。
④padding:补0策略,为“valid”, “same” 或“causal”,“causal”将产生因果(膨胀的)卷积,即output不依赖于input。
⑤activation:激活函数,为预定义的激活函数名。