AI/혼공학습단9기_DL&ML

[혼공머신] 6주차 과제 - 딥러닝

moviewine 2023. 2. 8. 08:13

1. Contents

1) 인공 신경망

  • 생물학적 neuron에서 영감을 받아 만든 머신러닝 알고리즘
  • 신경망을 사용하면 기존의 머신러닝 알고리즘으로 다루기 어려운 이미지, 음성, 텍스트 등에서 뛰어난 성능을 발휘함
  • 인공신경망 알고리즘 == 딥러닝
  • Tensorflow는 google이 만든 딥러닝 라이브러리로서, CPU 또는 GPU를 사용해 인공 신경망 모델을 효율적으로 훈련하며 모델 구축과 서비스에 필요한 다양한 도구를 제공함.
  • Keras를 핵심 API로 채택한 이래 간단한 모델 부터 복잡한 모델까지 손쉽게 만들 수 있음.
  • Dense Layer(밀집층)은 가장 간단한 인공 신공망 층으로서, 양쪽의 neuron이 모두 연결하고 있기 때문에  fully connected layer(완결 연결층)이라고도 부름. 인공신경망에는 여러 층(layer)가 있는데, 출력층(output layer)에 밀집층을 사용할 때는 분류하려는 클래스와 동일한 개수의 neuron을 사용함.
    • Dense Layer의 첫 번째 매개변수에는 사용할 Activation Fuction(활성화 함수)를 지정함.
    • Activation Function으로는 sigmoid, softmax등이 있음.
    • 한편, Sequential은 Keras에서 신경망 모델을 만든 클래스임. 이 클래스 객체를 생성할 때 신경망 모델을 추가할 층을 지정할 수 있음. Keras의 Sequential 클래스에 맨 처음 추가되는 input_shape 매개변수로 입력의 크기를 지정함.
    • Compile()은 모델 객체를 만든 후 훈련하기 전에 사용할 Loss Function과 측정 지표(metrics)를 지정하는 메서드 임.
      • Loss 매개변수에 손실 함수를 지정함. 이진 분류일 경우 "binary_crossentropy"를 지정하고, 다중 분류일 때는 "categorical_crossentropy"를 지정함.
      • 클래스 레이블이 정수일 경우 "sparse_categorical_crossentropy"로 지정함.
      • 회귀 모델일 경우 "mean_square_error" 등으로 지정할 수 있음.
      • Metrics(측정 지표) 매개변수에 훈련 과정에서 측정하고 싶은 지표를 지정함.
  • One-Hot Encoding(원-핫 인코딩)은 정수값을 배열해서 해당 정수 위치의 원소만 1이고 나머지는 0으로 변환함으로써, 다중 분류에서의 출력층에서 만든 확률과 cross entropy 손실을 계산하기 위해서 임.
  • fit()은 모델을 훈련하는 메서드
    • 첫 번째와 두 번째 매개변수에 입력과 타겟 데이터를 전달합니다. 
    • epochs 매개변수에 전체 데이터에 대해 반복할 epochs 횟수를 지정함.
  • evaluate()는 모델 성능을 평가하는 메서드
    • 첫 번째와 두 번째 매개변수에 입력과 타겟 데이터를 전달함.
    • compile() 메서드에서 loss 매개변수에 지정한 손실 함수값과 metrics 매개변수에서 지정한 측정 지표를 출력함.

 

