cnn分类

来源:互联网 发布:在线算法的特点 编辑:程序博客网 时间:2024/06/05 09:35

最近做项目要对所有评论内容做分类,分为正面和负面两个维度,一开始我自己写了个朴素贝叶斯分类器,准确率只有60%(测试数据,线上数据的结果应该更理想),离项目预期要求的80%准确率相差甚远,于是翻阅资料,找了一个cnn的分类器,在此基础上加以改造,将业务逻辑嵌了进去,出于好奇,也是最近deep learning比较火,看了一些资料,结合这个分类器,对分类器做了什么做一个小结。


源码在此 https://github.com/dennybritz/cnn-text-classification-tf


cnn(卷积神经网络)是将多维数据用卷积核做多层卷积运算、池化、tanh激活降维,再将多个层merge之后采用softmax算法得出输出结果的过程。但是文字是没有维度的,这里就涉及到nlp领域的东西了,又是一门大学问,简单来说就是给句子中的每一个词做成词向量,也叫词嵌入(word embedding),增加维度的过程实际上是将词与词之间的关系信息保存了起来。


回到这个分类器,他基于tensorflow,训练模型定义如下

1、利用tensorflow自带的VocabularyProcessor将句子转化成词向量的list,再转成矩阵图,这样就将文字问题转化成了图像问题;然而tensorflow的卷积转化操作需要批次(batch)、宽度(width)、高度(height)和频道(channel)这样一个四维张量,这样就够成了第一层:embedding层

2、接下来做卷积和池化取最大特征,因为卷积时采用了不同大小的滤镜,结果必然是不同形状的张量,因此需要加一层处理,将结果合并成一个大的特征向量

3、加入dropout层,为防止过拟合

4、通过执行矩阵乘法获得最终类别,计算出Loss和Accuracy,用于训练时纠偏


训练后将最终模型保存在文件中,Evaluating时再从文件restore