当前位置:  开发笔记 > 人工智能 > 正文

在R中打包'神经网络',整流线性单元(ReLU)激活功能?

如何解决《在R中打包'神经网络',整流线性单元(ReLU)激活功能?》经验,为你挑选了1个好方法。

我试图使用R包神经网络中预先实现的"logistic"和"tanh"之外的激活函数.具体来说,我想使用整流线性单位(ReLU)f(x)= max {x,0}.请参阅下面的代码.

我相信我可以使用自定义函数(例如)

custom <- function(a) {x*2}

但如果我设置max(x,0)而不是x*2,那么R告诉我'max不在衍生表中',并且'>'运算符也是如此.所以我正在寻找一个合理的解决方法,因为我认为在这种情况下max的数值积分不会成为问题.

nn <- neuralnet(
  as.formula(paste("X",paste(names(Z[,2:10]), collapse="+"),sep="~")),
  data=Z[,1:10], hidden=5, err.fct="sse",
  act.fct="logistic", rep=1,
  linear.output=TRUE)

有任何想法吗?我有点困惑,因为我认为neuralnet包不会进行分析区分.



1> cdeterman..:

neuralnet包的内部将尝试区分提供的任何功能act.fct.你可以在这里看到源代码.

在第211行,您将找到以下代码块:

if (is.function(act.fct)) {
    act.deriv.fct <- differentiate(act.fct)
    attr(act.fct, "type") <- "function"
}

differentiate函数是一个更复杂的deriv函数使用,您也可以在上面的源代码中看到.因此,目前无法提供max(0,x)act.fct.它需要在代码中放置一个例外来识别ReLU并知道衍生物.获取源代码,添加它并提交给维护者进行扩展(但可能有点多)将是一个很好的练习.

但是,关于合理的解决方法,您可以使用softplus函数,它是ReLU的平滑近似值.您的自定义函数如下所示:

custom <- function(x) {log(1+exp(x))}

您也可以在R中查看此近似值:

softplus <- function(x) log(1+exp(x))
relu <- function(x) sapply(x, function(z) max(0,z))

x <- seq(from=-5, to=5, by=0.1)
library(ggplot2)
library(reshape2)

fits <- data.frame(x=x, softplus = softplus(x), relu = relu(x))
long <- melt(fits, id.vars="x")
ggplot(data=long, aes(x=x, y=value, group=variable, colour=variable))+
  geom_line(size=1) +
  ggtitle("ReLU & Softplus") +
  theme(plot.title = element_text(size = 26)) +
  theme(legend.title = element_blank()) +
  theme(legend.text = element_text(size = 18))

在此输入图像描述

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有