인프런 커뮤니티 질문&답변

hibernation님의 프로필 이미지
hibernation

작성한 질문수

YOLO 구현으로 배우는 딥러닝 논문 구현 with TensorFlow 2.0

class_loss에 대해서 질문 있습니다.

작성

·

243

0

loss.py에서 class loss를 구하는 과정에 label값으로 사용되는 Ptf.one_hot 이 적용되는데,
그렇다면 prediction값으로 사용되는 pred_P 는 class에 대한 probability이기 때문에 (pred_P[:, :, 0]+ pred_P[:, :, 1]) == 1이 만족해야 하지 않나요? 아니면 probability가 아니여도 괜찮은건가요?
코드에서 사용된 pred_P는 class에 대한 probability가 아닌 것 같아 질문 드립니다.
그리고 one-hot은 단일 label에 적용되는 것이 아닌, 전체 label에 적용해야 하는데, 인자로 사용된 label[4]은 단일 label값만 가져오는 것 같습니다. 만일 코드를 단일 class에 대한 detection이 아닌, 여러 class에 대한 detection으로 변경한다면
tf.one_hot의 전달인자가 label[4]이 아닌, label number list가 들어가야 된다구 생각하는데... 제가 이해한게 맞을까요?

답변 1

0

AISchool님의 프로필 이미지
AISchool
지식공유자

안녕하세요~. 반갑습니다.

1. pred_P 값이 다 더하면 1이되는 확률값이 되어야하는게아닌가? 지금은 다 더하면 1이되는 제약조건이 없는것이 아닌가?

->

맞습니다. 현재는 다 더하면 1이되는 제약조건이 없어서 다 더하면 1이되는 형태로 가이드할뿐 명확하게 다 더하면 1이 되도록 제한하는 형태는 아닙니다. 어차피 prediction 시점에 class label 개수만큼의 예측값 중에서 확신의 정도가 가장 큰값을 argmax로 선택하기때문에 큰 문제가 되는 부분은 아닙니다.

2. 그리고 one-hot은 단일 label에 적용되는 것이 아닌, 전체 label에 적용해야 하는데, 인자로 사용된 label[4]은 단일 label값만 가져오는 것 같습니다. 만일 코드를 단일 class에 대한 detection이 아닌, 여러 class에 대한 detection으로 변경한다면 tf.one_hot의 전달인자가 label[4]이 아닌, label number list가 들어가야 된다구 생각하는데... 제가 이해한게 맞을까요?

->

label[4]가 전달하는 것은 클래스의 integer encoding 된 값이고, tf.one_hot API는 Integer Encoding 된 값을 num_classes크기만큼의 one-hot encoding 행렬로 자동변환해주는 형태로 동작합니다. 따라서 레이블값을 리스트로 넣을 필요는 없습니다. P = tf.one_hot(tf.cast(label[4], tf.int32), num_classes, dtype=tf.float32)

예를 들어, tf.one_hot(2(=label[4]), 3) -> [0 0 1] 형태로 변환해줍니다.

더자세한 내용은 아래를 참조하세요.

https://www.tensorflow.org/api_docs/python/tf/one_hot

감사합니다.
hibernation님의 프로필 이미지
hibernation
질문자

one-hot 부분에 추가 질문 있습니다.

강의의 code에서 cat은 7이라는 integer값이 들어있는데, 

이를 tf.one_hot(7.0(=label[4]), 1(=num_classes)) 이면 반드시 [0.] 이 출력됩니다.

이렇게 되면 학습이 진행될수록 pred_P값은 0으로 수렴하기 되지 않나요?

만일 class를 { 7: "cat", 9: "cow"} 처럼 2개를 사용하게 된다면

tf.one_hot(7.0(=label[4]), 2(=num_classes)) == [0. , 0.]

tf.one_hot(9.0(=label[4]), 2(=num_classes)) == [0. , 0.]

이렇게 출력됩니다. 이 또한 pred_P값은 0으로 수렴하게 되구요.

이 보다는 

cat일땐 label을 7.0에서 0으로 변경하고 cow일땐 label을 9.0에서 1로 변경하도록 해서 

tf.one_hot(0.0(=label[4]), 2(=num_classes)) == [1. , 0.]

tf.one_hot(1.0(=label[4]), 2(=num_classes)) == [0. , 1.]

이런 식으로 표현되도록 수정한다면 잘못된 방법일까요...?

AISchool님의 프로필 이미지
AISchool
지식공유자

안녕하세요~.

현재는 class가 cat 하나라서 class prediction의 의미가 없어서 해당 형태로 진행한 것이고 일반적인 상황에서는 말씀해주신대로

cat일땐 label을 7.0에서 0으로 변경하고 cow일땐 label을 9.0에서 1로 변경하도록 해서 

->

말씀해주신 방법대로 진행하는게 맞습니다~.

제대로 이해하고 계신 것 같습니다~.

감사합니다.

hibernation님의 프로필 이미지
hibernation

작성한 질문수

질문하기