在这里,我通过从逻辑函数决定的两个bernoulli分布中随机抽样创建了一个玩具数据集
我希望我可以训练一个带有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)
# 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在适应训练数据方面表现不佳?
答案 0 :(得分:4)
Keras的工作做得不好,它正是你在网络架构中所做的工作:)
您在输出端使用softmax激活只有一个输出神经元,这意味着softmax将始终输出1.0,因为输出在神经元之间进行了标准化。不要这样做,使用至少两个输出神经元,这样可以正常进行标准化。
当您使用二进制交叉熵丢失时,更好的激活选择将在输出处为sigmoid,这将适用于单个输出神经元。