관리 메뉴

ComputerVision Jack

[골빈해커 Chapter7정리] 본문

DeepLearning/골빈해커 - Tensor Lib

[골빈해커 Chapter7정리]

JackYoon 2020. 1. 17. 15:45
반응형

[개념 정리]

07_이미지 인식의 은총알 CNN.ipynb
0.01MB

이미지 인식의 CNN

CNN은 합성곱 신경망이다. 이러한 CNN은 이미지 인식 분야와 자연어 처리, 음성인식에도 효과가 대단하다.

 

CNN 개념

한빛 출판 네트워크 - 합성곱 신경망

CNN의 모델은 기본적으로 컨볼루션 계층풀링 계층으로 구성된다.

N차원의 데이터의 지정한 영역의 값들을 하나의 값으로 압축한다고 여기면 된다.

 

즉 마스크(윈도우)를 통하여 이미지의 특정 영역을 가져와 은닉층을 구성된다.

따라서 윈도우의 크기가 (3 x 3)이면 가중치 또한 (3 x 3)이 필요하며, 편향은 1개가 필요하다.

이를 커널 또는 필터라고 한다.

 

stride(스트라이드)

stride는 윈도우가 이동될 크기를 말합니다. 이미지는 보통 픽셀로 구성되어 있다. 따라서 stride가 1인경우 한픽셀씩 옆으로 마스크가 이동하면서 영역을 가져오지만 2, 3,으로 주어지면 그 크기만큼 영상이 이동하면서 영역을 가져온다

 

다시 돌아와 mnist의 경우 영상을 입력 전체로 사용했기 때문에 28 * 28 즉 784개의 가중치가 필요하다. 하지만 CNN을 사용하면 마스크 크기만큼의 가중치가 필요하기 때문에 연산량에 이득이다.

 

W1 = tf.Variable(tf.random_normal([3, 3, 1, 32], stddev = 0.01))

L1 = tf.nn.conv2d(X, W1, strides = [1, 1, 1, 1], padding = 'SAME')

L1 = tf.nn.relu(L1)

#tensorflow에서 합성곱 신경망을 지원하는 함수는 tf.conv2d() 메소드를 사용한다.

stride경우 가장자리 1을 제외하면 [1, 1] 이기 때문에 상하 좌우 한칸씩 움직이면서 윈도우를 가져온다고 생각하면 된다.

padding경우 마스크에서 영상을 읽어올 때, 가장자리를 처리해주는 인자라고 생각하면 된다.

또한 가중치 설정경우 [3, 3]윈도우를 사용하여 32개의 은닉층을 생성한다고 생각하면된다.

 

맥스 풀링(max-pooling) = 서브 샘플링

L1 = tf.nn.max_pool(L1, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1],

                    padding = 'SAME')

# maxpooling의 경우 가져온 영역값들을 다시 윈도우를 통하여 strides만큼 움직이며 그값의 최대 값을 가져온다고 생각하면 된다. 위 과정을 거치면 stride가 2기 때문에 절반의 크기로 감소한다.(가로 세로 절반)

[ 2, 4, 5, 9 ],  [ 3, 5, 1 2]

[ 3, 5, 3, 2 ],  [ 4, 8, 2, 3] 이렇게 있는 경우 

[9] [5]

[5] [8] 식으로 최대값을 가져와서 setting한다.

 

W2 = tf.Variable(tf.random_normal([3, 3, 32, 64], stddev = 0.01))

L2 = tf.nn.conv2d(L1, W2, strides = [1, 1, 1, 1], padding = 'SAME')

L2 = tf.nn.relu(L2)

L2 = tf.nn.max_pool(L2, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1],

                    padding = 'SAME')

#계속 층을 연결하고 풀링시키며, dropout까지 적용한다.

가중치 설정을 보면 [3, 3] 윈도우를 사요하고, 전층의 은닉층이 32기 때문에 32를 사용한다. 그렇게 이번엔 64개의 층을 뽑아낸다.

L1에서 이미지의 사이즈가 (28 * 28)이 엇다면 max_pooling을 거치기 때문에 L2에선 (14 * 14)가 된다.

 

W3 = tf.Variable(tf.random_normal([7 * 7 * 64, 256], stddev = 0.01))

L3 = tf.reshape(L2, [-1, 7 * 7 * 64])

#flatten과정이라고 이해하면 된다.

 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits = model, labels = Y))

optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)

#cost와 최적화를 생성한다.

 

배치로 자른 후, 학습을 시키면 전보다 결과가 더 좋아진것을 확인 할 수 있다.

[고수준 API]

layer모듈을 이용하여 CNN모델 구현

 

L1 = tf.layers.conv2d(X, 32, [3, 3])

L1 = tf.layers.max_pooling2d(L1, [2, 2], [2, 2])

L1 = tf.layers.dropout(L1, 0.7, is_training)

#L1을 짤 때 길었던 코드가 3줄로 요약이 된다.

앞에서 제시한 stride와 ksize를 매칭하면 쉽게 이해할 수 있다.

 

반응형

'DeepLearning > 골빈해커 - Tensor Lib' 카테고리의 다른 글

[골빈해커 Chapter9정리]  (0) 2020.01.20
[골빈해커 Chapter8 정리]  (0) 2020.01.19
[골빈해커 Chapter6 정리]  (0) 2020.01.16
[골빈해커 Chapter5 정리]  (0) 2020.01.15
[골빈해커 Chapter4 정리]  (0) 2020.01.14
Comments