주제별로 텍스트를 분류하도록 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에 합산 된 확률 분포를 기억하십시오. 이진 분류를 사용하여 하나의 출력 뉴런 만 가지려면 이진 교차 엔트로피와 함께 시그 모이 드를 사용하십시오.
categorical_crossentropy
합니다. 또한 레이블을 범주 형식으로 변환해야합니다. 이 작업을 참조하십시오to_categorical
. 또한 categorical 및 binary crossentropies의 정의를 참조 하십시오 .