Machine learning 二元交叉熵和分类交叉熵的不同结果

Machine learning 二元交叉熵和分类交叉熵的不同结果,machine-learning,keras,deep-learning,neural-network,loss-function,Machine Learning,Keras,Deep Learning,Neural Network,Loss Function,我在使用二进制交叉熵和分类交叉熵之间做了一个实验。我试图理解这两个损失函数在同一问题上的行为 我研究了这个问题的二进制分类 在第一个实验中,我在最后一层使用1神经元和sigmoid激活函数和binary\u交叉熵。我对这个模型进行了10次训练,取得了平均精度。平均精度为74.1276041666 我在第一个实验中使用的代码如下 total_acc = 0 for each_iter in range(0, 10): print each_iter X = dataset[:,0:

我在使用
二进制交叉熵
分类交叉熵
之间做了一个实验。我试图理解这两个损失函数在同一问题上的行为

我研究了这个问题的
二进制分类

在第一个实验中,我在最后一层使用
1
神经元和
sigmoid
激活函数和
binary\u交叉熵
。我对这个模型进行了10次训练,取得了平均精度。平均精度为74.1276041666

我在第一个实验中使用的代码如下

total_acc = 0
for each_iter in range(0, 10):
    print each_iter
    X = dataset[:,0:8]
    y = dataset[:,8]
    # define the keras model
    model = Sequential()
    model.add(Dense(12, input_dim=8, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    # compile the keras model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    # fit the keras model on the dataset
    model.fit(X, y, epochs=150, batch_size=32)
    # evaluate the keras model
    _, accuracy = model.evaluate(X, y)
    print('Accuracy: %.2f' % (accuracy*100))
    temp_acc = accuracy*100
    total_acc += temp_acc

    del model
在第二个实验中,我使用了最后一层的
2
神经元,它们具有
softmax
激活功能和
分类交叉熵。我把我的目标y转换成了分类,我再次对这个模型进行了10次训练,获得了平均精度。平均准确度为66.92708333334

我用于第二个设置的代码如下所示:

total_acc_v2 = 0
for each_iter in range(0, 10):
    print each_iter
    X = dataset[:,0:8]
    y = dataset[:,8]
    y = np_utils.to_categorical(y)
    # define the keras model
    model = Sequential()
    model.add(Dense(12, input_dim=8, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    # compile the keras model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    # fit the keras model on the dataset
    model.fit(X, y, epochs=150, batch_size=32)
    # evaluate the keras model
    _, accuracy = model.evaluate(X, y)
    print('Accuracy: %.2f' % (accuracy*100))
    temp_acc = accuracy*100
    total_acc_v2 += temp_acc
    del model

我认为这两个实验是相同的,应该得到非常相似的结果。准确度之间如此巨大差异的原因是什么?

似乎这种行为的原因是随机性。我已经运行了您的代码,sigmoid模型的平均精度约为74,softmax模型的平均精度约为74。

这是我的尝试,这对我来说是一件令人惊讶的事情。为了处理这种随机性,我对代码进行了10次迭代,但似乎这还不够。那么,根据你的结果,我们可以用两种方法来解决二进制分类问题?是的,我们可以。但最好的做法是在二元分类中使用sigmoid函数