Recent Posts
Recent Comments
Link
Today
Total
11-03 22:30
관리 메뉴

Hippo's data

CNN(Convolutional Neural Network) 합성곱 신경망 구현 본문

DL(Deep Learning)

CNN(Convolutional Neural Network) 합성곱 신경망 구현

Hippo's data 2024. 1. 10. 14:54
728x90

오늘은 지난번 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)

https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53

 

모델링 진행하기 전 <이미지 데이터를 처리>해야 합니다

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

728x90