강의자료/머신러닝

[머신러닝활용] 컴퓨터 비전

파아란 기쁨 2023. 3. 20. 12:07

1. 컴퓨터 비전이란?

컴퓨터가 이미지 픽셀을 해석하는 구조화된 알고리즘을 컴퓨터 비전이라 한다.

2. 비전을 위한 뉴런 사용하기

가장 기본적인 형태의 y=2x-1 과 같은 형태를 학습하는 딥러닝이라면 다음과 같은 구조를 가지고 있다.

한개의 층과 한개의 뉴런으로 구성된 간단한 신경망을 사용해서 훈련을 통해 m,c 를 2와 1 값을 찾아낼 수 있다.

가장 기본적인 위와 같은 형태의 신경망은 Sequential 을 사용한다.

Sequential은 기본적으로 Dense를 가지고 있다.

위와 같은 모델은 다음과 같이 만들 수 있다.

model = Sequential([Dense(units=1,input_shape=[1])])

Dense는 뉴런이 완전히 연결되어 있다는 것을 의미한다.

units=1 은 1개의 뉴런을 가진다는 의미이며 input_shape=[1]의 의미는 1차원데이터 즉 1개의 x데이터가 입력 된다는 것을 의미한다.

위와 같이 2개의 뉴런을 가지고 하나의 출력을 한다면 모델은 다음과 같이 만들 수 있다.

model = Sequential([Dense(units=2),Dense(units=1)])

Sequential 안에 쉼표를 기준으로 레이어를 나열하여 쉽게 정의 할 수 있다.

 

3. 의류 아이템 인식하기

패션MNIST 데이터셋은 0~9까지의 숫자 대신 10개의 의류 아이템 이미지를 가지고 있다.

의류아이템에는 다양한 셔츠,바지,드레스,여러가지의 종류의 신발이 있다.

그림에서 보듯이 흑백이미지로 각 사진은 0~255사이의 픽셀로 구성되어 있으며 사이즈의 크기는 28*28 크기의 사이즈로 되어 있다.

패션MNIST는 위와 같이 28*28(784) 개의 X값의 입력이 들어 왔는데 여기서 Y의 값이 Y=mX+c 와 같은 형태로 매핑할 수 없다.

여기서 여러개의 뉴런을 사용하여 각 뉴런은 각각의 파라미터를 학습하고 이런 파라미터가 함께 동작하는 함수가 있을 때 해당 패턴을 정답에 매핑한다.

위의 그림에서와 같이 각 뉴런은 가중치(m)과 절편(c)를 각각 갖게된다.

이러한 각각의 뉴런의 합을 이용하여 출력값이 0~9 사이의 이미지 값과 매칭되는 가중치의 절편을 찾게 된다.

 

4. 신경망 설계

1. 데이터 로딩 및 전처리

import tensorflow as tf

data = tf.keras.datasets.mnist
(training_images, training_labels), (val_images, val_labels) = data.load_data()

training_images  = training_images / 255.0
val_images = val_images / 255.0

0~255 사이의 값을 255로 나누어서 0~1 사이의 값으로 만들어 주는데 이 작업을 정규화라고 부른다.

정규화는 오류가 너무 커져서 학습이 되지 않는 문제를 예방하는데 도움이 된다.

2. 모델 구조

model = tf.keras.models.Sequential(
[tf.keras.layers.Flatten(input_shape=(28,28)),
 tf.keras.layers.Dense(128, activation=tf.nn.relu),
     tf.keras.layers.Dense(10, activation=tf.nn.softmax)])

Sequential에 하나의 Flatten 과  두개의 Dense 를 차례로 연결한다.

첫번째 Flatten 층은 28*28 크기의 입력을 786개의 한줄로 펼쳐진 입력층으로 변환한다.

Dense의 뉴런층을 이용해 128개를 지정했는데 이 부분이 바로 은닉층(hidden layer)이다.

128개의 숫자는 임의로 지정된 수자이며 일정한 규칙은 없다.

층을 설계할 때 모델이 충분히 학습할 수 있는 적절한 개수를 선정해야 하는데 뉴런의 개수가 많으면 실행속도가 느려지고 훈련데이터는 잘 훈련이 되는 대신 처음 보는 데이터는 엉뚱한 결과를 내놓을 수 있는데 이를 과대적합(overfitting)이라고 한다.

반대로 뉴런 개수가 적으면 모델의 학습에 필요한 파라미터가 부족해서 훈련이 잘 되지 않는 현상이 발생한다.

activation 파라미터는 활성홤수를 정의하는 파라미터이다. 활성홤수는 레이어 뒤에 붙어서 실행되고 신경망이 복잡한 패턴을 구별하는데 도움이된다.

ReLu는 0보다 크면 입력값을 0보다 작으면 0을 반환하는 활성함수이다.

이전 레이이어에서 어떤 뉴런이 음수를 반환한다면 다른 뉴런의 양수값을 상쇄시키기 때문에 학습된 내용을 무시할 수 있으므로 ReLu를 사용하면 이 문제를 해결 할 수 있다.

출력레이어는 softmax라는 활성화함수를 가진다.

softmax는 10개중 가장 큰 값을 가진 값을 1로 나머지는 0으로 만들어 주는 활성화 함수이다.

 

3. 모델 컴파일

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

옵티마이저는 adam을 사용했는데 adam은 sgd의 개선된 버전으로 더 좋은 성능을 보인다.

손실 함수는 'sparse_categorical_crossentropy' 를 사용했는데 다중분류시 label 값이 원핫벡터의 경우 'categorical_crossentropy' 을 사용하고 값이 정수인 경우에는 'sparse_categorical_crossentropy' 을 사용하면 된다.

metrics=['accuracy'] 는 학습되는 동안 텐서플로에 정확도를 알려 준다.

 

4. 모델 학습

model.fit(training_images, training_labels, epochs=20)

epochs=20으로 20회 반복하여 훈련하도록 하였다.

 

5. 모델 검증

model.evaluate(val_images, val_labels)

evaluate 에 검증 데이터를 이용하여 검증을 해보면 96% 정확도를 알 수 있다.

머신러닝에서 과적합(overfiting) 현상은 모델이 학습셋은 잘 판단하지만 처음 보는 데이터셋은 판단하지 못하는 현상을 의미한다.

위의 데이터에서는 테스트셋 97%, 검증데이터셋 96% 정도이면 과적합 없이 학습이 잘 되었다고 볼 수 있다.

 

실무에서는 이것보다 복잡한 이미지를 이해해야 하는데 이때는 합성곱 신경망(convolutional neural network)를 사용한다.

더 복잡한 모델 아키텍처에 대해 자세히 몰라도 쉽게 시도해 볼 수 있는 효과적인 방법이 있는데 바로 전이학습이다.

 

전이학습은 다음시간에 다룰 예정이다.

 

참고서적]

한빛미디어 - 온디바이스AI,개발자을 위한 머신러닝&딥러닝

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기