c# 一个文本集合 输入首位文本 求区间的文本的代码

求助大神....判断 输入数字是否在某个区间 要效率高的代码写一堆if相当蛋疼

}

自然语言处理实战(一),地址:
自然语言处理实战(二),地址:

在前面的两篇中,针对我们自定的文本表示方法,分别用KNN和SVM进行训练和测试,研究表明,KNN的准确率达到0.864,SVM的准确率最高达到0.88以上。

回顾我们的文本表示模型:对于搜狗新闻语料,从每篇新闻的每个段落找那个抽取3个关键词,这三个关键词都用训练好的Word2Vec向量表示,每个词向量64维,每段可拼接为一个192维的向量,最好直接将所有的段落做向量相加运算,得到一个192维的文本向量,不足则补0。更多的细节,请访问。

本文,我们将使用深度学习对已经处理好的数据进行研究。

随着计算机硬件和理论的发展,近年来,深度学习几乎在所有任务上都有超越传统机器学习算法的趋势。虽然深度学习在学术界备受鄙视,但不可否认的是,It works great ! 最初,人们对于深度学习的研究,大多集中在计算机视觉上,但近年来,大量的实践和研究表明,深度学习并不是计算机视觉的专利,对于自然语言处理,深度学习依然表现亮眼。

首先,我们使用深度学习最基本的多层全连接神经网络。网络结构如图所示:



设定一些超参数的初始值,初始值的设置一般是根据数据特征和经验来做,然后根据训练结果不断的调整。

