我正在使用Keras的MLP,该MLP使用sgd进行了优化。我想调整学习速度,但这似乎对训练没有任何影响。我尝试了小学习率(.01(和大学习率(高达1e28(,但效果几乎不显著。当使用非常大的学习率时,我的损失难道不应该激增吗?
我使用的是一个完全连接的NN,有3个隐藏层和S形激活函数。损失是二元交叉熵的一个变体。目标是预测信贷违约。培训集包含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类
最后我得到了它。我没有在模型中指定输入形状(将第一层的"input_shape"关键字参数保留为"None"(。当我指定它时,它突然起作用了。我真的不明白为什么指定输入形状如此重要。