범주 형 교차 엔트로피는 원-핫 인코딩 기능에서 잘못 작동합니다.

Aug 18 2020

원-핫 인코딩 데이터로 categorical_crossentropy 문제로 고생하고 있습니다. 문제는 아래에 제시된 코드의 변경되지 않은 출력에 있습니다.

            inputs = keras.Input(shape=(1190,), sparse=True)
            lay_1 = layers.Dense(1190, activation='relu')
            x = lay_1(inputs)
            x = layers.Dense(10, activation='relu')(x)
            out = layers.Dense(1, activation='sigmoid')(x)
            self.model = keras.Model(inputs, out, name='SimpleD2Dense')
            self.model.compile(
                optimizer=keras.optimizers.Adam(),
                loss=tf.losses.categorical_crossentropy,
                metrics=['accuracy']
            )
Epoch 1/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 2/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 3/3
1572/1572 - 7s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543

데이터에 대한 몇 마디 : 1190 개 기능 ( 119 개 범주의 10 개 실제 기능 ). 입력은 샘플 당 1190 개의 값이있는 데이터 프레임 행입니다. 출력은 이진 값 0 또는 1입니다.

이전에 시도한 횟수 : 만족스러운 결과와 함께 사용 된 binary_crossentropy 그러나 샘플 수가 검증 데이터에 대한 좋은 결과를 얻기에 충분하지 않습니다. 다른 활성화 및 레이어 크기를 사용하려고했습니다.

주요 질문은 categorical_crossentropy가 작동하지 않는 이유와 올바른 방법으로 사용하는 방법입니다.

또한 데이터 표현에 대한 한 가지 우려는 드물게 간단한 원-핫 인코딩 데이터 행에서 사용하는 것이 올바른 방법입니까?

답변

10xAI Aug 18 2020 at 13:52

작동하려면-

  1. 출력 뉴런 수를 02로 변경
  2. Softmax 로 출력 활성화
  3. OHE 출력의 모든 벡터 유지


이것이 Keras가 내부적으로 설계된 방식입니다. 공식 문서 페이지에도 동일하게 작성되었습니다.

BinaryCrossentropy 클래스
레이블 클래스가 두 개 뿐인 경우 (0과 1로 가정)이 교차 엔트로피 손실을 사용합니다. 각 예에 대해 예측 당 단일 부동 소수점 값이 있어야합니다. 아래 스 니펫에서 네 가지 예는 각각 부동 소수점 값이 하나만 있고 y_pred와 y_true는 모두 [batch_size] 모양을 갖습니다.

CategoricalCrossentropy 클래스
y_pred와 y_true의 모양은 모두 [batch_size, num_classes]입니다.

분류 다중 클래스 를 유지하려면 모든 num_class 출력을 서로 상대적으로 만들어야 한다는 것을 알고 있으므로 softmax 를 사용합니다.

참조
Keras 공식 페이지
유사한 SE 스레드
유사한 SE 스레드