Tensorflow2.0 text-cnn 实践练习

1.前 言

接着上篇,今天主要介绍利用TensorFlow2.0 进行英文文本分类,模型使用基本的CNN框架,后续会对这个框架深入展开。

2.数据准备


#引入需要用的包;

import tensorflow as tf

from tensorflow.keras import layers

import matplotlib.pyplot as plt

#定义一些超参数;

vocab_size=10000        #词库大小

seq_length=300          #句子最大长度

vocab_dim=100          #词的emedding维度

num_classes=2          #分类类别

#载入数据,使用TensorFlow自带的imdb英文数据集,训练集有25000,label个数为2(0,1);

(train_x, train_y), (test_x, test_y)=tf.keras.datasets.imdb.load_data(num_words=vocab_size)

#数据padding处理;

train_x = tf.keras.preprocessing.sequence.pad_sequences(train_x, value=0, padding='post',maxlen=seq_length)

test_x = tf.keras.preprocessing.sequence.pad_sequences(test_x,value=0, padding='post', maxlen=seq_length)

3.模型构建


#先构建Embedding层,然后使用256个卷积核,核大小2进行卷积,然后加一个全局最大池化层,接着加一个dropout层,最后加一个softmax分类层;
model = tf.keras.Sequential()

model.add(layers.Embedding(vocab_size, vocab_dim))

model.add(layers.Conv1D(filters=256,kernel_size=2,kernel_initializer='he_normal',

                        strides=1,padding='VALID',activation='relu',name='conv'))

model.add(layers.GlobalMaxPooling1D())

model.add(layers.Dropout(rate=0.5,name='dropout'))

model.add(layers.Dense(num_classes,activation='softmax'))

print(model.summary())


模型概况

4.模型编译和训练


#使用稀疏性的多分类损失(label不用one_hot的形式),优化方法使用Adam,评价方法是accuracy;

model.compile(loss='sparse_categorical_crossentropy',optimizer=tf.keras.optimizers.Adam(),metrics=['accuracy'])

#训练8轮,batch_size为128,训练集中10%作为验证集,训练结果如下图,在验证集上最好的结果为98.96%;

history=model.fit(train_x,train_y,epochs=8,batch_size=128,verbose=1,validation_split=0.1)

训练结果

#图示化训练和验证准确率变化

plt.plot(history.history['acc'])

plt.plot(history.history['val_acc'])

plt.legend(['training', 'valiation'], loc='upper left')

plt.show()

训练集准确率和验证集准确率变化

5.结 语


训练中发现,验证集上的准确率呈现一直下降趋势,而训练集一直上升,表明有点过拟合;另外验证集取得最好结果在第一次epoch,表明可能学习率过大,每轮decay下会更好些。此外,因为这个数据集特征比较明显,随便一个模型就能跑出很好的效果,接来下会找一个有一定挑战的中文数据集进行实践。

你可能感兴趣的:(Tensorflow2.0 text-cnn 实践练习)