当前位置: 首页 > news >正文

【Python机器学习】循环神经网络(RNN)——超参数

几乎所有模型都可以根据数据和样本进行调整,它们都有各自的优势和相应的利弊权衡方式。寻找最优超参数集通常是一个棘手的问题,但是人类的直觉和经验可以为我们提供解决问题的方法。比如之前的例子:

#设置任意输入序列的最大长度
maxlen=100
#预训练的Word2vec模型维度
embedding_dims=300
#在进行反向传播算法之前要通过并聚合误差的样本序列的算法
batch_size=32
#训练周期个数
epochs=2
#隐藏层的复杂度
num_neurons=50

maxlen参数设置可能是这串参数中最大的问题。训练集在样本长度上变化很大。当我们强制将长度不超过100个词条的样本加上到400个词条,那么将1000个词条的样本截断到400个词条时,就会引入大量的噪声。改变这个数字对训练时间的影响比改变模型中的其他任何参数的影响都要打,单个样本的长度决定了误差需要再多长时刻内反向传播。对于循环神经网络,设置样本长度不是严格必要的。我们可以简单地将网络展开为样本所需的大小,在刚刚的例子中这种做法是必要的,因为我们把本身就是一个序列的输出传递到一个前馈层,而前馈层需要同样输出的大小。

embedding_dims值是由选择的Word2vec模型决定的,但是它应该是可以充分表示数据集的值。即使是像语料库中最常见的50个词条的独热编码这样简单的向量,可能也足以获得精确地预测。

与所有网络一样,增加batch_size可以加速训练,因为它减少了需要反向传播的次数(也就是计算上开销较大的部分)。折中的结果是,更大的批量增加了在局部极小值处停顿下来的可能。

epochs参数易于测试盒调优,只需再次运行训练过程即可。但是如果我们必须从头开始尝试每个新的epochs参数,那么就需要很多的耐心。Keras模型可以重新启动训练,并从停止的地方继续,只要我们在“停止”处保存了模型即可。要在以前训练过的模型上重新启动训练,要重新加载该模型盒数据集,并对数据调用model.fit()。Keras不会重新初始化权重,而是像从未停止过一般继续训练。

另一种对epochs参数进行调优的方法是添加一个名为EarlyStopping的Keras回调方法。通过向模型提供此方法,除非传递给EarlyStopping的度量指标超过了在回调方法中用于触发的某个阈值,否则模型将继续训练,直到达到我们锁清秋的周期数为止。一个常见的早停度量指标是连续几个周期验证精确率提高值。如果模型没有变得更好,通常就意味着是时候“断线”(断开链接)了。这个度量指标允许我们设置它并忘记它的存在。当模型达到我们的度量指标时,模型将停止训练。

num_neurous是一个重要的参数,上面建议随意地使用50个神经元。现在用100个神经元来进行训练和测试:

num_neurons=100
model=Sequential()
model.add(SimpleRNN(num_neurons,return_sequences=True,input_shape=(maxlen,embedding_dims)
))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(1,activation='sigmoid'))
model.compile('rmsprop','binary_crossentropy',metrics=['accuracy'])
model.summary()

model.fit(X_train,y_train,batch_size=batch_size,epochs=epochs,validation_data=(X_test,y_test))

model_strucure=model.to_json()
with open('simplernn_model2.json','w') as json_file:json_file.write(model_strucure)
model.save_weights('simplernn_weights2.h5')

上述更大的网络相当于在num_neurous=50的网络的其中一层将模型的复杂度提高了一杯,其验证准确率为64.06%,仅提高一点点。这个微不足道的提高会让人觉得模型(对于这个网络层)对数据来说太复杂了。这个网络层可能有些太宽了。

下面是num_neurous=25的情况:

这类测试可能需要相当长的时间来培养一种直觉。我们可能会发现,随着训练时间的增加,有时一次改变一个参数会掩盖一次调整两个参数所带来的好处,任务的复杂度会越来越高。

如果我们觉得模型对训练数据过拟合,但又无法占到使模型更简单的方法,那么我们总是可以尝试增加模型中的Dropout()函数中的百分比参数。这是一种可以降低过拟合的方法,同时允许模型具备匹配数据所需的尽可能高的复杂度。如果我们把dropout百分比设置在50%以上,那么就会开始有学习上的困难,学习速度将会变慢,验证误差将会增多。

对许多NLP问题来说,循环网络的dropout百分比设置为20-50%是一个相当安全的范围。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python操作MySQL
  • 【笔记】CCF直播:《如何在国际会议上有效交流》(2024-9-15)
  • prompt实用技巧-AI+Mermaid【酷炫钉钉文档】
  • win11下面graphviz的用法
  • 类型转换等 面试真题
  • 【Kubernetes】常见面试题汇总(十一)
  • 【QT】定时器使用
  • jdk相关介绍
  • RTX3060 FP64测试与猜想
  • 计算机视觉 对比学习 串烧一
  • [WUSTCTF2020]颜值成绩查询1
  • h5页面使用antd-modal,怎么处理居中且自然
  • GO 匿名函数
  • TCP socket
  • G1: Yunli‘s Subarray Queries (easy version)(1900)(定长区间众数)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Apache的基本使用
  • ES2017异步函数现已正式可用
  • HTTP那些事
  • Laravel Mix运行时关于es2015报错解决方案
  • redis学习笔记(三):列表、集合、有序集合
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • TypeScript实现数据结构(一)栈,队列,链表
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 大快搜索数据爬虫技术实例安装教学篇
  • 码农张的Bug人生 - 初来乍到
  • 如何进阶一名有竞争力的程序员?
  • HanLP分词命名实体提取详解
  • 回归生活:清理微信公众号
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • "无招胜有招"nbsp;史上最全的互…
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #大学#套接字
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (solr系列:一)使用tomcat部署solr服务
  • (不用互三)AI绘画工具应该如何选择
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (七)glDrawArry绘制
  • (生成器)yield与(迭代器)generator
  • (十一)图像的罗伯特梯度锐化
  • (一)SpringBoot3---尚硅谷总结
  • (转)scrum常见工具列表
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET MVC 验证码
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net反混淆脱壳工具de4dot的使用
  • .NET关于 跳过SSL中遇到的问题
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET中winform传递参数至Url并获得返回值或文件