@Numpy를 사용한 파이썬 프로그래밍의 유연성
<장점>
-언어의 넓은 표현성, 유연성
한 줄의 코드로도 많은 걸 할 수 있게 해줌
<단점>
-브로드캐스팅의 유연성
브로드캐스팅의 자세한 내용과 작동 방법 모르면 가끔 이상하고 찾기 힘든 오류 생김
예를 들어, 행 벡터와 열 벡터를 더한다면 차원 오류나 형 오류가 생길 거라고 예상하겠지만, 두 벡터의 합인 행렬이 나올 수도 있음
->이 이상한 결과는 파이썬 내부 논리로 처리되지만 파이썬에 익숙하지 않다면 이상하고 찾기 어려운 오류들이 생김
@파이썬 Numpy에서 특히 벡터를 만드는 과정에서 많이 생기는 직관적이지 않은 결과
import numpy as np
a = np.random.randn(5) # 5 Gaussian distribution values
print(a)
print()
print(a.shape) # The size of a
print()
print(a.T) # The transpose of a is the same as a
print()
print(np.dot(a, a.T)) # dot product of a transpose and a
print()

a.shape이 (5,)가 되는 이상한 자료구조(행 벡터나 열 벡터 둘 다 아닌) 만들어짐 ->"랭크가 1인 배열(rank 1 array)"
a와 a의 전치(a.T)가 똑같이 생김
a의 전치에 대괄호가 하나 있음 ->랭크가 1인 배열
신경망 구현시 크기가 (5,) 혹은 (n,)인 랭크가 1인 배열을 아예 사용하지 않는 것을 권장!

->항상 배열 만들 때 아래처럼 (5,1) 열 벡터 만들거나 행 벡터 만들어준다면 벡터의 동작을 더 쉽게 이해할 수 있을 것

import numpy as np
a = np.random.randn(5, 1)
print(a)
print()
print(a.T) # a transpose becomes row vector
print()
print(np.dot(a, a.T)) # dot product of a transpose and a
print()

대신 a를 a = np.random.randn(5, 1)로 설정한다면 a는 5x1 열 벡터가 됨
전에는 a와 a의 전치가 똑같이 생겼다면, 지금 a의 전치를 출력해보면 행 벡터가 됨
a의 전치에는 대괄호가 두 개 있음 ->1x5 행렬
a와 a의 전치의 곱 출력하면 벡터의 외적이 나오게 되고 그것은 행렬이 됨
@코드에서 벡터의 차원을 확실히 알지 못할 때

a가 (5,1) 열 벡터라는 걸 확실히 하기 위해 assert 함수 써줌
->assert 함수는 굉장히 저렴하고, 문서의 역할도 할 수 있으니 필요할 때 언제나 넣어주면 좋음
만약 랭크 1 배열을 얻게 된다면 reshape 함수를 써서 (5,1) 배열이나 (1,5) 배열로 바꾸어 일관되게 열 벡터나 행 벡터로 동작하게 할 수 있음
참고)
'CS > AI | CV' 카테고리의 다른 글
신경망 네트워크 출력의 계산 | Computing Neural Network Output (0) | 2021.01.07 |
---|---|
신경망 네트워크 구성 | Neural Network Representations (0) | 2021.01.06 |
파이썬 브로드캐스팅 | Broadcasting in Python (0) | 2021.01.05 |
로지스틱 회귀의 경사 계산 벡터화 | Vectorizing Logistic Regression's Gradient Computation (0) | 2021.01.05 |
로지스틱 회귀의 벡터화 | Vectorizing Logistic Regression (0) | 2021.01.05 |