2) 심층 신경망

  • 심층 신경망은 2개 이상의 층을 포함한 신경망으로서, 다중 인공 신경망, 딥러닝과 같은 의미로 사용함.
  • Relu는 이미지 분류 모델의 Hidden Layer(은닉층)에 많이 사용하는 활성화 함수로서, Sigmoid function층이 많을 수록 활성화 함수의 양쪽 끝에서 변화가 작기 때문에 학습이 어려운 부분을 보완할 수 있음.
  • Optimizer는 신경망의 Weight(가중치)절편을 학습하기 위한 알고리즘 또는 방법을 말함. Keras에서는 다양한 경사하강법 알고리즘이 구현되어 있음. 대표적으로 SGD, 네스테로프 모멘텀, RMSprop, Adam 등이 있음.
  • TensorFlow
    • add()는 keras 모델에 층을 추가하는 메서드로서, keras.layers 패키지 아래 층의 객체를 입력받아 신경망 모델에 추가함. add()메서드를 호출하여 전달한 순서대로 층이 차례대로 늘어남.
    • summay()는 케라스 모델 정보를 출력하는 메서드로서, 모델에 추가된 층의 종류와 순서, 모델 파라메터 개수를 출력함. 층을 만들 때 name 매개변수로 이름을 지정하면 summary() 메서드 출력에서 구분하기 쉬움.
    • SGD는 경사 하강법 optimizer 클래스
      • learning_rate 매개변수로 학습률을 지정하며 기본값은 0.01 임.
      • momntum 매개변수에 0 이상의 값을 지정하면 모멘텀 최적화를 수행함.
      • nesterov 매개변수를 True로 설정하면 네스테로프 모멘텀 최적화를 수행함.
    • Adagrad는 Adagrad optimizer 클래스
      • learning_rate 매개변수로 학습률을 지정하여 기본값은 0.001
      • Adgrad는 그래디언트 제곱을 누적하여 학습률을 나눔. initial_accumulator_value 매개변수에서 누적 초깃값을 지정할 수 있으며 기본값은 0.1 
    • RMSprop는 RMSProp optimizer 클래스
      • learning_rate 매개변수로 학습률을 지정하며 기본값은 0.001
      • Adgrad처럼 그레디언트 제곱으로 학습률을 나누지만, 최근의 그레디언트를 사용하기 위해 지수 감소를 사용. rho 매개변수에서 감소 비율을 지정하며 기본값은 0.9
    • Adam은 Adam optimizer 클래스
      • learning_rate 매개변수로 학습률을 지정하며 기본값은 0.001
      • 모멘텀 최적화에 있는 그레디언트 지수 감소 평균을 조절하기 위해 beta_1 매개변수가 있으며 기본값은 0.9
      • RMSprop에 있는 그레디언트 제곱의 지수 감소 평균을 조절하기 위해 beta_2 매개변수가 있으며 기본값은 0.999

 

3) 신경망 모델 훈련

  • Dropout은 hidden layer에 있는 neuron의 출력을 random하게 제거하여 overfitting을 막는 방법.
    • Dropout은 training 중에 적용되며 평가나 예측에서 적용하지 않음.
      • 첫 번째 매개변수로 dropout할 비율(r)을 지정함. Dropout하지 않는 뉴런의 출력은 1/(1-r)만큼 증가시켜 출력의 총합이 같도록 만듬.
      • Tensorflow에서는 dropout을 자동으로 처리함.
  • save_weights()는 모든 층의 가중치와 절편을 파일에 저장함.
    • 첫 번째 매개변수에 저장할 파일을 지정.
    • save_format 매개변수에서 저장할 파일 포멧을 지정(기본적으로 tensorflow의 Checkpoint 포멧을 사용)
    • 저장할 파일은 "h5"로 지정하거나 파일의 확장자가 "h5"이면 HDF5포멧으로 저장됨.
  • load_weight()는 모든 층의 가중치와 절편을 파일에 읽으며 첫 번째 매개변수에 읽을 파일을 지정함.
  • save()는 모델 구조와 모든 가중치와 절편을 파일에 저장하며, 첫 번째 매개변수에 저장할 파일을 지정함.
    • save_format 매개변수에서 저장할 파일 포멧을 지정함.
    • 기본적으로 tensorflow의 SavedModel 포멧을 사용함.
    • 이 매개변수를 "h5"로 지정하거나 파일의 확장자가 ".h5"이면 HDF5 포멧으로 저장됨
  • load_model()은 model.save()로 저장된 모델을 로드하며, 첫 번째 매개변수에 읽을 파일을 지정함.
  • ModelCheckpoint는 keras 모델과 가중치를 일정 간격으로 저장하며, 첫 번째 매개변수에 저장할 파일을 지정함.
    • monitor 매개변수는 모니터링할 지표를 지정함(기본값: val_loss).
    • save_weights_only 매개변수의 기본값은 False로 전체 모델을 저장함. True로 지정하면 모델의 가중치와 절편만 저장함.
    • save_best_only 매개변수를 True로 지정하면 가장 낮은 검증 점수를 만드는 모델을 저장함.
  • Call back(콜백)은 keras 모델을 훈련하는 도중에 어떤 작업을 수행할 수 있도록 도와주는 도구임. 대표적으로 최상의 모델을 자동으로 저장해 주거나(best_epochs) 검증 점수가 더 이상 향상되지 않으면 일찍 종료할 수 있게(early_stopping) 해줌.
    • early_stopping은 검증 점수가 더 이상 감소하지 않고 상승하여 overfitting이 일어나면 훈련을 계속 진행하지 않고 멈추는 방법임. 이렇게 하면 계산 비용과 시간을 절약할 수 있음.
    • monitor 매개변수는 모니터링할 지표를 지정함(기본값: val_loss).
    • patience 매개변수에 모델이 더 이상 향상되지 않고 지속할 수 있는 최대 epochs 횟수를 지정함.
    • restore_best_weights 매개변수에 최상의 모델 가중치를 복원할 지 지정함. 기본값은 False임.
  •  Numpy()의 argmax는 배열에서 축을 따라 최대값의 index를 반환하며, axis 매개변수에서 어떤 축을 따라 최대값을 찾을 지 지정함. 기본값은 None으로 전체 배열에서 최대값을 찾음.

 

