赞
踩
前面我们介绍了RNN、CNN等文本分类模型,并在情感分析任务上都取得了不错的成绩,那有没有想过将RNN、CNN两者进行融合呢?答案肯定是有的!这次,我们将介绍一个将LSTM和CNN进行融合的文本分类模型,该模型同时兼具了RNN和CNN的优点,在很多文本分类任务上直接超过了RNN和CNN单个模型的效果。论文的下载地址如下:
下面我们将对该模型的结构进行具体介绍,并用tensorflow来实现它。
作者在原论文中其实提出了两种类型的结构,一种是CNN_LSTM,一种是LSTM_CNN,但是作者发现CNN_LSTM的效果不如LSTM_CNN,这可能是因为先用CNN层的话,会使得句子中的序列信息丢失,这时,后面尽管再使用LSTM层,其实也没法充分发挥LSTM的序列编码能力,从而导致模型的效果相对比较一般,因此,这里我们不对CNN_LSTM的进行介绍,感兴趣的读者可以直接查看原论文。
如图1所示,LSTM_CNN的模型结构其实也很简单,就是在TextCNN模型结构的基础上,在embedding层与CNN层之间再插入一层LSTM层,其原理就是对于句子中的词汇特征向量,先经过LSTM层进行编码,这样一来,每个时间步的输出不仅包括了当前词汇的特征向量信息,也包括了该词汇之前所有词汇的特征信息,使得每个时间步的特征向量能够包含更多的信息,接着,把每个时间步的输出向量当做TextCNN中的embedding层,后面的计算就跟TextCNN完全一模一样了,如果对TextCNN模型不了解的读者可以查看我之前的文章《TextCNN文本分类与tensorflow实现》,这里就不再赘述了。
接下来,利用tensorflow框架来实现LSTM_CNN模型。同样的,为了便于对比各个模型的预测效果,本文的数据集还是采用之前的文章《FastText文本分类与tensorflow实现》中提到的数据集,LSTM_CNN的模型代码如下:
- import os
- import numpy as np
- import tensorflow as tf
- from eval.evaluate import accuracy
- from tensorflow.contrib import slim
- from loss.loss import cross_entropy_loss
-
-
- class LSTM_CNN(object):
- def __init__(self,
- num_classes,
- seq_length,
- vocab_size,
- embedding_dim,
- learning_rate,
- learnin
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。