【深度学习】-Imdb数据集情感分析之模型对比(3)- CNN
【深度学习】-Imdb数据集情感分析之模型对比(2)- LSTM
【深度学习】-Imdb数据集情感分析之模型对比(1)- RNN
对之前内容感兴趣的朋友可以参考上面这几篇文章,接下来我要给大家介绍本篇博客的内容。为了观察CNN提取文本结构化的优势和LSTM提取上下文关系性的优势,我们将两种模型进行集成,引入了CNN-LSTM集成模型进行实验。先经过CNN层来提取局部特征,再使用LSTM层提取这些局部特征的长距离特征,再经变换输入全连接层,进行情感分析并打分量化,最后将两种模型的分数平均,从而得到最终分数。
CNN网络适合于提取数据的结构化信息,因此在特征工程中得到了广泛的应用,而LSTM网络更适合于提取数据的时间相关性和文本片段中的依赖项,有按时间顺序扩张的特性,广泛应用于时间序列中。同时,这给我们在情感分析任务上带来一个新思路,可以将两者结合,构建新的集成模型CNN-LSTM的对文本进行分类。模型结构如图所示:
与前文类似,详细请移步【深度学习】-Imdb数据集情感分析之模型对比(1)- RNN
数据预处理部分
filter_length = 5 # 滤波器长度
pool_length = 4 # 池化长度
max_features = 4000 # 词汇表大小
maxlen = 400 # 序列最大长度
embedding_size = 32 # 词向量维度
nb_filter = 32 # 1维卷积核个数
filter_length = 3 # 卷积核长度
hidden_dims = 256 # 隐藏层维度
model = Sequential()
model.add(Embedding(max_features, embedding_size, input_length=400)) # 词嵌入层
model.add(Dropout(0.2)) # Dropout层
lstm_output_size =32 # LSTM 层输出尺寸
# 1D 卷积层,对词嵌入层输出做卷积操作
model.add(Convolution1D(nb_filter=nb_filter,
filter_length=filter_length,
border_mode='valid',
activation='relu',
subsample_length=1))
# 池化层
model.add(MaxPooling1D(pool_length=pool_length))
# LSTM 循环层
model.add(LSTM(lstm_output_size))
# 全连接层,只有一个神经元,输入是否为正面情感值
model.add(Dense(1))
model.add(Activation('sigmoid')) # sigmoid判断情感
model.summary() # 模型概述
定义损失函数,优化器以及评估矩阵,并开始训练模型。
## 训练模型
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
train_history =model.fit(x_train, y_train,batch_size=32,
epochs=10,verbose=1,
validation_split=0.2)
import matplotlib.pyplot as plt
def show_train_history(train_history,train,validation):
plt.plot(train_history.history[train])
plt.plot(train_history.history[validation])
plt.title('Train History')
plt.ylabel(train)
plt.xlabel('Epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
show_train_history(train_history,'accuracy','val_accuracy')
show_train_history(train_history,'loss','val_loss')
print('Test score:', score)
print('Test accuracy:', acc)
因为博主的数据集删除了就不放可视化图片了,下次一定。
请参照我这篇博客下的模型预测代码。
【深度学习】-Imdb数据集情感分析之模型对比(3)- CNN
用测试集对模型的匹配精度进行评估
score, acc = model.evaluate(x_test, y_test,
batch_size=128)
model_json = model.to_json()
with open("D:/final_all/1/1.json", "w") as json_file:
json_file.write(model_json)
model.save_weights("D:/final_all/1/2.h5")
print("Saved model to disk")
CNN-LSTM模型训练总用时670s,训练集上的准确率为98.96%,在测试集上的准确率为90.02%,损失率在7.5%,是这几个模型中最优良的模型。
实验总结可以参照我的下一篇博客,有我的整个实验的对比分析以及总结。
https://blog.csdn.net/keeppractice/article/details/106145451