0

我正在使用带有 Keras 的 MLP,并使用 sgd 进行了优化。我想调整学习率,但它似乎对训练没有任何影响。我尝试了小学习率(.01)和非常大的学习率(高达 1e28),效果几乎不明显。使用非常大的学习率时,我的损失不应该爆炸吗?

我正在使用具有 3 个隐藏层和 sigmoid 激活函数的全连接 NN。损失是 BinaryCrossEntropy 的一种变体。目标是预测信用违约。训练集包含 500000 个示例,大约有 500000 个示例。2% 的默认值。测试集包含 200000 行


def loss_custom_w(p):
    def loss_custom(y,yhat):
        y_l, y_lhat = keras.backend.flatten(y),keras.backend.flatten(yhat)
        eps = keras.backend.epsilon()
        y_lhat = keras.backend.clip(y_lhat, eps, 1-eps)

        return - keras.backend.mean(p*y_l*keras.backend.log(y_lhat) + (1-y_l)*keras.backend.log(1-y_lhat))
    return loss_custom

model = keras.Sequential([keras.layers.Dense(n_input), keras.layers.Dense(500, activation = 'sigmoid'), keras.layers.Dense(400, activation = 'sigmoid'), keras.layers.Dense(170, activation = 'sigmoid'), keras.layers.Dense(120, activation = 'sigmoid'), keras.layers.Dense(1, activation = 'sigmoid')])
sgd = keras.optimizers.SGD(lr = 1e20)
model.compile(optimizer = sgd, loss = loss_custom_w(8))
model.fit(x_train, y_train, epochs = 10, batch_size = 1000)

更新:-我尝试更改激活函数以避免梯度消失,但没有奏效。

  • 问题不是来自损失函数(我也尝试过其他损失)。

  • 实际上网络似乎运作良好,以及自定义损失。当我更改 p 的值时,它会执行预期的操作。我只是无法弄清楚为什么学习率没有影响。分类器也给出了令人满意的结果。

  • 网络设法从两个类别中预测标签。当我使用较大的惩罚值(如预期的那样)时,它可以更好地预测 1 类

4

1 回答 1

0

最后我得到了它。我没有在模型中指定输入形状(将第一层的“input_shape”关键字参数保留为“无”)。当我指定它时,它突然起作用了。我真的不明白为什么指定输入形状如此重要。

于 2020-04-02T11:06:27.400 回答