DL [09] CNN

totwo·2024년 9월 9일
post-thumbnail

CNN(Convolutional Neural Network)

  • convolution layer : 특징찾기 (이미지의 주요한 특징 추출)
  • pooling layer : 특징이 아닌 영역 삭제
  • Dense층 전에 두 층을 추가적으로 진행하고 Dense층에서 분석을 한다



패딩을 통해
가장자리 데이터는 특징추출데이터가 적은 것을 보완하여 가장자리 부분을 0으로 채워넣음
층이 깊어지면서 이미지의 크기가 줄어드는 걸 방지


# 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()


# 손글씨데이터 -> 흑백 -> 색상채널 1개
# 0-255 값 -> 0: 검은색, 255: 흰색 -> 분산이 너무 큼
# 0-1 값으로 스케일링 (범위를 0~1사이로 변경) -> 분산을 줄여주기 -> 정확도 향상
X_train = X_train.reshape(1000,28,28,1).astype('float32')/255
X_test = X_test.reshape(300,28,28,1).astype('float32')/255

CNN 모델링


from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
# Conv2D : 이미지에서 특성을 추출하는 기능
# MaxPooling2D : 이미지의 특징이 아닌 부분을 삭제
# Flatten : 다차원의 데이터를 1차원으로 변경
# Dense : 특성추출된 최종 데이터를 분석 (결과 학습, 예측)

model = Sequential()
# 특성추출부
model.add(Conv2D(kernel_size = (3,3), # 특징의 크기(필터, 커널) -> 일반적으로 (3,3),(5,5)
                 filters = 32, # 찾을 특징의 개수
                 input_shape = (28,28,1), # 입력크기 : 첫번째 컨볼루션 층에서만 작성
                 # (가로픽셀, 세로픽셀, 채널수)
                 padding = 'same', # 입력과 출력의 이미지크기를 동일하게 맞춰준다
                 activation = "relu"
                ))
model.add(Conv2D(kernel_size = (3,3),
                 filters = 64,
                 padding = 'same',
                 activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2,2))) # 특징이 아닌 부분을 삭제
# 일반적으로 Conv2D 2-3개를 쓰고 Pooling 층을 쓰는 경우가 많다

model.add(Flatten())
# 분석층(분류기)
# 위에서 특징추출을 진행했기 때문에 분석층을 깊게 쌓지 않아도 됨
model.add(Dense(units=128, activation='relu'))
# 출력
model.add(Dense(units=10, activation='softmax'))
# 모델 학습방법 및 예측방법 설정
model.compile(loss="sparse_categorical_crossentropy",
              optimizer="adam",
              metrics=['accuracy'])
# callback 함수 사용하기
# 모델저장, 모델 조기학습 중단 객체생성 -> val_accuracy
# 모델 학습
# 반복횟수 1000, 검증데이터 20%, batch_size = 50, 콜백함수 객체 사용
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
model_path = "/content/drive/MyDrive/Colab Notebooks/24.08.29 DeepLearning/cnn_model/model_{epoch:02d}-{val_accuracy:0.3f}.hdf5.keras"
mcp = ModelCheckpoint(filepath = model_path,
                      verbose = 1,
                      save_best_only = True,
                      monitor = 'val_accuracy')
es = EarlyStopping(monitor = 'val_accuracy', # 학습을 중단할 기준 설정
                      verbose=1, # 로그 출력
                      patience=15)
h1 = model.fit(X_train, y_train, validation_split=0.2, 
				batch_size=50, epochs=1000, callbacks = [mcp, es])

plt.figure(figsize=(5,5))
plt.plot(range(1,25), h1.history['accuracy'], label='train', color='lightgreen')
plt.plot(range(1,25), h1.history['val_accuracy'], label='test', color='lightpink')
plt.title('accuracy')
plt.legend() # 범례표시
plt.show()

plt.figure(figsize=(5,5))
plt.plot(range(1,25), h1.history['loss'], label='train', color='lightgreen')
plt.plot(range(1,25), h1.history['val_loss'], label='test', color='lightpink')
plt.title('loss')
plt.legend() # 범례표시
plt.show()

profile
Hello, World!

0개의 댓글