【问题标题】:Inconsistent Neural Network output神经网络输出不一致
【发布时间】:2018-06-19 11:48:13
【问题描述】:

我正在使用 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

提前谢谢你。

【问题讨论】:

  • 你一定要播种。我之前在 Kaggle 上看到这个的地方是当你设置种子后使用的一些函数在内部调用随机种子。如果种子极大地改变了你的结果,那是一个很大的危险信号,表明你的模型结果不是很一致。
  • 我上面的评论是一般答案,可能但不一定适用于此。为了让我们验证这个案例,您能否提供一个可重现的示例?如果你用 buitlin 数据集做,你有同样的问题吗?
  • 在调用 neuralnet::neuralnet() 之前再尝试一个 set.seed。我认为这是你的问题,它与设置初始权重有关。附带说明一下,您可能还想尝试利用 neuralnet::neuralnet() 中的 rep 参数来改进训练。
  • 你是对的。在神经网络模型修复它之前将种子设置在线上。谢谢

标签: r neural-network


【解决方案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 , ]

设置神经网络

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

如果你在neuralnet::neuralnet()之前省略了set.seed(6),那么5次迭代的输出是:

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

只需添加额外的set.seed。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我怀疑正在发生的事情是您正在运行一次对 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
    

    这将在您每次运行该函数时为您提供一个新结果,但是当您再次“重新启动”种子时,这组潜在结果将重新开始。您可以将其视为r 每次设置种子时从相同的伪随机数开始,但是当您调用随机函数时,它开始“用完”该组随机数。

    所以你有几个选择 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)
    

    【讨论】:

      猜你喜欢
      • 2015-02-23
      • 2017-03-16
      • 2017-11-21
      • 2012-01-16
      • 2020-03-15
      • 2021-09-22
      • 2014-07-05
      相关资源
      最近更新 更多