Python 在非常简单的KERAS二元分类器中损失不变

Python 在非常简单的KERAS二元分类器中损失不变,python,tensorflow,keras,classification,Python,Tensorflow,Keras,Classification,我试图得到一个非常(过于)简化的Keras二元分类器神经网络,但没有成功。损失只是保持不变。到目前为止,我已经使用过优化器(SGD、Adam、RMSProp)、学习率、权重初始化、批量大小和输入数据规范化 没有任何变化。我是不是做错了什么?代码如下: from tensorflow import keras from keras import Sequential from keras.layers import Dense from keras.optimizers import SGD d

我试图得到一个非常(过于)简化的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)

这是基于我得到的反馈的有效解决方案

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)

Softmax定义为:

exp(a) / sum(exp(a)
因此,当您使用单个神经元时,您将获得:

exp(a) / exp(a) = 1
这就是为什么你的分类器不能处理单个神经元

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

exp(a) / (exp(a) + 1)
此外,sigmoid函数用于两类分类器Softmax是多类Classifier的sigmoid扩展


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

softmax的定义是:所有神经元和1。当你有一个神经元时会发生什么?是的,它总是1使用
“sigmoid”
为什么
x=data[:,1:-1]
而不是
x=data[:,:-1]
?还有中间层,
模型。添加(密集(3,输入形状=(3),激活='softmax',内核初始化器='lecun\u normal bias\u初始化器max='lecun\u normal'))
为什么设置为softmax?在中间有SoftMax是很奇怪的。你试过
relu
sigmoid
等吗?嘿,谢谢大家!我把softmax和sigmoid搞混了。。。深夜工作也许。。。现在已经修好了,效果很好!将在下面更新我的答案以供参考