본문 바로가기
멋쟁이사자처럼 AIS7/오늘코드

[1206]합성곱 신경망 (Convolutional Neural Network, CNN) 실습

by YeonGun M 2022. 12. 6.

가비지 인 가비지 아웃

  • 모든 사진 이미지가 학습에 도움이 되진 않는다.
  • 이미지가 크기도 다 다르다.
    => 이미지 사이즈를 맞춰줄 필요가 있다.

데이터 증강

  • 훈련 예제가 적으면 모델의 노이즈나 원치 않는 부분까지 지나치게 학습하여 과대적합 문제가 발생한다.
    => 이를 방지하는 방법은 데이터 증강과 드랍아웃이 대표적이다.

 

  • 데이터 증강: 접돌땡(접고 돌리고 땡기고)
    tf.keras.layers.RandomFlip, tf.keras.layers.RandomRotation, tf.keras.layers.RandomZoom
  • 포토샵에서 이미자 사이즈를 조정하듯, PIL, OpenCV 등을 이용해 사이즈 조정
  • 계산편의를 위해 보통 정사각형 형태로 만들어줌
  • 이미지 사이즈가 작을 때는 이미지가 왜곡되거나 손실될 수도 있지만 계산량이 줄어들기 때문에 빠르게 학습한다.
  • 이미지 사이즈가 클 때는 마찬가지로 작은 이미지를 늘리면 왜곡될 수도 있지만 더 자세히 학습하기 때문에 성능이 좋을 수 있다. 다만, 계산이 오래 걸린다.
  • 권장 이미지 사이즈는 따로 없다
    • 딥러닝의 경우 Network 모델의 입력 사이즈와 반드시 동일해야 함을 주의
    • CNN의 대표적인 모델들은 네트워크 입력사이즈가 224 * 224인 경우가 많다.

 

이미지 로드

  1. matplotlib
  2. my_img_path = 'myimg.jpg' myimg = plt.imread(my_img_path) plt.imshow(myimg)
  3. PIL
  4. from PIL import Image, ImageFilter original = Image.open(cell_img) original
  5. OpenCV
  • 인텔이 개발하여 공개한 실시간 컴퓨터 비전을 목적으로 한 오픈소스 라이브러리
  • 실시간 이미지 프로세싱에 중점을 둔 라이브러리
  • import cv2 img = cv2.imread(img_path, cv2.IMREAD_COLOR) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img.shape

 

ImageDataGenerator

데이터셋 분할

# validation_split 값을 통해 학습:검증 비율을 8:2 로 나눕니다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rescale=1/255.0, validation_split=0.2)
# 학습세트
trainDatagen = datagen.flow_from_directory(directory = 'cell_images/',
                                           target_size = (height, width),
                                           class_mode = 'binary',
                                           batch_size = 64,
                                           subset='training')
# 검증세트
valDatagen = datagen.flow_from_directory(directory = 'cell_images/',
                                         target_size =(height, width),
                                         class_mode = 'binary',
                                         batch_size = 64,
                                         subset='validation')

 

이미지 변환 지원 기능

  • 공간 레벨 변형
    • Flip : 상하, 좌우 반전
    • Rotation : 회전
    • Shift : 이동
    • Zoom : 확대, 축소
    • Shear : 눕히기
  • 픽셀 레벨 변형
    • Bright : 밝기 조정
    • Channel Shift : RGB 값 변경
    • ZCA Whitening : Whitening 효과

 

🍯 성민 멘토님 꿀팁

 

Padding
conv2d 층의 padding 매개변수의 기본값은 "vaild"로 커널이 인풋 이미지 밖으로 슬라이딩 하지 않습니다. 이런 경우 출력은 입력보다 작아집니다.
padding 매개변수를 "same"으로 해줄 경우 출력 크기가 입력값과 동일해지도록 입력 이미지 주위에 0 픽셀이 패딩됩니다!

 

활성화 함수
비선형 활성화 함수가 없이 여러 개의 층을 쌓을 경우 기본 선형 활성화 함수를 사용하게 되므로 하나의 층을 가진 선형 모델과 성능이 비슷합니다.
은닉층에 비선형 활성화 함수를 추가하지 않으면 계산 자원과 시간을 낭비하는 결과를 초래하고 수치적으로 불안정성이 높아지게 됩니다.
이런 현상은 밀집 층 뿐만 아니라 아까 말한 합성곱 층과 같이 다른 종류의 층에도 적용되게 됩니다.
( 예를 들어 "비선형 활성화 함수 없이" 두 개의 합성곱 층을 쌓는 경우 그냥 많은 커널을 가진 하나의 conv2d 층을 사용하는 것과 수학적으로 동일하기 때문에 비효율 적으로 합성곱 신경망을 만드는 것과 같습니다! )

 

입력 데이터와 네트워크 구조
벡터 데이터(시간이나 순서가 상관 없음): MLP (밀집층)

이미지 데이터(흑백 또는 컬러): 2D 합성곱 신경망

스펙트로그램 오디오 데이터: 2D 합성곱 신경망이나 순환 신경망

텍스트 데이터: 1D 합성곱 신경망이나 순환 신경망

시계열 데이터(시간이나 순서가 중요함): 1D 합성곱 신경망이나 순환 신경망

볼륨 데이터(예: 3D 의료 이미지): 3D 합성곱 신경망

비디오 데이터(이미지의 시퀀스): 3D 합성곱 신경망(모션 효과를 감지해야 하는 경우) 또는 특성 추출을 위해 프레임 별로 적용한 2D 합성곱 신경망과 만들어진 특성 시퀀스를 처리하기 위한 RNN이나 1D 합성곱 신경망의 조합

 

합성곱 신경망
합성곱 층은 입력받은 텐서에서 공간적으로 다른 위치에 기하학적 변환을 적용하여 국부적인 공간 패턴을 찾습니다.
이런 방식은 이동 불변성을 가진 표현을 만들기 때문에 합성곱 층을 매우 데이터 효율적으로 만들고 모듈화 시킵니다.

위와 같은 아이디어는 어떤 차원 공간에도 적용할 수 있기 때문에 1D(시퀀스), 2D(이미지나 이미지가 아니자만 사운드 스펙트로그램처럼 비슷한 표현), 3D(볼륨 데이터) 등입니다.

텐서플로우에서는 conv1d 층으로 시퀀스를 처리하고, conv2d층으로 이미지를 처리하고, conv3d 층으로 볼륨 데이터를 처리할 수 있습니다.

합성곱 신경망은 합성곱 층과 풀링 층을 쌓아서 구성하게 됩니다. 풀링 층은 공간적으로 데이터를 다운샘플링하고 이는 특성 개수가 늘어나게되면 후속 층이 합성곱 신경망의 입력 이미지에서 더 많은 공간을 바라보도록 특성 맵의 크기를 적절하게 유지시킵니다.

합성곱 신경망은 공간적인 특성 맵을 벡터로 바꾸기 위해 종종 flatten 층과 전역 풀링 층으로 끝납니다. 그리고 일련의 밀집층(MLP)로 처리하여 분류나 회귀 출력을 만들게 됩니다.

댓글