CNN(시각 지능 딥러닝)-(1)

Gyeunggeun Lee·2023년 3월 25일
0

CNN

목록 보기
1/3

✅ Deep Learning Basics: CNN

📰 이것 저것

Key Ideas of CNN
Input Image
Convolution
Non-linearity
Spatial pooling
Feature maps

📰 CNN Basics

Convolution Layer
Convolution Layer에서는 필터를 사용하여 이미지의 지역적 특징을 추출합니다.

예시:

32x32x3 image
5x5x3 filter
결과: 28x28x6 feature maps
여기서 6은 사용한 필터의 개수로, 새로 만들어진 feature maps의 수를 의미합니다.

Stride
필터가 이동할 보폭의 크기를 결정합니다.

Output Size 결정
출력 크기는 이미지 크기, 필터 크기, 스트라이드, 패딩에 따라 결정됩니다.

Padding 사용 이유
외곽 정보 반영
피처 맵 사이즈 유지
Pooling Layer
Pooling Layer는 연산량을 줄이기 위해 사용합니다. 이를 통해 서브 샘플링 또는 다운 샘플링이 수행됩니다. Max pooling과 average pooling이 널리 사용되며, 각각 필터 영역에서 최댓값 또는 평균값을 가져옵니다.

📰 Pooling

풀링(Pooling)은 컨볼루션 신경망(Convolutional Neural Networks, CNN)에서 사용되는 다운샘플링 기법 중 하나입니다. 풀링은 이미지의 공간 크기를 줄이는 동시에 중요한 특징을 유지하기 위해 사용됩니다. 이를 통해 연산량을 줄이고, 과적합(overfitting)을 방지하는 데 도움이 됩니다. 주요한 풀링 방법으로는 평균 풀링(Average Pooling)최대 풀링(Max Pooling)이 있습니다.

평균 풀링(Average Pooling)
평균 풀링은 입력 행렬에서 정해진 크기의 영역을 슬라이딩하면서 해당 영역의 값들의 평균을 계산하여 출력 행렬에 저장합니다. 이를 통해 이미지의 크기를 줄이고, 영역의 대표값을 구합니다.

최대 풀링(Max Pooling)
최대 풀링은 입력 행렬에서 정해진 크기의 영역을 슬라이딩하면서 해당 영역의 값 중 최댓값을 선택하여 출력 행렬에 저장합니다. 최대 풀링은 영역 내에서 가장 강한 특징을 추출하므로, 이미지의 중요한 정보를 보다 잘 보존할 수 있습니다.

둘의 차이점은 다음과 같다.

평균 풀링은 영역의 평균값을 사용하는 반면, 최대 풀링은 영역의 최댓값을 사용합니다.
평균 풀링은 영역의 전체 정보를 고려하므로 부드러운 특징을 추출하는 데 더 적합하지만, 최대 풀링은 가장 강한 특징만을 추출하여 더 뚜렷한 정보를 보존합니다.
최대 풀링이 일반적으로 더 널리 사용되며, 평균 풀링보다 더 높은 성능을 보이는 경향이 있습니다.

예시 코드

import tensorflow as tf
from tensorflow.keras.layers import AveragePooling2D, MaxPooling2D, Input
from tensorflow.keras.models import Model
input_layer = Input(shape=(32, 32, 3))
# 평균 풀링
average_pooling = AveragePooling2D(pool_size=(2, 2))(input_layer)
# 최대 풀링
max_pooling = MaxPooling2D(pool_size=(2, 2))(input_layer)
# 모델 생성
average_pooling_model = Model(inputs=input_layer, outputs=average_pooling)
max_pooling_model = Model(inputs=input_layer, outputs=max_pooling)

위 코드는 입력 이미지의 크기를 (32, 32, 3)으로 가정하고, 평균 풀링과 최대 풀링을 각각 적용한 두 개의 모델을 생성합니다. 이렇게 생성된 모델을 사용하여 평균 풀링과 최대 풀링을 실제 이미지에 적용해볼 수 있습니다.

📰 CNN (Convolutional neural network) 개념 이해

CNN (Convolutional neural network) 컨셉

일반적인 이미지 인식은 픽셀 단위로 분석하여 처리하나, 이 방법은 같은 객체가 다른 위치에 있을 때 인식이 어려울 수 있다.
CNN은 이미지에서 지역적인 특징을 잘 파악하기 위해 여러 개의 필터를 사용하여 학습한다.

딥러닝 코드 구조 - CNN

input_shape: 이미지의 크기와 채널(흑백:1, 칼라:3)을 지정한다.
Conv2D 레이어: 지역적인 특징을 가지고 여러 개의 필터를 생성하고 학습한다.
MaxPooling 레이어: 뽑은 특징에 대한 결과 데이터를 요약하고 압축한다.
Flatten: 학습된 특징을 Dense 레이어에 연결하기 위해 1차원으로 변환한다.

CNN 코드 예시

