我正在使用 Keras 为我的项目训练神经网络。 Keras 提供了提前停止的功能。我可以知道应该观察哪些参数来避免我的神经网络通过使用提前停止来过度拟合吗?
最佳答案
早期停止基本上是在您的损失开始增加(或者换句话说,验证准确度开始下降)时停止训练。根据documents用法如下;
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
值取决于您的实现(问题、批量大小等),但通常是为了防止我会使用过拟合;
monitor
'val_loss' 的参数。min_delta 是一个阈值,用于将某个时期的损失量化为
改善与否。如果loss的差值低于min_delta,则量化
因为没有改善。最好将其保留为 0,因为我们感兴趣
当损失变得更糟时。patience 参数表示一旦你的损失开始增加(停止改进)之前停止的时期数。
这取决于您的实现,如果您使用非常小的批处理
或大学习率你的损失zig-zag(准确度会更嘈杂)所以最好设置一个
大的 patience 参数。如果您使用大批量和小批量
学习率你的损失会更平滑,所以你可以使用
较小的 patience 参数。无论哪种方式,我都会将其保留为 2 所以我会
给模型更多机会。verbose 决定要打印的内容,将其保留为默认值 (0)。mode 参数取决于你监控数量的方向
有(它应该是减少还是增加),因为我们监控损失,我们可以使用 min。但是让我们离开 keras
为我们处理并将其设置为 auto所以我会使用类似的东西并通过绘制有和没有提前停止的错误损失来进行实验。
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
对于回调的工作方式可能存在歧义,我将尝试解释更多。在模型上调用 fit(... callbacks=[es]) 后,Keras 会调用给定的回调对象预定函数。这些函数可以称为on_train_begin、on_train_end、on_epoch_begin、on_epoch_end和on_batch_begin, on_batch_end。在每个时期结束时调用提前停止回调,将最佳监测值与当前值进行比较,如果满足条件则停止(自观察到最佳监测值以来已经过去了多少时期,是否超过耐心参数,两者之间的差异最后一个值大于 min_delta 等..)。
正如@BrentFaust 在评论中指出的那样,模型的训练将继续进行,直到满足 Early Stopping 条件或满足 fit() 中的 epochs 参数(默认 = 10) .设置 Early Stopping 回调不会使模型训练超出其 epochs 参数。因此,使用较大的 epochs 值调用 fit() 函数将从 Early Stopping 回调中受益更多。
关于python - 哪些参数应该用于提前停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906048/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano