神经网络输出不一致

时间:2018-06-18 23:12:30

标签: r neural-network

我正在使用R中的NeuralNet软件包来训练人工神经网络,并且能够在没有太多问题的情况下训练模型。但是,当我使用相同数量的隐藏节点重新运行模型,然后在我的测试数据上评估我的结果时,我会得到截然不同的结果。我正在阅读一个论坛帖子,有人建议它与随机起始权重有关,并建议设置一个种子。我一直非常认同我的种子,但我仍然得到非常不同的结果。有人有类似的问题吗?如果是这样,你做了什么来解决不一致问题。此外,我的所有IV都是数字的,我没有遗漏值。

这是我的代码和输出:

#min-max norm the dt vars
normalize = function(x){
  return((x-min(x))/(max(x) - min(x)))
}

#make a smaller dt so it is easier to work with
nrows = nrow(dt.norm)
sm.size = 10000
set.seed(7)
sm.index = sample(nrows, sm.size, replace = FALSE)
dt.norm.sm = dt.norm[sm.index,]

#Split into training and testing
nrows = nrow(dt.norm.sm) 
train.size = floor(0.7*nrows)
set.seed(7)
train.idx = sample(nrows, train.size, replace = F)
dt.sm.train = dt.norm.sm[train.idx, ]
dt.sm.test = dt.norm.sm[-train.idx, ]

#train model on the data
ann.form = as.formula(paste('Pure_Prem ~', paste(names(dt.sm.train[-24]), 
collapse = '+'))) #24 is the dv
pure_prem_model = neuralnet(ann.form, data = dt.sm.train, hidden = 3)

#evaluate model performance
model_results = neuralnet::compute(pure_prem_model, dt.sm.test[1:23]) 
#exclude 24 because it is the DV
predicted_pure_prem = model_results$net.result
cor(predicted_pure_prem, dt.sm.test$Pure_Prem)

我的输出是:

[1,] 0.007210471996

当我再次重新运行完全相同的代码时,我的输出是:

[1,] 0.4554126927

提前谢谢。

2 个答案:

答案 0 :(得分:1)

以下是我的评论中的一个例子。

设置数据:

data <- mtcars
samplesize <-  0.6 * nrow(data)
set.seed(7)
index <-  sample(seq_len(nrow(data)), size = samplesize)
max <-  apply(data , 2 , max)
min <-  apply(data, 2 , min)
scale_df <-  as.data.frame(scale(data, center = min, scale = max - min))
train <-  scale_df[index , ]
test <-  scale_df[-index , ]

设置NN

set.seed(6)
model_nn <- neuralnet::neuralnet(mpg ~ cyl + hp + wt, train, hidden = 3)
model_result <- neuralnet::compute(model_nn, test[,c(2,4,6)])
predicted_mpg <- model_result$net.result
cor(predicted_mpg, test$mpg)

输出始终为

[1,] 0.9310625412

如果在set.seed(6)之前省略neuralnet::neuralnet(),则5次迭代的输出为:

[1,] 0.9142345019
[1,] 0.8531440993
[1,] 0.9414393857
[1,] 0.9309926802
[1,] 0.9164132325

只需添加额外的set.seed即可。希望能帮到你。

答案 1 :(得分:1)

我怀疑发生的事情是您正在调用set.seed一次,但多次运行neuralnet函数。

set.seed的调用只会在设置种子后第一次调用函数时产生相同的结果。例如

set.seed(1)
sample(10)
#[1]  3  4  5  7  2  8  9  6 10  1

如果你第二次调用相同的随机函数,你会得到不同的结果(但仍然是可重现的!)

sample(10)
#[1]  3  2  6 10  5  7  8  4  1  9

再次致电种子,亲眼看看。

set.seed(1)
sample(10)
# [1]  3  4  5  7  2  8  9  6 10  1
sample(10)
# [1]  3  2  6 10  5  7  8  4  1  9

每次运行该功能时,这将为您提供一个新结果,但是当您重新启动&#34;时,潜在结果的集合将重新开始。种子又来了。每次设置种子时,您都可以将其视为r从相同的伪随机数开始,但是当您调用随机函数时,它会开始&#34;用完&#34;那组随机数。

所以你有几个选择1)你可以从头开始设置你的代码每次设置第一个种子,2)你可以在调用neuralnet作为AndS之前专门设置一个种子。建议,或3)你可以从模型的第一次运行中提取一些起始权重,即

random_start_weights = pure_prem_mode$startweights 

并在以后的所有运行中明确使用它们

pure_prem_model = neuralnet(ann.form, data = dt.sm.train, hidden = 3, startweights = random_start_weights)