为什么Keras在这个简单的玩具数据集上表现不佳?

时间:2017-09-29 04:36:16

标签: r keras

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

  1. 1 /(1 + exp(-0.2 *(x-20)))
  2. -1 /(1 + exp(-0.2 *(x - 80)))
  3. enter image description here

    我希望我可以训练一个带有2节点隐藏层的keras NNet和一个可以学习这两个逻辑函数的softmax激活函数,但结果模型预测每个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)
    

    enter image description here

    # 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在适应训练数据方面表现不佳?

1 个答案:

答案 0 :(得分:4)

Keras的工作做得不好,它正是你在网络架构中所做的工作:)

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

当您使用二进制交叉熵丢失时,更好的激活选择将在输出处为sigmoid,这将适用于单个输出神经元。