인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

HAHA님의 프로필 이미지

작성한 질문수

[개정판] 딥러닝 컴퓨터 비전 완벽 가이드

안녕하세요 강사님 YOLO 학습 질문있습니다.

작성

·

446

0

강사님 안녕하세요

먼저 매번 질문에 자세하게 답변해주셔서 감사합니다!

YOLO 라쿤 데이터 학습을 시킬때 pretrained 된 모델을 학습시키지 않고 새로운 모델을 생성해서 학습시키는 것처럼 보입니다.

혹시 pretrained된 모델을 가지고 분류 쪽만 학습시키거나 층을 선택해서 학습 시킬수 있는 방법이 없을까요??

감사합니다.

답변 3

0

권 철민님의 프로필 이미지
권 철민
지식공유자

별 말씀을요,

즐거운 학습이 되셨으면 합니다.

감사합니다.

0

HAHA님의 프로필 이미지
HAHA
질문자

아 제가 강의를 다시 제대로 봤었어야 했는데 번거럽게 해서 죄송합니다..

답변해주셔서 정말 감사합니다!

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

일반적으로 pretrained 모델을 이용해 학습을 시킨다는 의미는 새로운 모델을 생성할 때 기존 pretrained 모델의 weight값을 이용하여 새로운 모델의 weight값을 초기화 한다는 의미 입니다.

YOLO 라쿤 데이터 학습은 Darknet YOLO 사이트에서 제공하는 yolo.h5 파일을 이용한 pretrained 모델을 이용합니다.

YOLO 모델은 대부분 Darknet yolo 사이트에서 제공하는 coco dataset의 pretrained 된 모델의 weight값으로 모델의 weight값을 초기화 합니다.  아래는 강의에 나와 있는 train 로직중에 일부분으로 create_model(.... , weights_path=model_weights_path) 에서 이렇게 pretrained 된 weight 값으로 초기화하여 모델을 생성합니다.

# coco dataset으로 pretrained 된 yolo weights 파일 위치
model_weights_path = os.path.join(BASE_DIR, 'model_data/yolo.h5' )
....

# 새로운 Yolo 모델 생성 시 coco dataset으로 pretrained된 모델의 weight 값으로 초기화
model = create_model(input_shape, anchors, num_classes,
        freeze_body=2, weights_path=model_weights_path)


그리고 강의에 사용된 keras-yolo3 패키지는 기본적으로 마지막 Classification/Regression 레이어를 제외하고 초기에는 모든 layer가 freeze 되어 있어서 이들 layer를 제외하고는 학습이 진행되지 않습니다.
그래서 keras-yolo3 패키지로 학습 할때 먼저 classification/Regression layer부터 먼저 학습 시키고, 다음에 전체 layer를 학습 시키는 로직을 적용하고 있습니다.

전체 코드를 다시 적으면 너무 길어져서 해당 부분을 강의 확인하실 수 있을 정도만 기재 하겠습니다.

# 초기에는 Classification/Regression 레이어를 제외하고 초기에는 모든 layer가 freeze되어 있으므로 이들 레이어만 학습
if True:
    model.compile()
    model.fit_generator(....)
      
    model.save_weights(log_dir + 'trained_weights_stage_1.h5')

# 이후에는 모든 layer를 trainable=True로 세팅하여 학습.
if True:
    for i in range(len(model.layers)):
        model.layers[i].trainable = True
    model.compile(optimizer=Adam(lr=1e-4), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) # recompile to apply the change
    model.fit_generator(data_generator_wrapper(....)

keras는 층을 선택해서 학습 시킬때, 해당 layer의 속성만 trainable=True로 설정하고 나머지 layer는 trainable=False로 설정하여 학습 시키는 방법을 사용합니다.

감사합니다.

HAHA님의 프로필 이미지

작성한 질문수

질문하기