[딥러닝 기초] Tensor의 이해와 Numpy기초

[딥러닝 기초] Tensor의 이해와 Numpy기초

딥러닝의 Tensor => numpy array로 주로 표현한다. Tensor의 기본에 대해 이해하고 python numpy의 기본 도구들을 익히자

Tensor의 이해

0차원(scalar)

1
2
3
4
5
import numpy as np

arr = np.array(5)
arr.shape
arr.ndim
1
2
Out: ()
Out: 0

스칼라로 들어간 넘파이 배열. shape가 아무것도 없는 것으로 나온다.

1차원(vector)

1
2
arr = np.array([5])
arr.shape
1
Out: (1,)
  • numpy에서 1차원 텐서의 shape을 표현할때 (1)이 아닌 (1, ) 과 같이 표현한다.
  • 이건 shape이기 때문에 1이라는 값이 들어갔다는게 아니다. 1차원에 1개의 값이 들어갔다는 의미.
  • 마찬가지로 예를들어 (3, ) 은 1차원에 3개의 값이 들어갔다는 의미이다.

2차원(matrix)

1
2
arr = np.array([[1,2,3], [1,2,3]])
arr.shape
1
Out: (2, 3)

다차원

1
2
arr = np.array([[[1],[2],[3]], [[1],[2],[3]], [[1],[2],[3]]])
arr.shape
1
Out: (3, 3, 1)

Numpy기초

0과 1로 채워진 numpy array만들기

np.zeros() : 0으로 채워진 numpy array 만들기

np.ones() : 1으로 채워진 numpy array 만들기

1
2
3
4
zeros = np.zeros([2, 3])
ones = np.ones([3, 2])
zeros
ones
1
2
3
4
5
6
7
Out:
array([[0., 0., 0.],
[0., 0., 0.]])

array([[1., 1.],
[1., 1.],
[1., 1.]])

특정 범위의 숫자로 채워진 numpy array만들기

np.arrange(M, N) : M부터 N-1까지의 수로 채워진 numpy array를 만들어준다

1
2
arr = np.arrange(4, 7)
arr
1
2
Out:
array([4, 5, 6])

(응용) reshape와 섞어서 쓰기

1
2
arr = np.arrange(4, 8).reshape(2, 2)
arr
1
2
3
Out:
array([4, 5],
[6, 7])

(응용) array의 index로 접근하기

1
2
3
4
nums = [1, 2, 3, [1, 2, 3, 4]]
arr[1]
arr[1, 0]
nums[4]
1
2
3
4
Out:
array([6, 7])
6
[1, 2, 3, 4]

(응용) index로 slicing하기

1
2
3
arr = np.arrange(9).reshape(3, 3)
arr[1:]
arr[1:, 1:]
1
2
3
4
array([3, 4, 5],
[6, 7, 8])
array([4, 5],
[7, 8])

(응용) Boolean indexing

1
2
data = np.random().radn(2, 2) // 랜덤한 숫자로 2*2 배열 생성
data <= 0 // 0보다 작은 숫자 이렇게 boolean으로 바로 찾을수도 있다.
1
2
3
Out:
array([ True, False],
[False, False])

Broadcast

  • 연산하려는 행렬의 shape, 값 등을 조정하기 위한 테크닉 알 필요가 있다.
1
2
3
4
arr = np.arrange(9).reshape(3, 3)
arr + 3 // 모든 값에 3씩 더해준다
arr + np.array([1, 2, 3]) // 각 행마다 [1, 2, 3]을 더해준다
arr * 3 // 모든 값에 3을 곱해준다

기타

  • np.argmax(arr) : 가장 값이 큰 value의 인덱스를 반환한다. argmin()도 있다.

  • np.unique(arr) : array안에 있는 unique한 값들을 numpy array형태로 반환해준다.

  • np.dtype() : array의 data type(dtype)을 반환해준다.

    • 기본적으로 그냥 [1, 2, 3] 뭐 이렇게 넣으면 알아서 ‘int64’ 타입으로 들어간다.
    • 배열 생성시에 데이터 타입을 지정해줄 수도 있다 : (예시) np.array([[1., 2, 3], [1, 2, 3]], dtype=np.uint8)
  • np.astype(‘data type’) : 값의 data type을 원하는 타입으로 변환해준다.

  • np.ndim() : 차원 수를 return

  • np.size() : size 확인

  • np.reshape() : resize()와는 다르게 사이즈는 유지하면서 모양/차원만 바꿔준다.

    • -1 활용.
      차원 바꿔주고싶은데 해당 차원에 몇개 들어가야할지 정확히 모를때 그냥 -1쓰면 알아서 계산해서 바꿔준다. 일종의 물음표라고 생각하면 된다.
      1
      2
      3
      4
      arr = np.array([[1, 2, 3], [1, 2, 3]])
      arr.reshape([6]).shape // (6, ) => 1차원 array로 바뀜
      arr.reshape([-1]).shape // (6, ) => 1차원으로 바꿔주는데 몇개인지 모를때 그냥 알아서 1차원으로 바꿔줌
      arr.reshape([-1, 2]).shape // (3, 2) => (?, 2)로 바꿔달라는 말과 동일하며, 알아서 맞춰서 (3, 2)의 배열로 변환해준다.
    • 사이즈 변동이 없는 선에서 차원을 늘릴 수 있다.

      1
      2
      arr = np.array([[1, 2, 3], [1, 2, 3]]) // (2, 3)
      arr.reshape(2, 3, 1, 1) // (2, 3, 1, 1)
  • np.random.rand(M, N, …) : (M, N, …) 차원의 배열을 랜덤한 숫자로 채워 생성한다.

  • np.ravel() : 차원을 1차원으로 바꿔서 펼쳐준다. Layer의 flatten을 위한 기능이라고 생각하면 된다.

값을 유지하며 차원을 늘리자 : np.expand_dims()

: reshape으로도 차원을 늘릴 수는 있지만 동일한 형태 유지하면서 차원만 늘리려면 안에 들어있는 값 개수를 알아야 한다. 개수를 모를때 차원을 늘리기 위해 사용할 수 있는 함수가 expand_dims()

1
2
3
4
arr.expand_dims(
arr, // 차원을 늘릴 numpy array
0 // 0: 차원을 뒤에 붙임, -1: 차원을 앞에 붙임
)

댓글