LG U+ Why Not SW CAMP 7기 17주차 회고

gayoniee·2025년 9월 6일

회고

목록 보기
17/25

Liked

  • 같은 문제를 여러 프레임워크로 직접 구현해 봄:

    • scikit-learn MLPClassifier로 빠른 베이스라인 확인
    • TF1(placeholder, tf.matmul)로 W·b·행렬 곱 흐름을 손으로 느낀 점이 좋았다
    • Keras(TF2) Sequential/함수형 API(concatenate) 로 모델 쌓는 감각이 생김
    • PyTorch는 학습 루프(순전파→손실→역전파→step) 가 눈에 보여서 이해가 쉬웠다
  • 모듈 바꿔가며 효과 체감:

    • sigmoidreluPReLU, ELU, BatchNormalization, Dropout, he_normal, RandomNormal 등 한두 줄 교체로 학습 느낌이 달라지는 걸 직접 확인
    • Keras에서 모델 저장/로드(.keras, .to_json()) 까지 해보니 파이프라인 감이 잡힘
  • 흐름 구성: tf/GPU 확인 → MNIST 로드, 정규화(/255.0) → CNN 설계(Conv→Pool→Dropout→Flatten→Dense) → 학습/평가까지 한 흐름으로 정리됨.

  • 드롭아웃: 0.1 → 0.25 → 0.5로 깊어질수록 규제를 강화해 과적합을 의식한 구조가 좋았음.

  • 전이학습:

    • ImageNet 사전학습 ResNet50로 단일 이미지 분류(decode_predictions)를 해봄.
    • include_top=FalseFlatten→Dense(1024)→Dense(3) 3분류 실험을 구성.
  • 데이터 준비와 증강: zip 해제 → flow_from_directory로 train/test 분리, 회전/이동/좌우반전 증강으로 데이터 다양성 확보.

  • 원격·로컬 추론 연결

    Roboflow InferenceHTTPClient.infer()로 배포 모델(rock-paper-scissors-sxsw/14)을 바로 불러보고 로컬에선 YOLO('yolov8n.pt' | 'best.pt')로 재확인

  • 결과 파싱 & 시각화

    Roboflow JSON의 x,y,width,height,confidence,class를 읽고 xywh → xyxy 변환해서 cv2.rectangle, cv2.putText로 박스 그리기

  • YOLOv8 핵심 모듈

    Detection → Segmentation → Pose를 빠르게 한 사이클 돌렸다. 결과 구조(boxes/masks/keypoints)가 서로 어떻게 다른지 확인

Learned

  • 소프트맥스·시그모이드 어디에 둘지!

    • 다중분류는 마지막 층에 softmax로 확률을 만든다(Keras/TensorFlow)
    • PyTorch의 CrossEntropyLoss는 softmax 이전 로짓을 기대한다 → 모델 끝 Softmax는 빼고 손실이 내부에서 처리한다는 것
  • 라벨 ↔ 출력 유닛 수 정합(와인 데이터 포인트)

    • 원 라벨이 3~8이라 고유 클래스는 6개지만 인덱스가 0부터가 아님.
    • 선택지 두 개:
      1. 재인코딩(0~5) → Dense(6, softmax)
      2. 원 라벨 유지(3~8) → 최소 Dense(9, softmax) (0~8 공간)
    • 베이스 코드가 Dense(10)을 쓰기도 했는데 동작은 하지만 0,1,2,9가 비며 비효율. 내가 만든 모델에서 Dense(9)로 맞춘 이유!
  • 순전파/역전파 흐름을 TF1로 배움

    • shape가 한 번 어긋나면 전체가 멈춤(이전 디버깅 때도 행렬 곱 차원 에러 겪음).
    • 결국 행렬 크기와 dtype을 계속 의식해야 한다는 걸 배움
  • 훈련 vs 평가 지표 차이

    • fit(...) 도중 보이는 건 훈련셋 기준, evaluate(...)는 테스트셋 기준 → 다르게 나오는 게 정상
    • 아이리스에서 훈련 동안 보인 값과 최종 evaluate가 조금 다른 것도 이 때문
  • 모델 구조의 작은 차이가 수렴에 영향

    • Dense → BatchNorm → Activation → Dropout 순서로 둔 모델이 안정적으로 학습되는 느낌
    • PReLU()Dense(..., activation=PReLU())가 아니라 별도 레이어로 추가해야 층이 깨끗이 잡힌다(이번 코드에서 그렇게 처리)
  • CNN 블록의 역할 분담:

    • Conv2D → 작은 3×3 창(커널)을 굴리며 모서리, 선 같은 저수준 패턴을 감지하고, 층이 깊어질수록 복잡한 패턴으로 확장됨.
    • MaxPooling2D → 특징 지도의 가로, 세로 크기를 절반으로 줄여 계산량↓, 작은 위치 변화에 덜 민감해짐(견고성↑).
    • Flatten → Dense → 2D 특징 지도를 1D 벡터로 펼친 뒤 그 특징들을 결정 경계로 바꿔 클래스 확률을 내게 함.
  • 손실함수, 라벨 타입 매칭

    • sparse_categorical_crossentropy ↔ 라벨이 정수
    • categorical_crossentropy ↔ 라벨이 원-핫 벡터
  • 전이학습

    1. 두 가지 사용 흐름을 체감함
    • (A) 사전학습 모델 그대로 사용: ResNet50(weights='imagenet')로 불러와 단일 이미지를 (224,224)로 맞추고 predict → decode_predictions로 ImageNet 1000클래스 예측을 확인.
    • (B) include_top=False: include_top=False로 분류기 빼고 가져온 뒤 위에 Flatten → Dense(1024, relu) → Dense(3, softmax)를 쌓아 3클래스 문제에 맞게 학습.
    1. 데이터 준비, 증강
    • zip 해제 후 flow_from_directory(train/test)로 폴더 구조 = 라벨 매핑 자동화.
    • rotation/shift/horizontal_flip 증강으로 데이터 다양성↑ → 과적합 완화에 도움.
  • GPU 활용 체크

    • tf.config.list_physical_devices('GPU')로 확인. →
      리스트에 GPU:0 보이면 GPU 사용 가능
  • Roboflow와 Ultralytics의 반환 구조 차이

    • Roboflow: 딕셔너리(JSON) 중심, 바로 predictions 리스트 순회
    • Ultralytics: result[0].boxes/masks/keypoints처럼 객체화된 구조 + result[0].plot() 제공 → 같은 박스 그리고 라벨 찍기라도 접근 방식이 다름!
  • confidence/overlap 인자 스케일

    Roboflow 에서 confidence=40, overlap=30처럼 퍼센트(%) 스케일을 넣는 패턴을 익혔다. (Ultralytics 추론은 보통 0~1 스케일 conf를 옵션으로 조절)

  • best 가중치 검증 루틴

    YOLO('runs\\detect\\train\\weights\\best.pt') → .val()로 학습 결과를 같은 데이터셋으로 재검증하는 루틴이 안정화. 모델 비교가 훨씬 수월해짐.

  • 튜닝 파일을 실제 학습에 반영하는 법

    best_hyperparameters.yamlyaml.safe_load로 읽어 train(**hyp_dict)에 주입하는 흐름을 익힘. 탐색→적용

