케라스를 비롯하여 텐서플로우와 같은 머신러닝의 연산은 Wx +b로 겹겹히 생성이 된다. 

W: 2D matrix (가중치 행렬)

b: vector (편향) 

자세한 수학적 코드는 이해하기도 힘들고 복잡하므로 본 포스팅에서는 다루지 않는다. 

다른 포스팅에서 찾아보도록 하자. activation함수가 차원을 왜곡하고 뭐하고, 여러번 거치면 vector가 가지는 공간영역이 어쩌고 저쩌고 아 머리아파 진다. 넘어가도록 하자. 

그런데 신기한 건 우리가 고등학교 때까지, 그리고 일반적으로 알고 있는 수학에서는 각 행렬은 형태가 같아야만 연산이 되는데 여기서는 Wx즉 2D1D인 b가 덧셈이 된다는 것이다.  어떻게 된 것일까? 이것은 브로드캐스팅(Broadcating)에 의해 이루어진다. 이에 관해서 2.3.2절에서 살펴 보도록 한다. 

 

2.3.1 원소별 연산

넘파이 내장 함수 구현 코드

2.3.2 브로드캐스팅

모호하지 않고 실행가능하지 않은 경우하라면, 작은 텐서가 큰 텐서의 크기에 맞추어 이루어지는데, 브로드캐스팅은 다음 두 단계로 이루어짐.  

- 1. 먼저 큰 텐서의 ndim에 맞도록 작은 텐서에 (브로드캐스팅 축이라고 부르는) 축이 추가된다. 

- 2. 작은 텐서가 새 축을 따라서 큰 텐서의 크기에 맞도록 반복 연산된다. 

예) X = (32, 10) // y = (10, )의 shape를 취할 때 X와 y의 shape를 같게 하려면?

1 -> 먼저 y에 비어 있는 첫번째 축을 추가 하여 y= (1,10)으로 만듦 (뒤에 축이 비어 있는데???)

2 -> 이를 32번 반복

 

2.3.3 텐서 점곱

나중에 추가 예정

 

2.3.4 텐서의 크기 변환(Reshape)

신경망에 주어진 데이터를 전처리 할 때 사용. 

텐서의 크기를 변환한다는 것 = 특정 크기에 맞게 행/열을 재배열 한다는 것, [단 변환된 텐서의 원소 개수는 원레의 텐서의 원소 개수와 동일]

- 처음에 3행 2열 배열을 만들었다.

- 그런 다음 이에 해당하는 6개의 원소를 가진 6행 1열의 배열로 Reshape했다. 그리고 이를 출력해 보면 1열애 출력되는 것을 알 수 있다. 

 자주 사용되는 특별한 종류의 크기 변환에는 전치(transpose)가 있다. (i , j) -->(j , i)으로 숙지하면 된다. 

2.3.5 텐서 연산의 기하학적 해석

나중에 추가 예정

2.3.6 딥러닝의 기하학적 해석

3D 공간에서 다음의 비유가 딥러닝을 이해하는데 도움이 될 것임. 하나는 빨간색이고 다른 하나는 파란색인 2개의 색종이가 있다고 가정. 두 장을 겹친 다음 뭉쳐서 다른 공으로 만들면 이 종이 공이 입력 데이터이고 색종이는 분류 문제인 데이터 클래스.

 

신경망이 해야 할 일은 종이 공을 펼쳐서 두 클래스가 다시 깔끔하게 분리되는 변환을 찾는 것. 손가락으로 종이공을 조금씩 펼치는 것처럼 딥러닝을 사용하여 3D 공간에서 간단한 변환들을 연결하여 이를 구현

> 종이 공을 펼치는 것이 머신러닝이 하는 일. 복잡하고 심하게 꼬여있는 데이터의 매니폴드에 대한 깔끔한 표현을 찾는 일. 

- 심층 네트워크의 각 층은 데이터를 조금씩 풀어주는 변환을 적용 > 이런 층을 깊게 쌓으면 아주 복잡한 분해 과정을 처리 할 수 있음. 

 

