컨볼루션 신경망(CNN)
- 입력된 이미지에서 다시 한 번 특징을 추출하기 위해 커널(슬라이딩 윈도)을 도입하는 기법
- 원래 있던 값 x 가중치 값 = 새로 추출된 값 ex. (1x1)+(0x0)+(0x0)+(1x1) = 2
- 커널을 한 칸씩 옮겨 모든 칸에 적용
- 새롭게 만들어진 층을 컨볼루션(합성곱)층이라고 함
- 입력 데이터가 가진 특징을 대략적으로 추출해서 학습 진행
- Con2D()
: 컨볼루션(합성곱) 층을 추가하는 함수
: keras에 존재
- 첫 번째 인자 : 커널을 몇 개 적용할지 결정
- kernel_size : 커널의 크기를 (행, 열) 형식으로 결정
- input_shape : 맨 커음 층에 입력되는 값을 (행, 열, 색상 또는 흑백) 형식으로 결정
- activation : 활성화 함수 정의
# 32개의 필터, 3x3 컨볼루션 층
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
# 64개의 필터, 3x3 컨볼루션 층
model.add(Conv2D(64, (3, 3), activation='relu'))
풀링(Pooling)
- 입력 데이터의 크기를 줄이고, 중요한 특징을 유지하며 계산량을 감소
- 일정한 영역 내에서 대표값을 추출하고, 그 값을 출력으로 사용
- 기법에는 맥스 풀링(max pooling), 평균 풀링(average pooling) 등이 존재. 주로 맥스 풀링 사용
- maxPooling2D()
: 맥스 풀링을 수행
: keras에 존재
- pool_size : 풀링 팡의 크기 결정
model.add(MaxPooling2D(pool_size=(2,2)))
드롭아웃(drop out)
- 은닉층에 배치된 노드 중 일부를 임의로 꺼 주는 것
- 특정 비율의 뉴런을 임의로 제거하고, 제거된 뉴런에 해당하는 가중치를 사용하지 않음으로써 과적합 방지
- Dropout()
: 드롭 아웃을 수행
: keras에 존재
- rate : 드롭 아웃을 실행하고 싶은 노드의 비율 결정
# 25%의 드롭아웃
model.add(Dropout(0.25))
# 50%의 드롭아웃
model.add(Dropout(0.5))
플래튼(flatten)
- 다차원의 입력을 1차원으로 평탄화(flatten)하는 역할
- 이미지를 2차원 배열인 채로 다루는 컨볼루션 계층과 풀링 계층 뒤에 추가하여 1차원 벡터 형태로 변환
- Flatten()
: 플래튼을 수행
: keras에 존재
model.add(Flatten())
컨볼루션 신경망(CNN) 예제 - MNIST 데이터
- MNIST 데이터 분석은 https://codingmoding.tistory.com/98 여기서 확인!
1. 환경 및 데이터 준비
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np
import os
# 데이터를 불러옴
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32') / 255
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
2. 컨볼루션 신경망(CNN) 모델 설정
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu')) # 컨볼루션 층
model.add(Conv2D(64, (3, 3), activation='relu')) # 컨볼루션 층
model.add(MaxPooling2D(pool_size=(2,2))) # 맥스 풀링 층
model.add(Dropout(0.25)) # 드롭아웃
model.add(Flatten()) # 플래튼
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5)) # 드롭아웃
model.add(Dense(10, activation='softmax'))
3. 모델 실행 환경 설정 및 최적화
# 모델의 실행 옵션 설정
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# 모델 최적화를 위한 설정 구간
MODEL_DIR = './data/model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath="./data/model/MNIST_CNN.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
4. 모델 실행
# 모델 실행
history = model.fit(X_train, y_train, validation_split=0.25, epochs=30, batch_size=200, verbose=0, callbacks=[early_stopping_callback,checkpointer])
# 테스트 정확도 출력
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
5. 데이터 시각화
# 검증셋과 학습셋의 오차 저장
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
# 그래프로 표현
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고
'AI > 모두의 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] 23. 텍스트 전처리 - 원-핫 인코딩(one-hot encoding), 단어 임베딩(word embedding), 긍정 부정 예측 (0) | 2023.06.03 |
---|---|
[모두의 딥러닝] 22. 텍스트 전처리 - 토큰화(tokenization), 빈도 수 세기 (0) | 2023.06.02 |
[모두의 딥러닝] 20. 이미지 인식, 데이터 전처리 - MNIST 데이터 (2) | 2023.05.29 |
[모두의 딥러닝] 19. 결측치 처리, 속성별 관련도 추출 - 부동산 가격 예측 데이터 (0) | 2023.05.29 |
[모두의 딥러닝] 18. 에포크(epochs), 과적합 그래프, 학습 자동 중단 - 와인 품질 예측 데이터 (0) | 2023.05.29 |