我进行了一项实验,比较了binary_crossentropy
和categorical_crossentropy
的使用情况。我尝试理解这两个损失函数在同一问题上的行为表现。
我使用此数据处理二分类
问题。
在第一次实验中,我在最后一层使用了1
个神经元,并使用sigmoid
激活函数和binary_crossentropy
。我训练了这个模型10次,并计算了平均准确率。平均准确率为74.12760416666666。
我用于第一次实验的代码如下:
total_acc = 0for 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
激活函数和categorical_crossentropy
。我将目标y
转换为分类数据,再次训练了这个模型10次,并计算了平均准确率。平均准确率为66.92708333333334。
我用于第二次设置的代码如下:
total_acc_v2 = 0for 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。