다음장에서는 경사하강법과 BackPropagation에 대해서 간단하게 살펴본 다음, MNIST에 지금까지 배운 이론과 방법론을 실제로 적용하여 구현해 보도록 하겠습니다. 그럼 안녕히 주무세요. 오늘 제사 다녀와서 매우 피곤하네요. 제대로 포스팅 했는지도 모르겠고.,....공부도 제대로 한건지 모르겠고 ㅎㅎ;;; 빨리 자도 싶습니다....양치해야 하니 이만...

 

 

앞으로 실습할 모든것인 Shape, Slicing,[텐서의 조작], Tensor, Vector, 텐서의 핵심 속성 그리고 간단한 그래디언트 기반 최적화를 설명하는 장이다. 따라서 엄밀히 말하면 Numpy에 포스팅해야 하지만 케라스 책에 있으므로 여기에 포스팅한다. 

2.1 2장의 도입부 및 MNIST로 인한 전반적인 설명

2.2 신경망을 위한 데이터 표현

신경망은 Tensor라고 불리우는 다차원 넘파이 배열에 데이터를 저장하는 것으로부터 시작된다. 텐서에는 다음과 같은 데이터 형이 존재한다. 

2.2.1 스칼라(0D텐서)

하나의 숫자만 담고 있는 텐서이다. 거의 사용하지 않음. 

2.2.2 벡터(1D텐서)

하나의 축(행/열 등)을 가진 것을 벡터라고 부름. 

2.2.3 행렬 또는 Matrix(2D 텐서)

2개의 축(행/열)을 가지고 있는 데이터 숫자가 채워진 사각 격자임. 

2.2.4 3D텐서 이상

3D텐서는 사진 [R,G,B]를 나타내지만 그 이상인 4D, 5D는 Video를 나타낼 때 사용하는데 우리 눈으로 관찰하기는 불가능하다. 2.2.1 ~ 2.2.4를 각각 넘파이로 표현하여서 나타내보면 다음과 같다. 

먼저 0D 의 경우 이를 Numpy 배열로 생성하여 보면 하나의 값만 들어 있는 것을 알 수 있음. 또한 축이 몇 개 존재하는 지 알아 보기 위해서 ndim command를 실시 해본 결과 0으로 존재하지 않는 것을 알 수 있음.

1차원 배열의 경우는 다음과 같이 우리가 일반적으로 알고 있는 리스트 형태의 벡터가 만들어지고 축이 하나 존재함을 알 수 있음. 그리고 해당 벡터는 5개의 원소를 가지고 있으므로 5차원 벡터라고 함. 단, 이것은 축이 아니고 5D tensor도 아님을 명심해야 함. [5D Tensor는 Tensor가 5겹으로 놓이는 것임.]

가장 많이 쓰이는 matrix 인 2차원 텐서임. 백터와 달리 축이 하나 더 있어서, 데이터를 더 다양하게 표현 할 수 있음을 알 수 있음. 

마지막으로 3차원 Tensor를 표현해 보면 행, 열이 몇 개 쌓여 있는 지 표현하는 값인 z축이 붙었음을 알 수 있음.  나중에  MNIST의 응용과 함께 자세히 알아 볼 것임. 여기까지를 정리해서 신경망의 데이터를 표현하는 Tensor의 핵심속성을 알아보면 다음과 같음. 

2.2.5 핵심속성

축의 개수 : 행/열/깊이 : ndim 명령어로 알아 볼 수 있음.

크기(Shape): 텐서의 각 축을 따라 얼마나 많은 차원이 있는지를 나타내는 것. 앞에 나온 2D에서 Shape는 (3,5) - 3행 5열

3D는 (3, 3,5) - 3쌓여 있음 [3행 5열]

이를 구체적으로 확인 해 보기 위해서 MNIST의 dataset을 load히고 확인해 본다. 

따라서 data를 로드하고 train_image에 대해서 ndim과 shape를 확인해 보면

축의 개수는 3개인데,  28 행 28열이 60000곂 쌓여 있음을 알 수 있다. [여기서는 이미지이므로 28 by 28 pixel이 60000개 있음] 이를  matplotlib으로 확인해 보면

실제로 이미지를 출력해 볼 수 있고, 형태 또한 이전 우리가 예측했던 것과 같음을 알 수 있다. 

지금까지 신경망에 축적되는 데이터의 핵심속성에 대해서 알아 보았고 어떻게 출력해 보는 지 알아 보았다. 기본적으로 데이터를 알더라도 데이터를 적재한 다음에는 무조건 shape나 ndim은 확인해 보는 것이 좋다. 추후에 학습할 때 에러가 날 소지가 다분하기 때문이다. 

