赞
踩
1. 语料处理与模型建立
训练语料格式遵循 标签->标题->内容 ,标题可有可无。那么如何将文本作为卷积神经网络的输入呢?我们知道卷积神经网络的输入是一个三维矩阵,如果算上batch,则是四维矩阵。每一个三维矩阵类似图形的长宽和色深。我们首先将文档转换成向量。默认100 维。将文档转成向量的步骤如下:
1) 统计标签个数,统计词频。排除低频词,同时排除频率过高的词。那是因为频率过高的词也往往没有区分度。
2) 根据词频生词词汇字典,一般是有二十万左右的词汇量。生成字典的索引,即词和ID。
3) 将文档中对应的词转根据上一步生成的词典转换成对应的ID,没有的话用0填充,直到长度达到设定的维度。这样我们就得到了设定维度的文档向量表示。
2. 卷积神经网络结构
神经网络结构图
首先是输入层:如何将向量转换成三维图形?第一步创建一个二维矩阵,长度就是词典的大小,宽度就是设定的维度的一个在 [-1,1] 满足均匀分布的概率数据。我们根据文档的向量表示中的数据选择该二维均匀分布矩阵中的对应行,组成了一个长度为文档向量长度,宽度为设定宽度的一个二维矩阵。这样一来还不是三维,我们只要在最后一维进行拓展,把它表示成一个深度为 1 的灰度图。这样就完成了卷积神经网络对输入层的格式要求。
卷积层(Inception-v3):设定过滤器的深度,得到下一层的深度。这里设定的过滤器的大小并不是标准的 5*5 或者 3*3 ,宽就是输入层的宽度,长度可在配置文件中分别设定,深度也可以在配置文件中设定,默认 256 。我们用 5 个不同的过滤器得到不同的特征抽象,并完成拼接,得到由 5 个LeNet-5 模型拼接而成的 Inception-v3 模型的卷积成,深度为 256 * 5 = 1280 。卷积层可由一个for循环完成
我们可以得到卷积层的参数默认一共有 (10+20+30+40+50)*64*1*256 + 256 *5 = 245 万。
激活函数: 采用relu 激活函数,这个通常是常用的去线性化函数。
池化层: 采用最大池化层,池化层的规格是 输入长度 - 卷积层过滤长度 + 1 ,宽度是1。
Inception-v3层:通过以上5 个卷积层和池化层的分析,我们可以完成拼接得到一个 Inception节点,这个 Inception 节点的维度为 1 * 1 * 1280 (这个1280 就是前面分析的5 个卷积层在深度上的拼接,至于长和宽为什么是 1*1 ,仔细研究上面的卷积层和池化层参数即可得出结论)如下代码就是Inception-v3 模型,此时该模型的shape 就是 1 * 1 * 1280。
全连接层:我们将 Inception-v3 节点的shape 拉伸成一个 1*1*1280 的节点,即可得到一个 1280 节点的全连接层。
softmax & 输出层:输出层的节点取决于标签的个数,比如三个标签用[1,0,0] [0,1,0] [0,0,1] 这样三个节点表示,这样我们可以将输入经过 softmax 层转换成概率分布从而获得交叉熵作为损失函数。
以上就是我们cnn 的网络结构和前向传播的部分代码。
3. 模型训练
神经网络优化方式如下
1) 学习率衰减模型
2) 滑动平均模型
3) 采用L2 正则化
4) Dropout 防止过拟合
训练过程如下
将训练语料中默认 128 为一个batch,直到语料全部训练完成。采用默认 10 个这样的轮回完成训练。也就是1个训练语料会循环训练 10 次。默认每两轮打印出训练的损失函数值 loss。
4. 模型预测
根据训练好的模型,将未知文档的输出节点,按从大到小取5 个最大的节点值。而每个节点的索引(也就是位置)代表了一个标签。比如 28 个标签的话,对应 28 个节点。我们可以根据事先定义的节点的标签名找到这 5 个最大的节点值所对应的标签名。这样就完成了分类。
备注:
1) 模型训练
原始语料(train.file)格式一般为 标签 /t 标题 /t 内容 (标题可有可无),只要值行 train_model.sh train.file 即可以完成语料处理和模型训练
2) 模型使用
待分类的未知文档(unkown.file)格式为 标题 /t 内容 (标题可有可无),只要执行 predict.sh unkown.file 即可
3) 配置文件参数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。