为什么这种简单的回归(keras)ANN失败那么糟糕?

时间:2018-08-04 07:12:04

标签: r optimization keras regression non-linear-regression

我正在尝试对非常简单的数据进行非线性回归。当运行以下代码时,我得到了非常糟糕的结果。几乎每次结果都是简单的线性回归。当我检查模型的权重时,大多数(如果不是全部)神经元都“死了”。它们都具有负权重和负偏置,使得ReLu函数对所有输入都返回0(因为所有输入都在[0,1]范围内)。

据我所知,这是优化程序的问题。我也尝试使用非常低和非常高的学习率,但是没有运气。优化器似乎陷入了“非常”次优的局部最小值中。

我还尝试将初始权重设置为全部为正[0,0.1],优化器通过将所有偏差大致设置为相同的值来“欺骗”其成为线性回归的方式。

有人可以帮助我吗?我做错了什么?在一个简单的回归问题上,这真的是目前最好的ANN技术吗?

library(keras)
fun <- function(x) 0.2+0.4*x^2+0.3*x*sin(15*x)+0.05*cos(50*x).

x_test <- seq(0,1,0.01)
y_test <- fun(x_test)
plot(x_test, y_test, type = 'l')

x_train <- runif(50)
y_train <- fun(x_train)
points(x_train, y_train)

model <- keras_model_sequential() %>%
  layer_dense(10, 'relu', input_shape = 1) %>%
  layer_dense(1)

model %>% compile(
  optimizer = 'sgd',
  loss = "mse"
)

history <- model %>% 
  fit(x = x_train, y = y_train,
      epochs = 100,
      batch_size = 10,
      validation_data = list(x_test, y_test)
  )

y_pred <- model %>% predict(x_test)

plot(x_test, y_test, type = 'l')
points(x_train, y_train)
lines(x_test, y_pred, col = 'red')

predicted outputs versus actual ones.

1 个答案:

答案 0 :(得分:0)

通过relu激活更改Sigmoid,并在sgd末尾修正)类型错误。

编辑

还添加第二个密集层并训练更多的纪元,例如:

model <- keras_model_sequential() %>%
  layer_dense(10, 'relu', input_shape = 1) %>%
  layer_dense(10, 'relu') %>%
  layer_dense(1)

model %>% compile(
  optimizer = 'sgd',
loss = "mse"
)

history <- model %>% 
  fit(x = x_train, y = y_train,
      epochs = 2000,
      batch_size = 10,
      validation_data = list(x_test, y_test)
  )