我正在尝试对非常简单的数据进行非线性回归。当运行以下代码时,我得到了非常糟糕的结果。几乎每次结果都是简单的线性回归。当我检查模型的权重时,大多数(如果不是全部)神经元都“死了”。它们都具有负权重和负偏置,使得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')
答案 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)
)