2.2.6 넘파이로 텐서 조작하기

이전에는 특정 이미지, 즉, 4번째 이미지 train_images[4]를 선택했다. 하지만 더 많은 이미지를 한 번에 선택해보거나 특정 범위로 이미지를 선택하고 싶을 때가 있다. 즉, slicing하고 싶을 때가 있다. 이렇게 특정 원소들을 선택 하는 것을 Slicing이라고 하는 데 다음 연산을 보자. 먼저 다음예는 11 번쟤부터 101번째까지의 값만 60000개 중에서 Slice하여 새로운 값을 my_slice에 저장한다. 

:(콜론)이 전체 인덱스를 의미하므로 여기서는 28을 뜻함. [28*28]

10~100 이므로 60000개중에서 11~100의 90개를 선택한다. 

주의 할 것은 위의 주석 부분과 같이 :은 생략 가능하다! (하지만 일관되게 써주는 것이 나중에 보는데 편함.)

각 배열의 축(행/열)을 따라 어떠한 인덱스 또는 인덱스 사이도 선택 할 수 있으므로 위와 같이 설정하면 픽셀 에 따른 값을 표현하는 것이 가능하다. 

2.2.7 배치 데이터

일반적으로 사람들이 머신러닝을 하면서 그냥 넘어가는(나의 경우 그랬음) 부분이다. 여기서 짚고넘어가면 좋을 듯 하다. 배치데이터란 딥러닝의 용어로서 일반적으로 딥러닝을 할 때 한 번 반복[Epoch: 이것도 딥러닝 용어임]할 때 모든 데이터를 사용하지 않고 데이터의 일부분만 사용한다. 예를 들어 MNIST 에서는 전체 60000개 중에 128개의 배치를 사용한다고 하면 다음과 같다. 

1st: batch = train_images[:128] / 2nd:  batch = train_images[128:256] ... nth: batch = train_images[128*n:128*(n+1)] 

2.2.8 텐서의 실제 사례

데이터의 종류는 다음과 같다. 

벡터 데이터(sampe, features) 

시계열 데이터(나중에 추가)

이미지(sample, height, width, channels)

동영상(samples, frames,height,width,channels)

2.2.9 벡터 데이터

사진이나 동영상 이외의 일반적으로 다루는 대부분의 데이터. 위에서 보다시피 Feature와 Sample축으로 이루어져 있다. 

 

2.2.10 시계열 데이터

주식 또는 트윗 셋. 나중에 추가

2.2.11 이미지 데이터

이미지 데이터는 앞엑서 봤던 MNIST와 같이 [height, width, color_channel]의 3차원으로 이루어짐. MNIST의 경우 흑백 이미지이므로 컬러 채널이 1이고 컬러 채널은 보통 RGB인 경우 세개이므로 3이다. 

예를 들어 256*256의 RGB이미지 128개의 배치는 (128,256,256,3)크기의 텐서에 저장 될 수 있음. 

- 이미지 데이터 공부하면서 좀 더 Update

2.2.12 비디오 데이터

5D Tensor가 필요한 경우임. 하나의 비디오는 프레임의 연속이고, 각 프레임은 컬러 이미지로 표현 됨. 따라서

프레임의 연속은 [frames, height, width, color_channel] 4D 텐서 로 표현되고

비디오의 배치는 [samples, frames, height, width, color_channel] 5D로 표현됨. 

 

예) 60초짜리 144*256유튜브 비디오 클립을 초당 4프레임으로 샘플링하면 

frames > 240 / samples>4 / height > 144 / width > 256 / color_channel >3

(4, 240, 144, 256, 3).크기의 텐서에 저장

 

이제 2장도 1/3정도 봤습니다. 다음에는 2.3장과 2.4장을 살펴 볼 건데 브로드캐스팅과 텐서의 형태, 그리고 경사하강법의 간단한 이론 정도에 대해서 나오는 것 같습니다. 자세히는 안 봐서 모르겠습니다. 어려운 문제는 없는 것 같으니 함께 포스팅 하는 것으로 하겠습니다. 

 

 

+ Recent posts