我们使用的数据总量是15000个样本,按照7:1:2划分训练集、验证集和测试集。因为为了和前面的实验中的测试集保持一致,在本实验中,验证集从原来的训练集中取出一部分,这样,我们的训练集还有10500个样本,足够。另外,为了更好的表达各个类别,我们将类别标记转为one-hot编码,比如原来两个样本标记为[1, 2],转换为onr-hot编码后的标记为[[1, 0, 0, 0,

# 划分训练集、验证集和测试集
 # 然后划分出训练集和验证集,验证集占总体数据集的10%
 # 首先将每个类别标记都单独表示为一个list

和前面的机器学习不同,在深度学习中,我们是批量的取数据,所以有必要做一个迭代的批量获得数据的函数,满足神经网络批处理的要求,代码如下:

# 按批获得数据迭代器

准备工作完毕,下面是使用tensorflow训练神经网络的核心代码:

# 定义损失和优化操作 # 保存训练过程中的损失和准确率 # 中文和符号的正常显示 # 添加标题和坐标轴标签

不出意外,这个网络很快就发生了过拟合,训练过程可以看下图



可以发现,在迭代20次之前,训练准确率直接飙到了1,验证集上的准确率也难有上升趋势,更准确点,可以看下图:



通过和前面机器学习算法的比较,我们发现在过拟合之前,验证集上的准确率和KNN以及SVM是差不多的,那么,为了进一步提升准确率,我们需要先解决过拟合的问题。
  • 数据少,特征多导致的过拟合,增加数据,删选特征。
  • 模型过于复杂,参数过多导致的过拟合,奥卡姆剃刀原则,使用更简单的模型。
  • Dropout,随机丢弃一些神经元,可以让网络结构更贱简单,减少参数量,增加随机性,降低过拟合风险。
  • 正则化,对权重参数做正则化惩罚。
  • 控制梯度大小,防止梯度爆炸和梯度消失的问题。
  • 利用验证集提前终止训练。

第一步:减小网络复杂度

在这一步,我直接去掉第一层全连接层,也就是时候网络变成一个五个隐层的网络,从第一层到第五层的神经元个数分别为:128/64/32/16/8。

对权重参数进行惩罚,理论上可以降低过拟合。

经过这两步操作之后的准确率变化如图所示:



过拟合现象似乎并没有有效改善,此时,我怀疑我的一些超参数设置肯能不是很合理,其中最重要的就是学习率的设置,当我把学习率改为0.001的时候,训练过程如下图所示:





因此,我们可以得知,快速过拟合的原因还是我们的网络过于复杂了。

在进一步降低各层神经元个数,并设keep_prob=0.8,之后



准确率基本在缓慢上升,训练损失也在缓慢下降,但验证集损失仍然有较大的波动,当把训练集和验证集的比例调为1:1的时候:



虽然验证集损失在上升,但波动明显减小了很多。另外,当直接将预备的测试集做验证集的时候,损失同样波动很大,这说明除了网络设计不好之外,我们使用的数据或太少或噪声比较大或代表性不强,第二个问题后面再讨论,现在还是进一步优化网络。

批标准化(Batch Normalization )简称BN算法,是为了克服神经网络层数加深导致难以训练而诞生的一个算法。批标准化一般用在非线性映射(激活函数)之前,对y= Wx + b进行规范化,也就是说使得激活函数的输入稳定在一个比较好(比较小)的范围(均值为0,方差为1),这样可以避免激活函数的某些区间上表现不佳的问题,让每一层的输入有一个稳定的分布会有利于网络的训练

在神经网络中, 数据分布对训练会产生影响. 比如某个神经元 x 的值为1, 某个 Weights 的初始值为 0.1, 这样后一层神经元计算结果就是 Wx = 0.1; 又或者 x = 20, 这样 Wx 的结果就为 2. 现在还不能看出什么问题, 但是, 当我们加上一层激励函数, 激活这个 Wx 值的时候, 问题就来了. 如果使用 像 tanh 的激励函数, Wx 的激活值就变成了 ~0.1 和 ~1, 接近于 1 的部已经处在了 激励函数的饱和阶段, 也就是如果 x 无论再怎么扩大, tanh 激励函数输出值也还是 接近1. 换句话说, 神经网络在初始阶段已经不对那些比较大的 x 特征范围 敏感了。normalization 预处理, 使得输入的 x 变化范围不会太大, 让输入值经过激励函数的敏感部分. 但刚刚这个不敏感问题不仅仅发生在神经网络的输入层, 而且在隐藏层中也经常会发生.

  • 减少了参数的人为选择,可以取消dropout和L2正则项参数,或者采取更小的L2正则项约束参数。
  • 减少了对学习率的要求,可以适当调大学习率。
  • 可以不再使用局部响应归一化了,BN本身就是归一化网络(局部响应归一化-AlexNet)。
  • 更破坏原来的数据分布,一定程度上缓解过拟合。
  • 如果 Batch Size 太小,则 BN 效果明显下降。因为在小的 BatchSize 意味着数据样本少,因而得不到有效统计量,也就是说噪音太大。
  • 对于有些像素级图片生成任务来说,BN 效果不佳;对于图片分类等任务,只要能够找出关键特征,就能正确分类,这算是一种粗粒度的任务,因为在 Mini-Batch 内多张无关的图片之间计算统计量,弱化了单张图片- 本身特有的一些细节信息。
  • RNN 等动态网络使用 BN 效果不佳且使用起来不方便。
  • 训练时和推理时统计量不一致。



通过上面的曲线,感觉模型的表现已经差不多了,接下来把模型保存下来就好了。


通过画图可以发现,在epoch=850之前并没有明显的过拟合,但之后虽然验证集准确率仍然保持相对平衡,但验证集损失有上升的趋势,因此选择850作为截断点。

保存模型得到四个文件:
.data 文件是训练好的参数值,
meta 文件是定义的神经网络图,即所有变量、操作、集合等
checkpoint 文件是所有模型的保存路径

# 划分训练集、验证集和测试集 # 然后划分出训练集和验证集,验证集占总体数据集的10% # 首先将每个类别标记都单独表示为一个list # 按批获得数据迭代器 # 定义损失和优化操作 # update_ops 的调用,实现训练过程中对BN层的参数进行更新,否则验证和测试结果会很差 # 保存训练过程中的损失和准确率 # 提前停止,保存模型 print("模型保存,终止程序!") # 中文和符号的正常显示 # 将第一个画板划分为2行1列组成的区块,并获取到第一块区域 # 添加标题和坐标轴标签 # 选中第二个子区域,并绘图

建议:在写训练模型的代码的时候,对引入的每一步参数和操作尽量都明确指定一个名字,方便恢复模型时获得每个值。batch_size设的比较小时,模型收敛快,但随机性大,模型震荡较大,设的较大时,模型收敛稍慢,但模型震荡小。当然,上述代码还有很多优化的空间。

从上图可以看到,收敛后的模型在验证集上的准确率在0.86左右,可想而知,咱测试集应该也是差不多的,下面使用训练好的模型测试一下:

# 划分训练集、验证集和测试集 # 注意这个函数不能直接从sogou_DNN_v3文件引入,因为from 一个文件 import * 的时候回运行一遍引入的文件 # 然后划分出训练集和验证集,验证集占总体数据集的10% # 首先将每个类别标记都单独表示为一个list

纠正一个前面的问题,在 train_test_split 函数中,random_state设为0或者不设,每个采样都是不一样的,所以应该设为非0数字,保证每次采样都一样。

上面的代码中,处理准确率,我们还拿到了一个很关键的数据,pred_label_index 表示预测样本的预测输出中最大的值得索引,比如一个样本的预测输出(不要忘了是one-hot编码)是[0 ,1, 0, 0, 0],那么在pred_label_index 中就是 1 ,而根据one-hot编码规则,[0 ,1, 0, 0,

经过KNN、SVM和深度学习对我们的文本表示模型进行测试,发现准确率基本在0.86左右,导致准确率不能进一步提升的原因有二:一是我们所使用的算法本身的局限性以及没有调到最优,二是这种文本表示模型本身的局限性。本人是使用TextRank4Keyword对每篇文章的每一个段落抽取三个关键字,但这个算法本身并不一定能抽取准确的关键字,经过本人测试,也证明了这点。另外,我们将每一个段落的关键字简单相加,对数据的压缩和改变的影响是存在的,这导致了特征构建并不完美。最后,我们使用的word2vec模型是由维基百科训练得到的64维的词向量模型,和我们要使用的搜狗新闻分类场景不一致,并且词向量维数较小,也可能是一个缺憾。但是,我们在如此不利的条件下,仅仅使用10000余例数据,仍然达到了0.86左右的分类准确率,充分说明了我们的研究具有极大的前景和意义。

  • 改进神经网络的学习方法(上) 当一个高尔夫球员刚开始学习打高尔夫时,他们通常会在挥杆的练习上花费大多数时间。慢慢地...

  • 改进神经网络的学习方法(下) 权重初始化 创建了神经网络后,我们需要进行权重和偏差的初始化。到现在,我们一直是根据...

  • 一、机器学习策略的原因 机器学习是无数重要应用程序的基础,包括网络搜索,电子邮件反垃圾邮件,语音识别,产品推荐等。...

  • 朋友一直蛊惑我看《爱上超模》,这两天天气不是很好,并打开电脑搜索了下这个节目。想不到自己也被荼毒了,两天看了五期,...

  • 听说, 十年,是一个区间。 对十八岁的我们,十年,有期许、有等待、有奋斗、有变化,伴随着十年的,是不同的青春。 有...

  • 第六章 12. 在响河的记忆中,千禧年,发生了很多事情。 那一年,患有帕金森综合征的外婆意外摔断了大腿腿骨,考虑到...

  • 知乎话题:我该不该给自己聪明的留个退路? 骑驴找马还是破釜沉舟,怎么选? 谢邀。答应要在春节假期回答这个问题,所以...

}

我要回帖

更多关于 解集用区间表示还是集合表示 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信