같은 문제를 여러 프레임워크로 직접 구현해 봄:
MLPClassifier로 빠른 베이스라인 확인tf.matmul)로 W·b·행렬 곱 흐름을 손으로 느낀 점이 좋았다Sequential/함수형 API(concatenate) 로 모델 쌓는 감각이 생김모듈 바꿔가며 효과 체감:
sigmoid ↔ relu ↔ PReLU, ELU, BatchNormalization, Dropout, he_normal, RandomNormal 등 한두 줄 교체로 학습 느낌이 달라지는 걸 직접 확인.keras, .to_json()) 까지 해보니 파이프라인 감이 잡힘흐름 구성: tf/GPU 확인 → MNIST 로드, 정규화(/255.0) → CNN 설계(Conv→Pool→Dropout→Flatten→Dense) → 학습/평가까지 한 흐름으로 정리됨.
드롭아웃: 0.1 → 0.25 → 0.5로 깊어질수록 규제를 강화해 과적합을 의식한 구조가 좋았음.
전이학습:
decode_predictions)를 해봄.include_top=False로 Flatten→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)가 서로 어떻게 다른지 확인
소프트맥스·시그모이드 어디에 둘지!
softmax로 확률을 만든다(Keras/TensorFlow)CrossEntropyLoss는 softmax 이전 로짓을 기대한다 → 모델 끝 Softmax는 빼고 손실이 내부에서 처리한다는 것라벨 ↔ 출력 유닛 수 정합(와인 데이터 포인트)
3~8이라 고유 클래스는 6개지만 인덱스가 0부터가 아님.Dense(6, softmax)Dense(9, softmax) (0~8 공간)Dense(10)을 쓰기도 했는데 동작은 하지만 0,1,2,9가 비며 비효율. 내가 만든 모델에서 Dense(9)로 맞춘 이유!순전파/역전파 흐름을 TF1로 배움
훈련 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 ↔ 라벨이 원-핫 벡터전이학습
ResNet50(weights='imagenet')로 불러와 단일 이미지를 (224,224)로 맞추고 predict → decode_predictions로 ImageNet 1000클래스 예측을 확인.include_top=False로 분류기 빼고 가져온 뒤 위에 Flatten → Dense(1024, relu) → Dense(3, softmax)를 쌓아 3클래스 문제에 맞게 학습.flow_from_directory(train/test)로 폴더 구조 = 라벨 매핑 자동화.rotation/shift/horizontal_flip 증강으로 데이터 다양성↑ → 과적합 완화에 도움.GPU 활용 체크
tf.config.list_physical_devices('GPU')로 확인. →GPU:0 보이면 GPU 사용 가능Roboflow와 Ultralytics의 반환 구조 차이
predictions 리스트 순회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.yaml을 yaml.safe_load로 읽어 train(**hyp_dict)에 주입하는 흐름을 익힘. 탐색→적용
평가 지표의 다양성 부족: 아이리스에서 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.yaml와 numbers/data.yaml를 오가며 돌려서 지금 이 best.pt는 어느 데이터로 학습된 거지?가 즉시 안 보였음.
QA에 context 없이 질문만 넣음 → 모델이 답을 못 찾아서 공백/개행을 답으로 고름.
요약에서 길이(512 토큰) 초과 경고남 → 너무 길어서
결과에 E 토큰이 섞여 나옴 → 예측 후처리(토큰 제거, E 이전 컷)가 빠졌음.
내 표준 틀 만들기
plot_history(history), print_report(y_true, y_pred) 유틸을 만들어 학습 곡선 + 혼동행렬 + macro F1을 항상 같이 보는 것?CrossEntropyLoss + y.long() 세트로 템플릿 고정!와인 라벨 전략 비교 실험
실행 결과가 동일하게 나올 수 있도록 통일할 수 있는 시드가 어떤 것이 있는지 찾아봐야겠다.
모델 평가에서 다른 지표들을 활용해봐야겠다.