Lacked

  • 평가 지표의 다양성 부족: 아이리스에서 accuracy만 보거나 crosstab만 봤다. 혼동행렬, macro F1까지 같이 봤으면 클래스별 밸런스를 더 명확히 확인했을 것

  • 학습 곡선 시각화 미흡: history를 바로 그래프로 그려 과적합 시점을 잡는 습관이 아직 부족했다

  • 결정성(Seed) 통제 부족: 실행할 때마다 초기값/셔플 때문에 결과가 조금씩 달라지는 걸 확인했지만, 프레임워크별 시드 통일은 덜 했다

  • PyTorch 규칙 반영 미완: 이번 노트에선 모델 끝에 Softmax(dim=1)를 둔 상태로 CrossEntropyLoss를 썼다. 다음엔 Softmax 제거 + y를 처음부터 long 으로 잡아보기

  • 평가 지표 확장 부족: 최종 evaluate에 accuracy만 사용해보아 손실과 정확도로만 평가를 해봄

  • 실행을 할 때마다 결과가 달라짐 → 시드를 고정해보기

  • horizontal_flip=True 에서 만약 데이터의 좌우 정보가 중요하다면.. 성능에 안좋은 영향을 미칠 수 있을 것 같음

  • 지표 뜻/우선순위가 직관적이지 않음

    mAP50은 오르는데 mAP50-95가 정체 → 좋은 건가 나쁜 건가?가 애매했음. 얼리스탑의 fitness가 mAP50-95 비중이 큼도 뒤늦게 연결됨.

  • 학습/검증 데이터 경로가 섞여 보임

    ./datasets1/data.yamlnumbers/data.yaml를 오가며 돌려서 지금 이 best.pt는 어느 데이터로 학습된 거지?가 즉시 안 보였음.

  • QA에 context 없이 질문만 넣음 → 모델이 답을 못 찾아서 공백/개행을 답으로 고름.

  • 요약에서 길이(512 토큰) 초과 경고남 → 너무 길어서

  • 결과에 E 토큰이 섞여 나옴 → 예측 후처리(토큰 제거, E 이전 컷)가 빠졌음.

Longed for

  • 내 표준 틀 만들기

    • plot_history(history), print_report(y_true, y_pred) 유틸을 만들어 학습 곡선 + 혼동행렬 + macro F1을 항상 같이 보는 것?
    • (PyTorch) Softmax 없는 모델 + CrossEntropyLoss + y.long() 세트로 템플릿 고정!
  • 와인 라벨 전략 비교 실험

    • Dense(6)+재인코딩(0~5) vs Dense(9)+원라벨(3~8) 를 같은 조건으로 비교해서 내 데이터에서 어떤 게 더 안정적으로 나오는지 체크
  • 실행 결과가 동일하게 나올 수 있도록 통일할 수 있는 시드가 어떤 것이 있는지 찾아봐야겠다.

  • 모델 평가에서 다른 지표들을 활용해봐야겠다.

0개의 댓글