강의자료/머신러닝

[딥러닝실습] 이미지 분류(CNN) II-Flatten을 이용한 딥러닝 학습

파아란 기쁨 2022. 9. 16. 13:34
목표

이미지셋 데이터에서 딥러닝 모델의 특징을 추출하는 방법에 대해 이해 합니다.

 

실습하기

지난시간에 CNN의 구조를 살펴 보았습니다.

CNN의 레이어는 크게 두가지 부분으로 나뉩니다.

1. Convolution/Pooling : 메커니즘은 이미지를 형상으로 분할하고 분석

2. FC(Fully Connected Layer) : 이미지를 분류/설명하는 데 적합하게 예측

 

위의 이미지는 32*32의 이미지 데이터를 LeNet 모델로 처리하는 이미지 입니다.

 

  • C1 레이어 : 32*32 이미지를 6개의 5*5 필터와 컨볼루션 연산을 이용해 6장의 28*28 특징맵을 만드는 과정입니다.

Convolution 연산은 다음과 같은 과정을 거쳐서 특징점을 만들게 됩니다. 

출처: https://blog.naver.com/PostView.nhn?blogId=intelliz&logNo=221709190464

4*4 이미지를 사이즈 3*3 필터를 사용하면 특징맵의 크기는 2*2 크기로 생성이 됩니다. 

  • C5 레이어 : Fully connected Layer 과정으로 그 이전 레이어에서 추출된 특징맵을 1차원 배열 형태로 가공하여 이미지를 분류 합니다.

 

Fully Connected Layer의 입력 데이터는 1차원 배열 형태로 한정이 됩니다.

한장의 컬러 사진은 3차원 데이터이며 배치모드에 사용되는 여러장의 사진은 4차원 데이터입니다.

사진 데이터로 Fully Connected 신경망을 학습시켜야 할 경우 3차원 사진 데이터를 1차원 평면 데이터로 변환하여야 합니다.

사진 데이터를 평면화 시키는 과정에서 공간정보가 손실 될 수 밖에 없으며 공간정보 부족으로 인공신경망이 특징을 추출 및 학습이 비효율적이고 정확도를 높이는데 한계가 있습니다.

따라서 특징을 추출하여 정확도를 높이는 과정이 필요한데 이것이 Convolution/Pooling 과정입니다.

 

오늘은 이미지 데이터를 Fully connected Layer 로 1차원 배열로 변경하여 학습하는 모델을 실습해 보겠습니다.

실습 과정은 지난번의 실습과정과 동일합니다.

1. 과거의 데이터를 준비합니다.(과거의 데이터에서 원인과 결과 즉 독립변수와 종속변수를 찾아 냅니다.)

2. 모델의 구조를 만듭니다. 

3. 데이터로 모델을 학습합니다.

4. 모델을 이용합니다.

 

 

과거의 데이터 준비
# 데이터를 준비하고
(독립, 종속), _ = tf.keras.datasets.mnist.load_data()
print(독립.shape, 종속.shape)
독립 = 독립.reshape(60000, 784) #28 * 28 의 이차원 배열을 1차원 배열로 인코딩을 하자.
종속 = pd.get_dummies(종속) #종속 변수를 get_dummies를 이용하여 원핫 인코딩을 수행
print(독립.shape, 종속.shape)

reshape 를 이용해서 60000 * 28 * 28 형태의 데이터를 60000 * 784 형태로 데이터를 변환합니다.

reshape는 28*28 형태의 2차원 배열 이미지를 784개의 일차원배열 형태로 만들어 주는 함수입니다.

종속변수를 get_dummies 를 이용해서 원핫 인코딩을 수행합니다.

