我正在尝试训练CNN以按主题对文本进行分类。当我使用二进制交叉熵时,我的精度约为80%,而使用分类交叉熵时,我的精度约为50%。
我不明白为什么会这样。这是一个多类问题,这是否意味着我必须使用分类交叉熵,而具有二进制交叉熵的结果却毫无意义?
model.add(embedding_layer)
model.add(Dropout(0.25))
# convolution layers
model.add(Conv1D(nb_filter=32,
filter_length=4,
border_mode='valid',
activation='relu'))
model.add(MaxPooling1D(pool_length=2))
# dense layers
model.add(Flatten())
model.add(Dense(256))
model.add(Dropout(0.25))
model.add(Activation('relu'))
# output layer
model.add(Dense(len(class_id_index)))
model.add(Activation('softmax'))
然后我将其categorical_crossentropy
作为损失函数像这样编译它:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
要么
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
从直觉上讲,为什么我要使用分类交叉熵是合理的,我不明白为什么使用二进制得到好的结果,而使用分类不好的原因。
categorical_crossentropy
。如果有两个类,它们将以0, 1
二进制标签和10, 01
分类标签格式表示。
Dense(1, activation='softmax')
对于二进制分类是完全错误的。请记住,softmax输出是一个总和为1的概率分布。如果只希望具有一个具有二进制分类的输出神经元,请使用具有二进制交叉熵的Sigmoid。
categorical_crossentropy
。标签也需要转换为分类格式。请参阅to_categorical
执行此操作。另见分类和二进制crossentropies的定义在这里。