본문 바로가기
국비교육기관/수업

100일차 Deap Learning - CNN Model 설계, Dropout, BatchNormalization

by 밀키스 2021. 7. 27.

21.07.27

 

 Deap Learning 

 

 

@ CNN Model 설계 

 

아이의 울음소리 data를 이용, CNN Model을 설계해본다.

% 2차원 데이터 변경 

  1. CNN 모델을 설계하기 위해서 갖고 있는 데이터를 2차원 형태로 만든다.
  2. 그러기 위해서 numpy를 활용, array 형태로 변경

 

 

 


% 색상 차원 추가 및 인코딩 

  1. 기본적으로 CNN 모델을 만들기 위해선 데이터의 차원이 (세로, 가로, 색상)의 값을 갖는 3차원 데이터여야 한다.
    1. 이미지, 소리 둘 다.
    2. 현재 나는 음성 data를 활용할 계획이다.
  2. expand_dims 라는 명령어는 내가 차원을 추가할 data와 추가할 방식(axis)의 값을 숫자로 입력한다.
    1. axis가 -1인 경우 : 마지막 축(axis) 추가
    2. axis가 0인 경우 : 행축(Row axis) 추가
    3. axis가 1인 경우 : 열축(Column axis) 추가

 

 

  1. 그리고 One-hot Encoding을 진행
  2. 현재 결과 값은 crying / laugh / silence 이렇게 3가지 종류로 아이의 울음 소리 data이다.
  3. Pandas Library의 get_dummies 명령어를 이용, 인코딩을 진행한다.

 

 

 


% CNN Model 설계 

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Dropout, BatchNormalization

cnn_model = Sequential()

# feature sxtracor
# CNN Model 설계 위함
cnn_model.add(Conv2D(input_shape=(20, 40,1),
                    filters=64,
                    kernel_size=(3,3),
                    activation='relu'))   # conv 연산 후 크기가 줄어들지 X
cnn_model.add(MaxPooling2D(pool_size=(2,2)))

cnn_model.add(Conv2D(filters=128,
                    kernel_size=(3,3),
                    activation='relu'))   # conv 연산 후 크기가 줄어들지 X
cnn_model.add(MaxPooling2D(pool_size=(2,2)))

# classifier
# 일반적 Model 설계 하는 방법과 동일하게 조건을 추가해준다.
cnn_model.add(Flatten()) # 데이터를 1차원으로 펼쳐주는 역할
cnn_model.add(Dense(units=512, activation='relu'))
cnn_model.add(Dropout(0.2))

cnn_model.add(Dense(units=256, activation='relu'))
cnn_model.add(BatchNormalization())
cnn_model.add(Dropout(0.2))

cnn_model.add(Dense(units=128, activation='relu'))
cnn_model.add(BatchNormalization())
cnn_model.add(Dropout(0.2))

cnn_model.add(Dense(units=64, activation='relu'))
cnn_model.add(BatchNormalization())
cnn_model.add(Dropout(0.2))
cnn_model.add(Dense(units=3, activation='softmax'))
cnn_model.summary()

 

  1.  BatchNormalization  : 파라미터 (w,b)가 너무 크게 변하거나 변하지 않는 문제를 방지
    • 평균 0, 분산 1로 정규화를 함
  2.  Dropout  : 고의로 랜덤한 뉴런을 누락시킨 후 학습을 시킨다.
    • 안의 매개변수는 dropout_rate은 누락할 랜덤한 뉴런의 비율로, Default 값은 0.5이다.

 

생성된 Model을 summary( ) 통해 확인해보면 아래와 같다.

 

 


% compile 및 학습 

 compile 

cnn_model.compile(loss='categorical_crossentropy',  # 모델의 예측값과 실제값의 차이확인
              optimizer = 'adam',  # loss를 토대로 잘못된 w,b를 수정해주는(최적화)
              metrics=['accuracy'])
  1. 이진 분류가 아닌 다진분류이기 때문에 loss(손실함수)에는 binary_crossentropy 대신, categorical_crossentropy를 사용한다.
  2. optimizer(경사하강법의 종류)로는 adam을 사용한다.
  3. metrics(평가방법)엔 accuracy를 사용

 

 

 fit 

h2 = cnn_model.fit(X_train_ex, y_train_en, epochs=100, batch_size=32,
               validation_data=(X_test_ex,y_test_en))
  1. epochs(학습 횟수)에 100회, batch_size(소그룹 갯수)는 32회로 주었다.
    • batch_size : batch는 사전적 의미로 집단, 무리를 뜻한다. 여기서 batch_size란것은 데이터를 학습시키는데 집어 넣을 data의 갯수를 의미하며, 32를 준건 data를 한꺼번에 주는게 아닌 32개씩 넣으면서 학습을 진행하는 것
  2. validation_data(검증 데이터)는 학습과 동시에 test할 data를 집어 넣어서 해당 정확도를 표시해준다.
    1. 왜인지는 모르겠는데, validation_data 대신 validation_split을 넣으니까 과대적합이 굉장히 심하게 일어 났다.
    2. validation_split은 train data 안에서 학습하면서 test할 data의 비율을 정해 일정 부분만 떼어내 학습하는 것을 말한다.

 

 

 


% 학습된 Model Plot 해보기 

import matplotlib.pyplot as plt
# accuracy plot
plt.plot(h2.history['accuracy'], label="train_acc")
plt.plot(h2.history['val_accuracy'], label="test_acc")
plt.legend()

# loss plot
plt.plot(h2.history['loss'], label="train_loss")
plt.plot(h2.history['val_loss'], label="test_loss")
plt.legend()

  1. matplotlib.pyplot Library를 통해 accuracy와 loss의 값을 plot 해보았다.
  2. 파란색과 주황색은 각각 train과 test 결과를 의미한다

 

반응형

댓글