* 지도학습시에는 항상 레이블이 존재해야함
## 모델 최적화 설정
## 모델 최적화 설정
import os
from keras.callbacks import ModelCheckpoint, EarlyStopping
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR) :
os.mkdir(MODEL_DIR)
modelpath = "./model/{epoch:02d}-{val_loss:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='var_loss', patience=10)
컨볼루션 신경망 (CNN)
입력된 이미지에서 다시한번 특징을 추출하기 위해 마스크를 도입하는 기법
위와같이 새롭게 만들어진 층을 컨볼루션이라고 부름
- 꼭 일차원을 사용함.
패딩 : 컨볼루션 결과의 크기를 조정하기 위해 입력 배열의 둘레를 확장하고 0으로 채우는 연산
스트라이드 : 커널을 다음 컨볼루션 연산을 위해 이동시키는 칸 수
패딩을 얼마주느냐에 따라 영상의 크기가 달라지고 안줬을때는 작아질 수 있음 -> 여러가지 케이스가 있음
영상일때
- 한장에서 세장으로 나뉘어지는거기때문에 결과도 한장으로 만들기위해 아래의 사진과 같은 y값을 만들어냄.
코드 분석
- 사용 단어 : 마스크, 필터, 윈도 또는 커널
- 앞에서는 Dense로 사용하였으나 여기선s Conv2D로 사용 (영상) - 컨볼루션 층 추가 함수
- Kernel_size : 마스크 사이즈
- input_shape=() : 입력 (행, 열, 색상또는흑백)
- 맨앞 32가 출력을 나타냄
- relu가 성능이 좋기때문에 많이 쓰임.
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
- 새로운 컨볼루션 층 추가 (64)
model.add(Conv2D(64, (3, 3), activation='relu'))
풀링 - 1) 최대값 풀링, 2) 평균값 풀링, 3) 확률값 풀링
1) 맥스풀링
- 특징을 두드러지게 표현할 수 있기 때문에 자주 쓰임.
- 많은 처리량을 줄여줌
- 도출된 특징을 가지고 차원을 축소시켜줌
- 옮겨가면서 masking 하는것이 아닌 만약 2x2라면 한번 추출한 구역은 다시 나누지않음
- 가장큰값을 추출 (보통 평균값을 추출한다고 생각하지만 여기서는 큰값이 가장 좋음)
- pool_size는 풀링 창의 크기를 정하는 것으로, 2로 저이하면 전체크기가 절반으로 줄어듦
model.add(MaxPooling2D(pool_size=2))
과적합을 조절하기위한 기능
* 드롭아웃
은닉층에 배치된 노드 중 일부를 임의로 꺼주는 것 (신경망에서는 안되고 딥러닝에서만 됨)
model.add(Dropout(0.25))
콘볼루션 층이나 맥스풀링은 이미지를 2차원 배열인 채로 다루기 떄문에
반드시 Flatten()을 해주어야함
model.add(Flatten())
대표적인 컨볼루션 신경망 모델
컨볼루션 신경망 실행하기
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.callbacks import ModelCheckpoint,EarlyStopping
import matplotlib.pyplot as plt
import numpy
import os
import tensorflow as tf
# seed
seed = 0
numpy.random.seed(seed)
tf.set_random_seed(seed)
# 데이터 불러오기
(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 = np_utils.to_categorical(Y_train)
Y_test = np_utils.to_categorical(Y_test)
# 컨볼루션 신경망 설정
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))
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'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# 모델 최적화 설정
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss',
verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# 모델의 실행
history = model.fit(X_train, Y_train, validation_data = (X_test, Y_test),
epochs=30, batch_size=200, verbose=0,
callbacks=[early_stopping_callback,checkpointer])
# 테스트 정확도 출력
print("\n Test Accuracy : %.4f" % (model.evaluate(X_test, Y_test)[1]))
# 테스트 셋의 오차
y_vloss = history.history['val_loss']
# 학습셋의 오차
y_loss = history.history['loss']
# 그래프로 표현
x_len = numpy.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()
* 실행 결과
- epochs 를 30으로 줬지만 별다른 변화가 없었기때문에 25까지 나옴 (patience는 10) 그러니까 15정도에서 최적의 결과를 얻었다고 볼 수 있음.
'딥러닝' 카테고리의 다른 글
0805 Tesorflow GPU 설정을 위한 환경 만들기 (0) | 2019.08.05 |
---|---|
0805 신경망의 구조 - 용어들의 의미 (0) | 2019.08.05 |
0802 keras 실습 [와인종류예측] - 베스트모델만들기 (0) | 2019.08.02 |
0802 keras 실습 [초음파 광물 예측] - 과적합 피하기 (0) | 2019.08.02 |
0802 keras 실습 [아이리스 분류문제] (0) | 2019.08.02 |