728x90
반응형

numpy

기계학습은 한번에 동시에 연산해야 하는데

array 연산

homogeneous / sequence : matrix

1차 : vector

2차 : matrix

3차이상 : tensor

 

섞이면

array는 자동으로 가장 큰 데이터 타입으로 바꿔주는데

tensor는 sequence를 mixed로 할수없다

torch도 sequence를 mixed로 할수없다

homogeneous는 데이터의 종류가 같다. 동질성

sequence는 indexing, slicing, sequence operator(vectorization)

 => 연산할 때 값이 아닌 인덱싱 이어준다

vectorization : loop없이 한번에 여러개의 연산을 elementwise 방식으로 동시에 하게 해준다. 

elementwise : 같은 위치의 값끼리, 자기에 맞는 위치의 값끼리 연산

 

numpy는 cpu vectorization 연산 지원(4코어면 4개 동시 연산), tensorflow는 gpu vectorization 연산지원(5000개면 5000개 동시엔 연산)한다. => 코딩량, 연산횟수가 줄어듬

tensorflow는 numpy 기반이라 배울 필요가 있다.

 

homo : '1' in 'abc'

hetero : '1' in ['1', b, c]

homo가 데이터 타입 체크를 할 필요가 없기 때문에 더 빠른 연산을 한다.

* a = 1, b = 1. 이건 coercion : 같은 형의 두인자를 수반하는 연산이면 한형의 인스턴스를 다른형으로 묵시적으로 변환해버림

그 외엔 같은 데이터 타입이어야 한다

 

 

linear algebra 선형대수연산

image는 array형태이고, 머신러닝도 빅데이터 병렬연산을 위한 array을 사용함

numpy는 gpu지원안하니깐 tensorflow와 pytorch가 50배나 더빠른 gpu를 사용 

안그래도 c언어보다 python이 20~100배 느린데, 수치연산에 불리하다

하지만 자동화랑 mutable이 너무 좋은걸?

 

그래서 하드웨어 성능을 끌어오는 방법,

compiler를 쓰면 빠름

또 homogenuous 형태를 통해서 속도를 향상시킴

np.ScalarType으로 확인할 수 있음

data type에 따라서 연산 최적화가 달라짐 => backpropagation, 미분 등

미분은 연속만 가능한데 uint8은 불연속이라 float형태로 바꿔줘야 함

=> 중요한 문제라 data type을 항상 알려줌, 타입에 따라서 연산의 방식이 달라지니깐

 

t.gradient()으로 확인

빅데이터는 가장큰 데이터 타입쓰면 됨 => float64

근데 mldl은 gpu연산 라이브러리 들이 32bit 연산에 최적화됨

 

ndarray는 numpy의 class 이름임, 그래서 np.ndarray((2,3))이렇게 만들수있는데 사용자가 불편함

그래서 factory method 방식으로 np.array를 쉽게 쓸수있게 만듬. __repr__로 가능

사실 그냥 똑같은거다 array의 통칭 정도

비어있으면 안되고, 직각 형태로 만들어야 한다.

 

1) , indexing

index로 개별로 가져오기, slicing 뭉탱이로 가져오기

# a[1][1] = a[1,1]

a[1] => 2차원의 1 idx의 list를 가져옴

혹은

a[1,:]으로 하면 동일함

3차원은 a[,,]

 

2) boolean indexing => filter

a[ ( a > 3 ) | ~(a<5) ]

 

3) fancy indexing

재조합해서 만들수있음

a[[1,0]]    a[['aaa', 'bbb']]

 

4) extended fancy indexing

a[[0,1], [1,2]] => 자리값맞춰주면 각각 가져옴

 

5) ellipsis ...

1 이상의 :을 대체, 2차원에서는 별로 의미없음

a[,:] = a[,...]

a[:,:] = a[...]

 

# mutable 개념은 언제 중요할까?  선언 vs 얕은 복사 vs 깊은복사

- a = b # 이렇게 array 선언하면 memory를 공유함

그래서 a 수정하면 b도 수정됨

- a = b[:], b[...]#이렇게 하면 내용을 가져옴 => 얕은 복사, 메모리는 다르니 다른 객체이지만 영향을 받음 id() 다른 메모리 할당

- a = b.copy() # copy도 내용을 가져옴 => 원본과 분리되어 메모리 별도로 받음 : deepcopy()

numpy에만 있고 tensorflow에는 없는 개념임

이제 무조건 copy되도록

 

img의 데이터 운용은 좀더 복잡하다

a[:,:,:] 이 (60000, 28, 28)이면

a[10000:50000,:,:]으로 일부 때오거나

a[:,:14,:14]으로 일부 자르거나 할수있다.

 

shape

a = np.array([1,2,3])

a[:,none] 하면 차원을 증가시킴

[[1],[2],[3]] : none은 여기서 np.newaxis, tf.newaxis와 같다

반대는 np.squeeze(bb)

 

 

 

 

 

 

img 자체는 array로 구현함

import matplotlib.pyplot as plt

plt.imshow(x_train[0], cmap='gray')

 

2차 흑백 이미지

0이니깐 검은색으로 표

 

현 명암만 가능

좌표값의 색상정보

(6,6,1)

1이 0 ~ 255임

 

3차 색깔 이미지 

RGB방식으로 값을 주면 가능 0,0 => [R, G, B]

x_train[0]=> (6,6,3) => 값이 3개가 나옴

6x6이 3장 겹쳐진 상태임, 3이 [R,G,B]형태임

 

4차 영상이미지

개별의 dataset이냐 연속된 이미지인가

x_train => 3000, 6, 6, 3

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts