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下会更好些。此外,因为这个数据集特征比较明显,随便一个模型就能跑出很好的效果,接来下会找一个有一定挑战的中文数据集进行实践。
网友评论