【问题标题】:Why does Keras perform poorly on this simple toy dataset?为什么 Keras 在这个简单的玩具数据集上表现不佳?
【发布时间】:2017-09-29 04:36:16
【问题描述】:

在这里,我通过从逻辑函数指定的两个伯努利分布中随机抽样创建了一个玩具数据集

  1. 1 / (1 + exp(-0.2 * (x - 20)))
  2. -1 / (1 + exp(-0.2 * (x - 80)))

我希望我可以训练一个带有 2 节点隐藏层和一个 softmax 激活函数的 keras NNet,该函数可以学习这两个逻辑函数,但生成的模型预测每个 x 值的概率为 1。

library(keras)

train <- data.frame(
  x = c(4.44, 8.25, 15.72, 17.53, 17.53, 17.86, 18.57, 20.22, 20.24, 20.57, 21.99, 25.06, 28.3, 31.1, 35.91, 37.29, 38.36, 39.58, 
        39.78, 40.1, 47.29, 51.67, 51.74, 53.52, 57.45, 62.69, 63.03, 69.03, 70.11, 74.44, 76.4, 79.81, 86.92, 87.59, 89.88),
  y = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)
)

head(train, 10)
       x y
1   4.44 0
2   8.25 0
3  15.72 0
4  17.53 0
5  17.53 0
6  17.86 0
7  18.57 0
8  20.22 0
9  20.24 1
10 20.57 1

# Build and fit model
model <- keras_model_sequential()
model <-  layer_dense(object = model, input_shape = 1L, use_bias = TRUE, units = 2L, activation = 'sigmoid')
model <-  layer_dense(object = model, units = 1L, activation = 'softmax', input_shape = 2L)
model <- compile(object = model, loss = 'binary_crossentropy', optimizer = 'sgd', metrics = c('accuracy'))
fit(object = model, x = dt$Age, y = dt$LittleSleep * 1, epochs = 30)

# Evaluate
predict_proba(object = model, x = train$x)[, 1]
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

为什么 Keras 在拟合训练数据方面做得这么差?

【问题讨论】:

  • 如何规范化你的 X 值......在 @matias Valdenefro 所说的之上

标签: r keras


【解决方案1】:

Keras 并没有做得很差,它完全按照您在网络架构中要求它做的工作 :)

您在只有一个输出神经元的输出处使用了 softmax 激活,这意味着 softmax 将始终输出 1.0,因为输出在神经元之间进行了归一化。不要那样做,至少使用两个输出神经元,这样标准化才能正确进行。

当您使用二元交叉熵损失时,更好的激活选择是输出端的 sigmoid,它适用于单个输出神经元。

【讨论】:

  • 谢谢。作为记录,我完全认为这是用户错误,并不意味着这是 Keras 的错。话虽如此,我尝试使用 sigmoid 激活函数,但该模型的性能也极差。你有没有机会提供一个真正适合我的数据的模型?
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 2020-01-06
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2017-02-10
  • 2019-09-18
  • 2012-09-12
相关资源
最近更新 更多