본문 바로가기

Study doc./Summary

딥러닝 입문자를 위한 모델 구조 (Computer Vision)

머신러닝을 처음 공부할때 어려웠던 점 중 하나는 지금 어떤 부분을 공부하고 있는지 몰랐던 겁니다.

 

예를 들어,

tree 기반 알고리즘을 공부할때 '불순도' 라는 개념을 공부했을 것입니다.

그 당시에는 불순도가 이런거고, gini계수랑 엔트로피가 이런거구나!! 했지만,

전체적인 머신러닝 모델 관점에서 봤을때는 이 개념이 왜 필요한지, 어디 부분인지를 몰랐습니다.

 

하지만 머신러닝에 대한 지식이 어느 정도 쌓인 지금은 대답할 수 있습니다.

전처리, 모델링, 학습 및 평가 중 모델링에 속하고,

모델링의 알고리즘에는 로지스틱, 랜덤포레스트, XGBoost 등 다양한 알고리즘이 존재하지만, 

그 중 tree 기반의 알고리즘에서 노드가 분할하기 위한 기준으로 불순도가 사용된다는것을요!

 

만약 불순도를 처음 공부할 때 이렇게 전체적인 구조를 알고있었더라면

노드가 분할하는 다른 조건은 없을까 하는 의문을 가질 수 있고,

트리 기반 모델의 파라미터에서 gini와 entropy를 쉽게 결정할 수 있었을 것입니다.

 

오늘 포스팅은 딥러닝의 입문자들을 위해 전체적인 딥러닝 모델 구조를 정리하고,

내가 어떤 위치에서 어떤 공부를 하고 있는지 파악하는것을 돕기 위해 작성했습니다.

 

따라서 각 개념들과 원리에 대해서는 다루지 않고, 어떤 파트에 어떤 개념이 있다 정도를 정리하겠습니다.

가볍게 읽어주시고, 모르는 개념은 따로 공부해보시는 것을 권장드립니다.

그럼 시작해볼게요!

 

 

순서

  1. 데이터 전처리
  2. 모델 구조 만들기 (layer 쌓기)
  3. 모델에 사용할 기준 정의 (compile)
  4. 콜백 함수 정의
  5. 모델 학습 (fit)
  6. 여러개의 모델 중 최고의 모델 가져오기 (load_weight)

 


 

1. 데이터 전처리

딥러닝에서 가장 중요한 것은 input과 output의 개수를 정하는 것입니다.

input과 output에서 요구되는 데이터 개수와 크기를 사용자가 알고 직접 지정해주어야 합니다.

 

예를 들어 10개의 25*25*25 사이즈 이미지를 통해 토끼, 고양이, 강아지를 분류하는 모델의 경우

input의 개수는 25*25*25*10 개가 되고, output의 개수는 3 이 됩니다.

 

일단은 전처리 단계에서 input과 output 의 크기와 개수가 중요하다 정도만 알고 넘어가시죠! 

 

 

2. 모델 구조 만들기 (layer 쌓기)

딥러닝은 기본적으로 layer를 여러겹 쌓아서 사용합니다.

그리고 이걸 코드로 구현하는 과정에는 여러가지가 있는데, 

사용하는 프레임 워크(tensorflow, keras, pytorch 등)에 따라서도 다르고(머신러닝에서는 주로 sklearn이 사용됨),

layer를 쌓는 문법에 따라서도 다릅니다(Sequential/ 모델 API).

일단은 tensorflow와 Sequential을 이용해서 시작해보는 것을 권장드립니다.

 

딥러닝의 성능은 어떤 layer를 얼마나, 어떤 순서로 쌓을지가 핵심 포인트 입니다.

따라서 우리는 layer의 종류(conv, pooling, dropout, batch normalization 등)와 특징, 그리고 장단점을 알아야 합니다.

 

그리고 직접 모델 구조를 실험적으로 설계해도 되지만,

다른 사람이 만들어둔 모델 구조를 호출해서 사용할 수도 있습니다.

혹은 그 모델 구조를 기반으로 조금만 수정해서 사용해도 되죠!

 

컴퓨터 비전 영역(이미지, 동영상 처리)에서 유명한 구조로는 VGGNet, ResNet 등이 있습니다.

자연어 처리 혹은 다른 딥러닝 영역에서는 또 다른 예시들이 있겠죠!

따라서 우리는 어떤 영역에 어떤 모델 구조가 있는지 공부해야 합니다. 

그리고 그 모델을 호출해서 내 코드에 적용하는 방법도 알아야겠죠(transfer learning)!

 

이런 이유로 딥러닝 분야는 대학원을 가야하고, 취직 후에도 공부를 해야하는것 같습니다.

매년 성능 좋은 모델 구조가 논문으로 발표되기 때문에 이런 속도를 따라갈 수 있어야겠죠.

 

