Hippo's data
CNN(Convolutional Neural Network) 합성곱 신경망 구현 본문
오늘은 지난번 DNN(Deep Neural Network) 심층 신경망에 이어 딥러닝 모델 중 하나인 CNN(Convolutional Neural Network) 합성곱 신경망을 구현해보도록 하겠습니다
특히 CNN은 이미지 처리에 강세를 보이는 모델인데요
### DNN은 2차원 형태 이미지를 1차원 형태 나열해서(flatten) 처리하므로 정보 소실을 발생하기 때문에 적합하지 않음
# CNN의 구조
두 영역으로 구분됨
1. 이미지 특징 추출(feature Learning) 영역 + 2. 클래스 분류(classification) 영역
1. 이미지 특징 추출(feature Learning) 영역
-> Convolution Layer + Pooling Layer
Convolution Layer -> Convolutional filter로 합성곱 연산을 통해 특징맵(Feature map) 만듦
Pooling Layer -> 축소본 만듦 ( 계산량, 메모리사용량, 파라미터 수 줄임) / MaxPooling, AveragePooling 등등 존재
2. 클래스 분류(classification) 영역
-> DNN 구조 동일 (Fully connected layer)
모델링 진행하기 전 <이미지 데이터를 처리>해야 합니다
from tensorflow.keras.preprocessing.image import ImageDataGenerator # 이미지 전처리 모듈
# Hyperparameter Tunning 하이퍼 파라미터 정의
num_epochs = 50
batch_size = 4
learning_rate = 0.001
input_shape = (384, 512, 3) # 사이즈 확인
num_classes = 2 # clean, dirty
# training, test 데이터셋 정의
training_datagen = ImageDataGenerator(
rescale=1. / 255,
validation_split=0.2
)
test_datagen = ImageDataGenerator(
rescale=1./255,
validation_split=0.2
)
# 이미지 데이터 읽고 배치 , 셔플, labeling
training_generator = training_datagen.flow_from_directory(
'이미지 데이터 경로',
batch_size=batch_size,
target_size=(384, 512), # 사이즈 확인
class_mode = 'categorical', # binary , categorical
shuffle = True,
subset = 'training' # training, validation. validation_split 사용하므로 subset 지정
)
test_generator = test_datagen.flow_from_directory(
'이미지 데이터 경로',
batch_size=batch_size,
target_size=(384, 512), # 사이즈 확인
class_mode = 'categorical', # binary , categorical
shuffle = True,
subset = 'validation' # training, validation. validation_split 사용하므로 subset 지정
)
<CNN 모델링>
1) 불러오기
2) 모델 생성
3) 모델 학습
1) 불러오기
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Dropout
from tensorflow.keras.layers import Conv2D, MaxPooling2D # 특징추출
2) 모델 생성
# 1. 이미지 특징 추출(feature Learning) 영역
model = Sequential() # 틀을 만듦
model.add(Conv2D(filters=32, kernel_size=3, activation='relu', input_shape= input_shape )) # convolution layer
# 필터사이즈(kernel_size) 3*3으로 32개 피쳐 맵(filters)만들기
model.add(MaxPooling2D(pool_size=2)) # Max Pooling 진행 / 이미지가 크므로 축소본 만듦 1/2배로 줄임(pool_size)
model.add(Conv2D(filters=16, kernel_size=3, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
# 2. 클래스 분류(classification) 영역 / 기존 DNN과 동일
model.add(Flatten()) # 1차원으로 쭉 핌
model.add(Dense(50, activation='relu'))
model.add(Dense(2, activation='softmax'))
# 모델 컴파일
model.compile(optimizer='adam',
loss='categorical_crossentropy', # categorical_crossentropy -> 다중 분류
metrics=['accuracy'])
3) 모델 학습
history = model.fit(training_generator,
epochs=20 ,
steps_per_epoch = len(training_generator) / batch_size,
validation_steps = len(test_generator) / batch_size,
validation_data=test_generator,
verbose=1
)
losses = pd.DataFrame(model.history.history) # 데이터 프레임 형식으로 지표 결과 보여주기
# 예측
pred = model.predict(img.reshape(-1,384, 512,3)) # input_shape = (384, 512, 3) 사이즈입력 후 예측
# 모델 구조 확인
model.summary()
Model: "sequential_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 382, 510, 32) 896
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 191, 255, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 189, 253, 16) 4624
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 94, 126, 16) 0
_________________________________________________________________
flatten (Flatten) (None, 189504) 0
_________________________________________________________________
dense_9 (Dense) (None, 50) 9475250
_________________________________________________________________
dense_10 (Dense) (None, 2) 102
=================================================================
Total params: 9,480,872
Trainable params: 9,480,872
Non-trainable params: 0
'DL(Deep Learning)' 카테고리의 다른 글
[딥러닝] Linear regression, Logistic regression (0) | 2024.04.20 |
---|---|
RNN(Recurrent Neural Network) 순환 신경망 구현 (0) | 2024.01.10 |
DNN(Deep Neural Network) 심층 신경망 구현 (2) | 2024.01.09 |