inflearn logo
강의

Course

Instructor

Deep Learning Paper Implementation with YOLO Implementation with TensorFlow 2.0

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

306

hibernation

12 asked

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가 들어가야 된다구 생각하는데... 제가 이해한게 맞을까요?

딥러닝 tensorflow

Answer 1

0

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

감사합니다.

0

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.]

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

0

AISchool

안녕하세요~.

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

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

->

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

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

감사합니다.

수업자료

0

23

2

paperswithcode 서비스 종료 관련 문의

0

209

2

22강 코드 call()메서드 is_training -> model(x,False)로 호출시 밸류에러 참고

0

48

1

강의자료 질문

0

42

1

강의자료는 어떻게 보나요

0

83

2

MNS 질문

0

321

1

model.py의 Activation Function

0

532

1

코랩에서 train.py 실행 시 오류

0

721

1

object_exists_cell_i 계산식

0

448

0

데이터셋 변경에 대한 질문

0

264

0

reshape 한 후 7*7*30

0

290

1

작성한 코드의 저작권과 깃헙 업로드 가능유무에 대한 질문

0

314

1

Train시 bounding box의 개수 설정 관련

0

417

1

backbone network에 대해서 질문 있습니다.

0

290

1

one_hot과 C값에 대해서 질문 드립니다.

0

311

1

질문있어서 글 올립니다.

0

305

1

안녕하십니까 강의 잘 보고 있습니다

0

460

5

두 가지 질문 드립니다.

0

265

1

loss.py 의 loss에 사용된 tf.nn.l2_loss 에 대해서 질문 드립니다.

0

446

1

loss function 관련 질문입니다

0

240

1

loss function 관련

0

222

1

NMS 구현 관련 질문있습니다.

0

235

1

confidence가 가장 큰 값으로 IOU 비교 이후 과정에 대해

0

359

1

confidence <= 0.6 이하의 Bounding Box 제거에서 confidence는 class probability가 곱해진 값인지요?

0

330

3