가위, 바위, 보 이미지 학습 모델 복습

Gongsam·2023년 10월 15일
0

딥러닝

목록 보기
1/4

코드 참고

이미지 학습용 데이터 생성

이미지를 데이터로 사용하기 위해선 이미지를 벡터로 변환하는 과정이 필요하다.

def load_data(img_path, number_of_data=1500):  
	# 가위바위보 이미지 개수 총합에 유의
    # 가위 : 0, 바위 : 1, 보 : 2
    img_size=28
    color=3
    #이미지 데이터와 라벨(가위 : 0, 바위 : 1, 보 : 2) 데이터를 담을 행렬(matrix) 영역을 생성
    imgs = np.zeros(number_of_data*img_size*img_size*color,dtype=np.int32).reshape(number_of_data,img_size,img_size,color)
    labels=np.zeros(number_of_data,dtype=np.int32)

사용된 함수

np.zeros

  • 0으로만 채워진 array 생성
  • 여기선 이미지 수, 이미지 크기, 라벨을 저장하기 위해 생성

np.reshape

  • 데이터 구조를 바꿔주어야할 때 활용
  • 여기선 4차원으로 바꿔준다. => (28,28,3) (28개의 28(행) X 3(열)) 형태의 row 벡터 행렬을 1500개 가지고 있다?

모델 생성

가위, 바위, 보를 구분하는 문제이기 때문에 출력 벡터는 3개여야 함.

import tensorflow as tf
from tensorflow import keras
import numpy as np

n_channel_1=32
n_channel_2=32
n_dense=32
n_train_epoch=20

model=keras.models.Sequential()
model.add(keras.layers.Conv2D(n_channel_1, (3,3), activation='relu', input_shape=(28,28,3)))
model.add(keras.layers.MaxPool2D(2,2))
model.add(keras.layers.Conv2D(n_channel_2, (3,3), activation='relu'))
model.add(keras.layers.MaxPooling2D((2,2)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(n_dense, activation='relu'))
model.add(keras.layers.Dense(3, activation='softmax'))

keras

  • 파이썬으로 작성된 고수준 신경망 API
  • TensorFlow, CNTK, Theano와 함께 활용 가능

Sequential()

  • 레이어를 선형으로 연결하여 구성
  • 레이어의 인스턴스를 생성자에게 넘겨 구성하거나 add() 메소드로 추가

keras.layer.Conv2D(n_channel_1, (3,3), activation='relu', input_shape=(28,28,3)))

  • Convolution 신경망 모델의 일종
  • 필터로 특징을 뽑아주는 레이어, 주로 영상 처리에 활용
  • n_channel_1: 컨볼루션 필터의 수
  • (3, 3): 컨볼루션 커널의 (행, 열)
  • activation: 활성화 함수 설정
    • relu: 은닉층에 주로 활용
  • input_shape: 입력의 형태 정의. 샘플 수를 제외하며, 모델에서 첫 레이어일 때만 정함
    • (행, 열, 채널 수)로 정의

참고 (이미지 출처)

x0, x1, x2 부분: 입력된 이미지 (채널 수 1, 너비가 3, 높이가 3인 픽셀
w0, w1: 필터 = 가중치 부분. 2 * 2 인 커널

Conv2D(1, (2, 2), input_shape = (3, 3, 1))

model.add(keras.layers.MaxPool2D(2,2))

  • 컨볼루션 레이어의 출력 이미지에서 주요값만을 선택
  • 사소한 변화를 무시하는 효과
  • (2, 2): 축소 비율 지정 (수직, 수평)

    이미지 출처
    • ex) (2, 2)의 크기로 구역을 나눈 뒤 구역 안에서 가장 큰 값만 조합하여 (2, 2)의 결과값을 뽑음

model.add(keras.layers.Flatten())

  • 2차원으로 처리된 데이터를 1차원으로 바꿔줌
  • 전결합층(입력 뉴런과 출력 뉴런을 모두 연결하는 층)에 전달하기 위해 1차원으로 변형

keras.layers.Dense(n_dense, activation='relu')

  • 입출력을 연결해주는 레이어
  • 입력 뉴런이 4개, 출력 뉴런이 8개일 대 총 연결선은 32개, 가중치(연결 강도)도 32개
  • n_dense: 출력 뉴런의 수

모델 학습 시키기

model.compile(optimizer='adam',
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])
  • optimizer adam: SGD에서 스텝방향과 스텝 사이즈를 모두 개선한 방법. 스텝 계산해서 움직이고 관성 방향을 따라감(Momentum) + 맥락을 고려하며 보폭 줄임 (RMSProp)
  • loss (function): sparse_categorical_crossentropy -> 다중 클래스 분류를 위해 사용되는 손실 함수
    • categorical_crossentropy: 훈련 데이터의 라벨(y, target) 값이 원-핫 벡터인 경우 사용
    • sparse_categorical_crossentropy: 훈련 데이터의 라벨(y, target)값이 정수인 경우 사용

출처 및 참고자료

profile
🐬 파이썬 / 인공지능 / 머신러닝

0개의 댓글