clear_session()
model = Sequential([ Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), padding='same', activation = 'relu'), # strides = 1 기본값
                     MaxPooling2D(pool_size=(2, 2), strides=2), # strides = pool_size 기본값
                     Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu'),
                     MaxPooling2D(pool_size=(2, 2), strides=2),
                     Flatten(),
                     Dense(128, activation='relu'),
                     Dense(10, activation='softmax' )
])
model.summary()
model.compile(optimizer=Adam(learning_rate=0.001), loss='sparse_categorical_crossentropy')
history = model.fit(x_train, y_train, epochs = 10,
                    validation_split=0.2).history
dl_history_plot(history)
pred = model.predict(x_val)
pred_1 = pred.argmax(axis=1)
print(accuracy_score(y_val,pred_1))
print('-'*60)
print(confusion_matrix(y_val, pred_1))
print('-'*60)
print(classification_report(y_val, pred_1))

기타

💡 3차원 데이터 모델링 시 2차원으로 만들어서 모델링 수행

x_train.shape, y_train.shape, x_val.shape, y_val.shape
# 2차원 데이터를 1차원으로 펼치자
x_train = x_train.reshape(60000, -1)
x_val = x_val.reshape(10000, -1)

💡 범용적으로 저장하는 방법
‘피클링’한다. = 저장한다.

joblib.dump.load
.pkl

📰 CNN 구조 예시: AlexNet

AlexNet은 2012년 ImageNet 대회에서 우승한 Convolutional Neural Network (CNN) 모델입니다. 이 모델은 5개의 Convolutional Layer와 3개의 Fully Connected Layer로 구성되어 있으며, 아래와 같이 Keras를 사용하여 구현할 수 있습니다.

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
# AlexNet 모델 정의
def create_alexnet(input_shape, num_classes):
    model = Sequential()
    # 첫 번째 Convolutional Layer
    model.add(Conv2D(96, kernel_size=(11, 11), strides=(4, 4), padding='valid', activation='relu', input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid'))
    # 두 번째 Convolutional Layer
    model.add(Conv2D(256, kernel_size=(5, 5), strides=(1, 1), padding='same', activation='relu'))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid'))
    # 세 번째 Convolutional Layer
    model.add(Conv2D(384, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'))
    # 네 번째 Convolutional Layer
    model.add(Conv2D(384, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'))
    # 다섯 번째 Convolutional Layer
    model.add(Conv2D(256, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid'))
    # Fully Connected Layer
    model.add(Flatten())
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    # 두 번째 Fully Connected Layer
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    # 세 번째 Fully Connected Layer
    model.add(Dense(num_classes, activation='softmax'))
	return model
	# AlexNet 모델 생성
	input_shape = (227, 227, 3)
	num_classes = 1000
	model = create_alexnet(input_shape, num_classes)
	model.summary()

위 코드는 AlexNet의 구조를 정의하고 생성하는 과정을 보여줍니다. 이 모델은 원본 논문에 따라 5개의 Convolutional Layer와 3개의 Fully Connected Layer를 사용하며, 각 레이어에서 사용되는 활성화 함수, 커널 크기, 스트라이드, 패딩 등의 설정을 따릅니다.

이제 이 모델을 사용하여 이미지 분류 작업을 수행할 수 있습니다. 이를 위해 데이터셋을 불러오고, 전처리한 후 모델을 훈련하고 평가할 수 있습니다. 이 과정은 Keras의 ImageDataGenerator를 사용하여 데이터셋 전처리 및 데이터 증강을 수행하고, 모델을 훈련하고 평가하는 과정을 설명하겠습니다.

from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
# 데이터셋 경로 설정
train_dir = 'path/to/train/dataset'
val_dir = 'path/to/validation/dataset'
# 데이터 증강을 위한 ImageDataGenerator 생성
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)
val_datagen = ImageDataGenerator(rescale=1./255)
# 이미지 크기와 배치 크기 설정
image_size = (227, 227)
batch_size = 32
# 학습 및 검증 데이터 생성
train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='categorical'
)
val_generator = val_datagen.flow_from_directory(
    val_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='categorical'
)
# 모델 컴파일
model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
# 모델 훈련
num_epochs = 50
history = model.fit(
    train_generator,
    steps_per_epoch=len(train_generator),
    epochs=num_epochs,
    validation_data=val_generator,
    validation_steps=len(val_generator)
)
# 모델 평가
score = model.evaluate(val_generator)
print("Validation loss:", score[0])
print("Validation accuracy:", score[1])

위 코드는 Keras의 ImageDataGenerator를 사용하여 이미지 데이터를 전처리하고 데이터 증강을 수행한 후, 정의된 AlexNet 모델을 훈련하고 평가하는 과정을 보여줍니다. 이를 통해 이미지 분류 작업을 수행할 수 있습니다.

profile
데이터 분석가, 데이터 사이언티스트 공부중인 이경근입니다

0개의 댓글