我的问题与此问题非常相关:https://stackoverflow.com/questions/25510960/how-to-implement-own-error-function-while-using-neuralnet-package-in-r#=要求在R的Neuralnet包中提供自定义错误函数的一般语法。
虽然问题及其答案对我有帮助,因为我也想使用自定义错误功能。但是,在我的错误函数中,我想包含每次迭代的权重。例如。我想添加lamda*(weights)^2
,我选择的常量lambda
会影响优化选择较大/较小的权重。关于如何实现这一点的任何想法?
谢谢!
答案 0 :(得分:1)
我很确定使用当前的neuralnet
代码是不可能的。你可以看一下here。
相关部分从第350行开始
result <- rprop(weights = weights, threshold = threshold,
response = response, covariate = covariate, learningrate.limit = learningrate.limit,
learningrate.factor = learningrate.factor, stepmax = stepmax,
lifesign = lifesign, lifesign.step = lifesign.step, act.fct = act.fct,
act.deriv.fct = act.deriv.fct, err.fct = err.fct, err.deriv.fct = err.deriv.fct,
algorithm = algorithm, linear.output = linear.output,
exclude = exclude, learningrate.bp = learningrate.bp)
startweights <- weights
weights <- result$weights
step <- result$step
reached.threshold <- result$reached.threshold
net.result <- result$net.result
error <- sum(err.fct(net.result, response))
if (is.na(error) & type(err.fct) == "ce")
if (all(net.result <= 1, net.result >= 0))
error <- sum(err.fct(net.result, response), na.rm = T)
在这里,您可以看到内部err.fct
仅显式传递了网络的result
,而不是权重。如果要传递权重和lambda参数,则需要更改源代码。虽然可能不是因为“内心虚弱”,但这确实是可能的,因为您可以随时下载源并开始修改它。
答案 1 :(得分:0)
我想放手一搏。所以我下载了neuralnet.r并对其进行了编辑:
error <- err.fct(net.result, response)
。error <- caseweights %*% err.fct(net.result, response)
。error <- sum(err.fct(net.result, response), na.rm = T)
。error <- caseweights %*% sum(err.fct(net.result, response), na.rm = T)
。我还将err.deriv <- err.deriv.fct(result$net.result, response)
添加到适当的函数参数,也添加到Neuralnet,并重命名了一些函数,因此我不会意外地使用标准库函数。
不确定这是否有效。一个简单的测试似乎有效,但更复杂的测试很难收敛 - 很难设置大小写,以便它们不会太小或太大。