keras 在每个时期都给予相同的损失

keras giving same loss on every epoch

我是keras的新手

我 运行 它在一个数据集上,我的 objective 是为了减少对数损失。 对于每个时期,它都给我相同的损失值。我很困惑我是否在正确的轨道上。

例如:

Epoch 1/5
91456/91456 [==============================] - 142s - loss: 3.8019 - val_loss: 3.8278
Epoch 2/5
91456/91456 [==============================] - 139s - loss: 3.8019 - val_loss: 3.8278
Epoch 3/5
91456/91456 [==============================] - 143s - loss: 3.8019 - val_loss: 3.8278
Epoch 4/5
91456/91456 [==============================] - 142s - loss: 3.8019 - val_loss: 3.8278
Epoch 5/5
91456/91456 [==============================] - 142s - loss: 3.8019 - val_loss: 3.8278

这里 3.8019 在每个时代都是相同的。应该会少一些。

通常当你训练的模型没有足够的容量(或者成本函数不合适)时,就会出现这个问题。或者在某些情况下,我们错误地输入模型的数据没有正确准备,因此每个样本的标签可能不正确,这使得模型无能为力并且无法减少损失。

我也运行关注这个问题。想来想去,我发现是我的输出层上的激活函数。

我用这个模型来预测二元结果:

model = Sequential()
model.add(Dense(16,input_shape=(8,),activation='relu'))
model.add(Dense(32,activation='relu'))
model.add(Dense(32,activation='relu'))
model.add(Dense(1, activation='softmax'))

我需要这个来计算二元交叉熵

model = Sequential()
model.add(Dense(16,input_shape=(8,),activation='relu'))
model.add(Dense(32,activation='relu'))
model.add(Dense(32,activation='relu'))
model.add(Dense(1, activation='sigmoid'))

我会关注您正在尝试解决的问题以及确保您的激活函数符合要求所需的输出。

尝试将学习率降低到 0.0001 并使用 Adam。你的学习率是多少?

其实不清楚是学习率的问题还是模型复杂度的问题,能否再详细解释一下:

  1. 你的数据大小是多少,它是关于什么的?
  2. 您的模型的复杂性如何?我们可以通过分析您的数据来比较您的复杂性。如果你的数据太大,你需要更复杂的模型。
  3. 您是否对输出进行了标准化?对于输入,这没什么大不了的,因为 not-normalization 给出了结果,但是如果你的输出是一些大于 1 的数字,你需要规范化你的数据。如果您检查最后一层模型的激活函数,它们通常是 sigmoid、softmax、tanh,它们经常将您的输出压缩到 0-1 和 -1-1。您需要根据上一个激活函数对数据进行归一化,并且然后将它们反向相乘得到 real-life 结果。

由于您是深度学习的新手,这些建议足以检查您的模型是否存在问题。能否请您查看并回复?

我遇到了同样的问题并使用了以下模型

model = Sequential([
    Dense(10, activation ='relu', input_shape=(n_cols, )),
    Dense(3, activation ='softmax')
    ])

我意识到我的问题实际上是一个回归问题并且使用'softmax'作为最后一层激活(适用分类问题) 而不是其他问题。当我如下修改代码时,我能够解决在每个时期获得相同损失值的问题

model = Sequential([
    Dense(10, activation ='relu', input_shape=(n_cols, )),
    Dense(3, activation ='relu'),
    Dense(1)
    ])

所以,问题实际上是因为对回归问题使用了与分类相关的激活函数,反之亦然。你可能想检查一下你是否犯了同样的错误。