예시)

 model = tf.keras.Sequential([tf.keras.layers.Input(num_columns),
                            tf.keras.layers.BatchNormalization(),
                            tf.keras.layers.Dropout(0.2),
                            tfa.layers.WeightNormalization(tf.keras.layers.Dense(2048, activation='relu')),
                            tf.keras.layers.BatchNormalization(),
                            tf.keras.layers.Dropout(0.2),
                            tfa.layers.WeightNormalization(tf.keras.layers.Dense(1024, activation='relu')),
                            tf.keras.layers.BatchNormalization(),
                            tf.keras.layers.Dropout(0.2),
                            tfa.layers.WeightNormalization(tf.keras.layers.Dense(512, activation='relu')),
                            tf.keras.layers.BatchNormalization(),
                            tf.keras.layers.Dropout(0.2),
                            tfa.layers.WeightNormalization(tf.keras.layers.Dense(206, activation='sigmoid'))])

 

 

3. 모델에 사용할 기준 정의 (compile)

모델의 기준을 설정하는 단계입니다.

loss를 어떤 기준으로 할지(categorical_crossentropy, binary_crossentropy 등),

optimization은 어떤 방법으로 할지(SGD, Adam, momentum 등),

어떤 값을 기준으로 성능을 평가할지 등을 결정합니다(accuracy, log_loss 등).

 

따라서 왜 loss가 중요한지,

loss를 계산하는 방법에는 어떤게 있는지,

이것을 최적화하는 방법에는 또 어떤게 있는지 등을 공부해야 합니다.

 

보통 저희가 처음에 경사하강법 (gradient descent) 을 공부하죠.

이건 최적화 방법 중 하나였습니다.

이것의 장,단점과 이 단점을 보완한 다른 방법을 알아야겠죠.

 

loss 역시 y값이 0과 1로 구분될때, 여러 개 중 하나일때, 여러 개중 여러 개일때 등 다양한 가지수가 있습니다.

이 모든 것들을 알고, 상황에 따라 지정해줘야 합니다.

 

예시)

model.compile(loss='categorical_crossentropy',optimizer=Adam(),metrics =['accuracy'])

 

 

4. 콜백 함수 정의

콜백 함수는 말 그대로 call back, 다시 부르는 함수입니다.

주로 사용되는 콜백함수로는 최적의 학습률을 찾는 ReduceLROnPlateau 와 최적의 가중치를 찾는 ModelCheckpoint 가 있습니다.

 

딱 학습률과 가중치 값이 나오는게 아니라 그 모델을 저장하기 때문에, 콜백함수를 적용한 다양한 모델 중에서 최적의 모델을 불러오는 과정이 필요합니다. 

 

따라서 콜백함수의 종류와 파라미터에 대한 이해가 필요합니다.

 

예시)

reduce_lr_loss = ReduceLROnPlateau(monitor='val_loss', # 어떤 기준으로 볼건지
		factor=0.1, # 학습속도를 얼만큼 줄일지 (lr = lr*factor)
		patience=3, # 학습이 안되는걸 몇번의 반복만큼 연속되야 학습속도를 줄일건지
		verbose=1, # 메세지 보임
		min_delta=1e-4, # 새로운 최적값을 구할 한계점
		mode='min') # loss라서 min

# 콜백함수 중 하나, 모델이 학습하면서 가중치를 중간 저장
cb_checkpt = ModelCheckpoint(checkpoint_path, # 파일이름
		monitor = 'val_loss', # 이 값이 개선되었을때 호출됨
		verbose = 0, # 진행표시줄 표시 안함
		save_best_only = True, # 가장 best값만 저장
		save_weights_only = True, # 모델 전체가 아니라 가중치만 저장
		mode = 'min') # auto, max, min 중 하나 / 측정값이 loss이기 때문에 min, accurcy면 max

 

 

5. 모델 학습 (fit)

정의한 콜백함수와 몇번 반복할지(epoch), 샘플로 몇 개를 뽑아서 계산할지(batch_size) 등을 결정하고 학습하는 단계입니다.

 

예시)

model.fit(train.values[tr][:, top_feats], # 훈련데이터 kfold train
		train_target.values[tr], # 훈련데이터 kfold label
		validation_data=(train.values[te][:, top_feats], train_target.values[te]), # 콜백 함수 사용시 필요함, 업데이트의 기준이 필요하니깐
		epochs=35, # 몇번 학습할건지, 학습 수
		batch_size=128, # 경사 업데이트별 샘플 수
		callbacks=[reduce_lr_loss, cb_checkpt], # 콜백 함수의 인스턴스(객체) 리스트
		verbose=2 # 0:자동/ 1:진행표시줄/ 2:반복마다 몇번중 몇번째인지 보여줌
		)

 

 

6. 여러개의 모델 중 최고의 모델 가져오기 (load_weight)

콜백 함수에서 찾은 좋은 성능의 모델을 가져오는 단계입니다.

이후로는 머신러닝과 같이 predict 를 통해 예측하고, 평가하면 됩니다.

 

예시)

model.load_weights(checkpoint_path)