원핫 인코딩은 아이리스 품종 분류(https://wondangcom.tistory.com/2103) 를 참고하시기 바랍니다.

이러한 MNIST 모델을 그림으로 살펴 보면 다음과 같습니다.

출처:생활코딩

784개의 독립변수가 10개의 0~9까지의 숫자 이미지로 분류하는 분류 모델입니다.

이때 84개의 특징을 가지고 있는 히든레이어를 추가해 봅시다.

출처:생활코딩

히든레이어의 84개의 각 칼럼은 특징이라는 이름을 가지고 있습니다.

이곳의 84개의 특징은 인공신경망이 스스로 학습을 통해 찾은 것입니다.

이렇게 84개의 은닉층을 추가하는 것은 다음과 같은 의미를 가지는 것입니다.

"0~9 까지 중 어느 숫자인지 판단하기 위해 84개의 가장 좋은 특징을 찾아줘"

 

모델을 만든다

이렇게 히든레이어를 추가하는 방법은 다음과 같습니다.

# 모델을 만들고
X = tf.keras.layers.Input(shape=[784])
H = tf.keras.layers.Dense(84, activation='swish')(X) #84개의 히든레이어를 추가
Y = tf.keras.layers.Dense(10, activation='softmax')(H) #10개의 최종모델
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics='accuracy')

여기서 activation='swish' 는 ReLu를 대체하기 위해 구글이 고안한 함수입니다.

깊은 레이어를 학습시킬때 ReLU 보다 더 뛰어난 성능을 보여 준다고 합니다.

activation='softmax' 는 출력 노드의 활성함수로 사용되며 소프트맥스 함수는 다음과 같이 계산됩니다.

 

소프트맥스는 이미지가 어떤 레이블에 속하는지 근거를 계산하여 각 레이블에 대한 확률로 변환 시켜 주는 모델입니다.

model.compile(loss='categorical_crossentropy', metrics='accuracy') 에서

loss 는 분류/회귀 를 구분하는 구분자입니다.

분류에서는 crossentropy

회귀에서는 mse 를 사용합니다.

metrics= 평가기준을 선택하는 것이며 위에서는 일반적으로 사용하는 accuracy를 사용했습니다.

(메트릭스에 관한 기준은 https://supermemi.tistory.com/78 을 참고)

모델을 학습 및 이용
# 모델을 학습하고
model.fit(독립, 종속, epochs=10)

# 모델을 이용합니다.
pred = model.predict(독립[0:5])
print(pd.DataFrame(pred).round(2))
print(종속[0:5])

모델을 학습 후에 독립 변수의 5개 함수를 넣어서 확률을 출력해 봅시다.

 

이렇게 학습 할 때 flatten을 사용하면 28*28 데이터를 입력 받아 처리 할 수 있습니다.

###########################
# with flatten
 
# 데이터를 준비하고
(독립, 종속), _ = tf.keras.datasets.mnist.load_data()
# 독립 = 독립.reshape(60000, 784)
종속 = pd.get_dummies(종속)
print(독립.shape, 종속.shape)
 
# 모델을 만들고
X = tf.keras.layers.Input(shape=[28, 28])
H = tf.keras.layers.Flatten()(X)
H = tf.keras.layers.Dense(84, activation='swish')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics='accuracy')
 
# 모델을 학습하고
model.fit(독립, 종속, epochs=10)
 
# 모델을 이용합니다. 
pred = model.predict(독립[0:5])
print(pd.DataFrame(pred).round(2))
print(종속[0:5])

독립변수의 reshape 대신에

케라스의 입력 데이터를 28*28 로 변경한 후에

H = tf.keras.layers.Flatten()(X) 을 추가하여 

으로 1차원 배열 형태로 만들어 주면 됩니다.

 

여기서 주의할 점은

H = tf.keras.layers.Dense(84, activation='swish')(H) 과 같이 swish 에 H를 입력해야 한다는 점입니다.

이렇게 CNN 모델은 복잡해 보이지만 텐서플로우같은 라이브러리를 사용하면 학습하는 것은 너무나도 쉬워 보입니다.

 

<출처>

https://opentutorials.org/module/5268/29787

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