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
'Computer_Science > Visual Intelligence' 카테고리의 다른 글
7일차 - Image 처리 (2) (0) | 2021.09.21 |
---|---|
6일차 - Image 처리 (1) (0) | 2021.09.21 |
4일차 - 영상 데이터 처리를 위한 객체지향 프로그래밍 (0) | 2021.09.18 |
3일차 - 영상 데이터 처리를 위한 객체지향 프로그래밍 (0) | 2021.09.18 |
2일차 - 영상 데이터 처리를 위한 함수형 패러다임 (0) | 2021.09.17 |