在非常简单的KERAS二进制分类器中,LOSS不变

时间:2019-12-01 20:44:59

标签: 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

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)

2 个答案:

答案 0 :(得分:1)

Softmax 的定义是:

exp(a) / sum(exp(a)

因此,当您使用单个神经元时,您将得到:

exp(a) / exp(a) = 1

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

在这种特殊情况下,您可以改用 Sigmoid

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

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

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

答案 1 :(得分:0)

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

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)