Keras 모델이 배경을 인식하는 방법을 배우는 이유는 무엇입니까?


9

사전 훈련 된 모델을 사용하여 Pascal VOC2012에서 Deeplabv3 + 의이 Keras 구현 을 훈련하려고합니다 (이 데이터 세트에서도 훈련 됨).

정확도가 1.0으로 빠르게 수렴되는 이상한 결과를 얻었습니다.

5/5 [==============================] - 182s 36s/step - loss: 26864.4418 - acc: 0.7669 - val_loss: 19385.8555 - val_acc: 0.4818
Epoch 2/3
5/5 [==============================] - 77s 15s/step - loss: 42117.3555 - acc: 0.9815 - val_loss: 69088.5469 - val_acc: 0.9948
Epoch 3/3
5/5 [==============================] - 78s 16s/step - loss: 45300.6992 - acc: 1.0000 - val_loss: 44569.9414 - val_acc: 1.0000

모델 테스트도 100 % 정확도를 제공합니다.

나는 훈련 전후에 동일한 무작위 이미지 세트에 대한 예측을 플롯하기로 결정했으며 모델이 모든 것이 배경 (Pascal VOC2012의 첫 번째 클래스)이라고 말하는 것이 좋습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

저는 딥 러닝에 익숙하지 않으며 이것이 어디에서 왔는지 알아내는 데 도움이 필요합니다.

아마도 이것이 손실 함수 일 수 있다고 생각했습니다.

def image_categorical_cross_entropy(y_true, y_pred):
    """
    :param y_true: tensor of shape (batch_size, height, width) representing the ground truth.
    :param y_pred: tensor of shape (batch_size, height, width) representing the prediction.
    :return: The mean cross-entropy on softmaxed tensors.
    """
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true))

내 텐서의 모양이 올바른지 확실하지 않습니다. TF의 데이터 세트 API를 사용하여 .tfrecord파일 을로드 하고 있으며 주석 텐서 모양 (batch_size, height, width)입니다. 겠습니까 (batch_size, height, width, 21)무엇을 필요한 수? 주석 이미지를 21 개의 이미지가 포함 된 텐서 (각 클래스 당 하나씩)로 분리하려고하면 모델 내부의 다른 오류가 발생합니다.

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12,512,512,21] vs. [12,512,512]
         [[Node: metrics/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/ArgMax, metrics/acc/ArgMax_1)]]
         [[Node: training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1/_13277 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:1", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_62151_training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:1"]()]]

도와 주셔서 감사합니다!


5
여기에서 고려해야 할 몇 가지 항목, 나는 어디에서 시작 해야할지 거의 모릅니다 (1) 훈련에 샘플 크기 5를 사용하고 있습니까 ??? (2) 이미지에 대해 어떤 전처리 작업을 수행하고 있습니까? 나는 그 대답이 이것 안에 있다고 생각하고 (3) 당신의 모델에 대해 더 많은 정보를 제공해야합니다. 몇 개의 라벨링 된 샘플이 있습니까? 가능한 카테고리는 몇 개입니까? 균형 잡힌 훈련 세트가 있습니까? (4) 1.0의 정확도는 손실이 매우 높고 증가하기 때문에 기본적으로 아무 의미가 없습니다. 정확도가 향상되면 손실이 줄어 듭니다 .
I_Play_With_Data

(1) 크기가 12 인 배치를 사용하고 있지만 관련이 없습니다. 여기서는 단지 5 단계로 3 개의 작은 에포크 만 보여주었습니다. (2) 내 전처리는 모든 이미지와 관련 주석에 대해 일부 확대 및 크기 조정 (512x512)으로 구성됩니다 (자르기 가능). (3) Pascal VOC 2012에는 약 11,500 개의 레이블이있는 이미지가 있습니다.이 데이터 세트에 대해 대부분의 논문이 85 % 이상 mIOU에 도달하면 균형이 잡힌 것으로 가정합니다. 이 데이터 세트에는 20 개의 범주가 있고 배경 또는«모호한»하나에 대해 총 21 개가 있습니다.
Matt

나는 호기심입니다. 모델 결과에 대한 이유를 찾았습니까?
Mark.F

3
코드를 공유하면 실수를 찾을 수 있습니다.
Dmytro Prylipko

1
사전 훈련 된 모델이 원래 사용 된 것과 동일한 데이터를 사용하여 3 epoch 내에서 100 % 정확도를 얻는 방법을 발견한다는 사실은 훈련 레이블이 잘못되었거나 버그가 해당 레이블로 설정되어 있다고 생각합니다. 배경. 어쨌든 사람들이 모델을 미세 조정하기 위해 문제와 해결책을 논의하는 이 문제 스레드를 살펴보십시오 . 모델이 반드시 깨지는 것은 아니며 Tensorflow의 batchnorm 버그를 해결할 수 있습니다.
n1k31t4

답변:


1

모델이 과적 합합니다. 각 시대에는 5 개의 이미지 만 있습니다. 모델은 각 이미지에 대한 답변을 "암기"합니다.

과적 합의 가능성을 최소화하려면 이미지 수를 늘리십시오. 각 객체 범주에 대해 수천 개의 예제 이미지가 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.