LOSS 在非常简单的 KERAS 二元分类器中没有改变

Posted

技术标签:

【中文标题】LOSS 在非常简单的 KERAS 二元分类器中没有改变【英文标题】:LOSS not changeing in very simple KERAS binary classifier 【发布时间】:2020-03-26 12:39:58 【问题描述】:

我试图让一个非常(过度)简化的 Keras 二元分类器神经网络运行但没有成功。损失只是保持不变。到目前为止,我已经使用过优化器(SGD、Adam、RMSProp)、学习率、权重初始化、批量大小和输入数据标准化。

什么都没有改变。我在做一些根本错误的事情吗?代码如下:

from tensorflow import keras
from keras import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

data = np.array(
    [
        [100,35,35,12,0],
        [101,46,35,21,0],
        [130,56,46,3412,1],
        [131,58,48,3542,1]
    ]
)

x = data[:,1:-1]
y_target = data[:,-1]

x = x / np.linalg.norm(x)

model = Sequential()
model.add(Dense(3, input_shape=(3,), activation='softmax', kernel_initializer='lecun_normal',
                bias_initializer='lecun_normal'))
model.add(Dense(1, activation='softmax', kernel_initializer='lecun_normal',
                bias_initializer='lecun_normal'))

model.compile(optimizer=SGD(learning_rate=0.1),
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit(x, y_target, batch_size=2, epochs=10,
          verbose=1)

【问题讨论】:

Softmax 的定义是:所有神经元之和为 1。当你有 1 个神经元时会发生什么?是的,它总是 1 使用"sigmoid" 为什么是x = data[:,1:-1] 而不是x = data[:,:-1] 还有,中间层,model.add(Dense(3, input_shape=(3,), activation='softmax',, kernel_initializer='lecun_normal', bias_initializer='lecun_normal'))你为什么把这个设置为SoftMax?中间有SoftMax是很奇怪的。你试过relusigmoid等吗? 嘿,谢谢大家!我混淆了 softmax 和 sigmoid ......也许是深夜工作......它现在已经修复并且就像一个魅力!将在下面更新我的答案以供参考 【参考方案1】:

根据我得到的反馈,这是可行的解决方案

from tensorflow import keras
from keras import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.utils import to_categorical

data = np.array(
    [
        [100,35,35,12,0],
        [101,46,35,21,0],
        [130,56,46,3412,1],
        [131,58,48,3542,1]
    ]
)

x = data[:,1:-1]
y_target = data[:,-1]

x = x / np.linalg.norm(x)

model = Sequential()
model.add(Dense(3, input_shape=(3,), activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer=SGD(learning_rate=0.1),
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit(x, y_target, epochs=1000,
          verbose=1)

【讨论】:

【参考方案2】:

Softmax定义为:

exp(a) / sum(exp(a)

所以当你使用单个神经元时,你会得到:

exp(a) / exp(a) = 1

这就是为什么您的分类器不适用于单个神经元的原因。

在这种特殊情况下,您可以使用 sigmoid 代替:

exp(a) / (exp(a) + 1)

此外,sigmoid 函数适用于两个类分类器。 Softmax 是多类分类器的 sigmoid 扩展。

对于第一层,您应该使用 relusigmoid 函数而不是 softmax。

【讨论】:

以上是关于LOSS 在非常简单的 KERAS 二元分类器中没有改变的主要内容,如果未能解决你的问题,请参考以下文章

Keras 二元分类 - Sigmoid 激活函数

keras 分类和二元交叉熵

二元分类 predict() 方法:sklearn vs keras

keras中二元分类的类不平衡

Keras 用于二元分类预测的 fit_generator() 总是 50%

如何在 keras 分类器中使用交叉验证