21.07.27
Deap Learning
@ CNN Model 설계
아이의 울음소리 data를 이용, CNN Model을 설계해본다.
% 2차원 데이터 변경
- CNN 모델을 설계하기 위해서 갖고 있는 데이터를 2차원 형태로 만든다.
- 그러기 위해서 numpy를 활용, array 형태로 변경
% 색상 차원 추가 및 인코딩
- 기본적으로 CNN 모델을 만들기 위해선 데이터의 차원이 (세로, 가로, 색상)의 값을 갖는 3차원 데이터여야 한다.
- 이미지, 소리 둘 다.
- 현재 나는 음성 data를 활용할 계획이다.
- expand_dims 라는 명령어는 내가 차원을 추가할 data와 추가할 방식(axis)의 값을 숫자로 입력한다.
- axis가 -1인 경우 : 마지막 축(axis) 추가
- axis가 0인 경우 : 행축(Row axis) 추가
- axis가 1인 경우 : 열축(Column axis) 추가
- 그리고 One-hot Encoding을 진행
- 현재 결과 값은 crying / laugh / silence 이렇게 3가지 종류로 아이의 울음 소리 data이다.
- 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()
- BatchNormalization : 파라미터 (w,b)가 너무 크게 변하거나 변하지 않는 문제를 방지
- 평균 0, 분산 1로 정규화를 함
- Dropout : 고의로 랜덤한 뉴런을 누락시킨 후 학습을 시킨다.
- 안의 매개변수는 dropout_rate은 누락할 랜덤한 뉴런의 비율로, Default 값은 0.5이다.
생성된 Model을 summary( ) 통해 확인해보면 아래와 같다.
% compile 및 학습
compile
cnn_model.compile(loss='categorical_crossentropy', # 모델의 예측값과 실제값의 차이확인
optimizer = 'adam', # loss를 토대로 잘못된 w,b를 수정해주는(최적화)
metrics=['accuracy'])
- 이진 분류가 아닌 다진분류이기 때문에 loss(손실함수)에는 binary_crossentropy 대신, categorical_crossentropy를 사용한다.
- optimizer(경사하강법의 종류)로는 adam을 사용한다.
- 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))
- epochs(학습 횟수)에 100회, batch_size(소그룹 갯수)는 32회로 주었다.
- batch_size : batch는 사전적 의미로 집단, 무리를 뜻한다. 여기서 batch_size란것은 데이터를 학습시키는데 집어 넣을 data의 갯수를 의미하며, 32를 준건 data를 한꺼번에 주는게 아닌 32개씩 넣으면서 학습을 진행하는 것
- validation_data(검증 데이터)는 학습과 동시에 test할 data를 집어 넣어서 해당 정확도를 표시해준다.
- 왜인지는 모르겠는데, validation_data 대신 validation_split을 넣으니까 과대적합이 굉장히 심하게 일어 났다.
- 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()
- matplotlib.pyplot Library를 통해 accuracy와 loss의 값을 plot 해보았다.
- 파란색과 주황색은 각각 train과 test 결과를 의미한다
반응형
'국비교육기관 > 수업' 카테고리의 다른 글
96일차 자소서 특강 (0) | 2021.07.22 |
---|---|
95일차 Spring - Jackson (0) | 2021.07.21 |
94일차 Deap Learning - OCR 설치 및 실습 (0) | 2021.07.20 |
93일차 Spring - MyBatis Insert, 한글 인코딩, (0) | 2021.07.19 |
92일차 Spring - JSTL(Core), MySQL (0) | 2021.07.17 |
댓글