2. 인공신경망 문제

1) 어떤 인공 신경망의 입력 특성이 100개이고 Dense layer에 있는 neuron 수가 10개일 때 필요한 모델 파라메터의 수는?

: Dense layer에 있는 10개 neuron이 100개 input layer와 연결되므로 1000개의 weight가 발생함. 또한 neuron마다 1개의 절편이 있으므로, 1000 + 10개 = 1010개의 모델 파라메터가 필요함.

 

2) Keras의 dense 클래스를 사용해 신경망의 output layer를 만들려고 함. 이 신경망이 binary classification model이라면 activation 매개변수에 어떤 활성화 함수를 지정해야 하는가?

: sigmoid

Binary classification은 output layer의 neuron이 1개이고 linear equation의 결과를 확률 바꾸기 위해 sigmoid의 non-linear curver를 적용함.

 

3) Keras 모델에서 loss function과 측정 지표 등을 지정하는 메서드는?

: compile()

compile()메서드의 loss 매개변수로 loss function을, metrics 매개변수로 accuracy와 같은 측정 지표를 지정함.

 

4) 정수 레이블을 타켓으로 가지는 다중 분류 모델일 때, keras 모델의 compile() 메서드에 지정할 손실함수는?

: sparse_categorical_crossentropy

타겟값이 정수인 다중 분류는 compile()메서드의 loss 매개변수를 sparse_categorical_crossentropy로 지정함.

 

  • 인공신경망 실습

mnist fashion data를 load한 후, train_input, train_target, test_input, test_target이란 변수에 넣습니다.

train 및 test data의 shape는 28*28로 2차원 data 입니다. 

imshow()를 통해 image sample를 확인해 볼 수 있습니다.

Data Preparation

train_target의 label을 확인하되, unique한 숫자들 list도 뽑을 수 있습니다.

Data preparation 이후에는 Logistic Regression을 시도해 볼 수 있습니다.

cross_validate 라이브러리를 이용하여 데이터를 효율적으로 학습시키고, SGD분류기로 모델을 학습합니다.

Normalization과 scale을 마친 training data는 SGD분류기로 학습시킬 수 있으며, 그 결과의 평균값을 확인할 수 있습니다.

Practice Logistic Regression

 

이제 Artificial Intelligent(인공신경망)에 대한 내용입니다.

scale을 맞춘 train 및 validation data를 구분합니다.

dense layer를 정의 후, model.compile을 수행합니다. 손실함수는 정수 label을 갖고 있으므로 sparse_categorical_crossentropy를 적용하고, metric은 accuracy를 사용합니다.

model.fit을 통해 학습을 하고, evaluate로 validataion data를 평가합니다.

 

Practice Artifitial Neural Network

 

Artificial Neural Network(인공신경망)과 같이 Deep Neural Network(심층신경망)도 사용이 가능하며,

model.add()를 통해 layer들을 추가할 수 있습니다.

 

 

3. 심층 신경망 문제

1) add() 메서드를 사용하는 방법?

: model.add(keras.layers.Dense(10, activation='relu'))

 

2) 크기가 300*300인 입력을 케라스 층으로 펼칠 때 어떤 층을 사용하는가?

: Flatten

배치 차원을 제외한 입력의 차원을 일렬로 펼치기 위해 Flatten() 클래스를 사용함.

 

3) 이미지 분류를 위한 심층 신경망에 널리 사용되는 keras 활성화 함수는?

: relu

비례 곡선의 형태를 띄는 'relu'는 이미지 학습에 많이 사용되는 activation function 임.

참고로 binary classification에는 sigmoid가, RNN에는 tanh이 많이 사용됨.

 

4) 적응적 학습률을 사용하지 않는 optimizer는?

: SGD

SGD는 기본 경사하강법으로서 모멘텀, 네스테로프 모멘텀 알고리즘을 구현하는 클래스이며, 모두 일정한 학습률을 사용함.