본문 바로가기

AIFFLE/STUDY

텐서의 이해

728x90

학습 내용

신경망을 위한 데이터 표현 방식인 텐서에 대해 이해한다

 

텐서

  • 머신 러닝의 기본 구성 요소
  • 데이터를 위한 컨테이너(container), 일반적으로 수치형 데이터를 다루므로 숫자를 위한 컨테이너
  • 임의의 차원 개수를 가지는 행렬의 일반화된 모습
  • 텐서에서는 차원(dimension)을 축이라고 부름

 

Scalars (rank-0 tensors)

  • 하나의 숫자만 담고 있는 텐서
  • (numpy) 스칼라텐서(array scalar) : float32, float64 타입의 숫자
  • 축 개수(rank) : 0 (ndim == 0)
# 0D Tensor(Scalar)

x = np.array(1)       # numpy
t0 = tf.constant(1)    # tensorflow

 

Vectors (rank-1 tensors)

  • 숫자의 배열
# 1D Tensor(Vector)
x = np.array([1, 2, 3])
t1 = tf.constant([1, 2, 3])

🌟주의사항🌟
위 벡터는 5개의 원소를 가지고 있으므로 5차원 벡터라고 부름
5D 벡터 ≠ 5D 텐서

  • 5D 벡터 : 하나의 축을 따라 5개의 차원을 가진 것
    5D 텐서 : 5개의 축을 가진 것

차원 수

  • 특정 축을 따라 놓인 원소의 개수(5D vectors)
  • 텐서의 축 개수(5D tensors)
    → rank가 5인 tensor라고 말하는 것이 기술적으로 좀 더 정확함
    → 축 개수 = 랭크

 

Matrices (rank-2 tensors)

  • 벡터의 배열
  • 2개의 축이 존재 (row, column)
  • 숫자가 채워진 사각 격자
# 2D Tensor(Matrix)
x = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

t2 = tf.constant([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])
  • 행 : 첫 번째 축에 놓여있는 원소 ex) [1,2,3]
  • 열 : 두 번째 축에 놓여있는 원소 ex) [1,4,7]

 

Rank-3 and higher-rank tensors

  • Rank-3 tensors : 이런 행렬들을 하나의 새로운 배열로 합치면 숫자가 채워진 직육면체 형태로 해석할 수 있음
# 3D Tensor
t3 = tf.constant([[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
                  [[1, 2, 3],[4, 5, 6],[7, 8, 9]],
                  [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
                ])

x = np.array([[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
               [[1, 2, 3],[4, 5, 6],[7, 8, 9]],
               [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
             ])
  • Rank-3 텐서들을 하나의 배열로 합치면 rank-4 텐서를 만드는 식으로 이어짐
  • 딥러닝에서는 보통 랭크 0에서 4까지 다룸
  • 4D Tensor
    • 4차원 텐서는 4개의 축이 존재
    • 컬러 이미지 데이터가 대표적인 사례
    • 흑백 이미지 데이터는 3D Tensor로 가능
    • 주로 샘플(samples), 높이(height), 너비(width), 컬러 채널(channel)을 가진 구조로 사용
  • 5D Tensor
    • 5차원 텐서는 5개의 축이 존재
    • 비디오 데이터가 대표적인 사례
    • 주로 샘플(samples), 프레임(frames), 높이(height), 너비(width), 컬러 채널(channel)을 가진 구조로 사용

텐서의 핵심 속성

  • Rank : 축의 개수
    • 0차원 텐서 : 랭크-0(스칼라) / 1차원 텐서 : 랭크-1(벡터) / 2차원 텐서 : 랭크-2(행렬) / 3차원 텐서 : 랭크 3 / 그 이상 n차원 텐서 : 랭크-n
  • Shape(크기): 축의 길이
  • Data Type(데이터타입)
    • 텐서에 저장된 데이터의 종류를 나타냅니다.
    • float16, float32, float64, uint8 (텐서플로에서는 string 텐서 사용하기도함)

 

배치 데이터

  • 샘플 축(sample axis, sample dimension이라고도 함) : 일반적으로 딥러닝에서 사용하는 모든 데이터 텐서의 첫 번째 축(0번째 축)
  • 딥러닝 모델은 한 번에 전체 데이터셋을 처리하지 않음
    • 배치 축(batch axis), 배치 차원(batch dimension) : 배치를 다룰 때 첫 번째 축(0번 축)
  • batch = train_images[:128] # n번째 배치 batch = train_images[128 * n : 128 * (n+1)]
  • → 데이터를 작은 배치(batch)로 나눔 : train_image[:128] 의미

 

텐서의 실제 사례

  • 벡터 데이터 : (samples, features) 크기의 랭크-2 텐서
    • 각 샘플은 수치 속성(특성, feature)으로 구성된 벡터
    • 대부분의 경우에 해당
    • 하나의 데이터 포인트가 벡터로 인코딩될 수 있으므로 배치 데이터는 랭크-2 텐서로 인코딩될 것임(벡터의 배열)
    • 첫 번째 축 : samples, 두 번째 축 : feature axis
    • 예시
      • 사람의 나이, 성별, 소득으로 구성된 인구 통계 데이터 : (10000, 3) 크기의 랭크-2 텐서로 저장가능
      • (공통 단어 2만개로 만든 사전에서) 각 단어가 등장한 횟수로 표현된 텍스트 문서 데이터셋
        • 각 문서는 2만개의 원소(사전에 있는 단어마다 하나의 원소에 대응)을 가진 배열로 인코딩
        • (500, 20000) 크기의 텐서로 저장
  • 시계열 데이터 또는 시퀀스(sequence) 데이터 : (samples, timesteps, features) 크기의 랭크-3 텐서
    • 각 샘플은 특성 벡터의 (길이가 timesteps인) 시퀀스
    • 데이터에서 시간이 (혹은 연속된 순서가) 중요할 때는 시간 축을 포함하여 랭크-3 텐서로 저장
    • 각 샘플은 벡터의 시퀀스(랭크-2 텐서)로 인코딩되므로 배치 데이터는 랭크-3 텐서로 인코딩

예시

  • 주식 가격 데이터셋 : 1분마다 현재 주식 가격, 지난 1분 동안에 최고 가격, 최소가격 저장
    • 1분 마다 데이터 : 3D 벡터로 인코딩 하루동안의 거래 : (390, 2) 크기의 행렬 - 하루의 거래시간은 390분 260일치의 데이터 : (250, 390, 3) 크기의 랭크-3 텐서
    • 1일치 데이터가 하나의 샘플
  • 트윗 데이터셋
    • 각 트윗은 128개의 알파벳으로 구성된 280개의 문자 시퀀스
    • 각 문자가 128개인 크기인 이진 벡터로 인코딩 될 수 있음
      • 해당 문자의 인덱스만 1이고 나머지는 모두 0인 벡터
      • → 각 트윗은 (280, 128) 크기의 랭크-2 텐서로 인코딩 될 수 있다
      • 100만개의 트윗으로 구성된 데이터셋 : (1000000, 280, 128)
        1. 첫 번째 차원 (1000000): 전체 샘플 수, 즉 1백만 개의 트윗
        2. 두 번째 차원 (280): 각 트윗의 최대 길이 (트윗의 최대 글자 수). 트위터는 최대 280자의 제한이 있음
        3. 세 번째 차원 (128): 임베딩 공간의 차원. 각 글자 또는 단어가 128차원 임베딩 벡터로 표현된다고 가정각 샘플은 벡터의 시퀀스(랭크-2 텐서)로 인코딩되므로 배치 데이터는 랭크-3 텐서로 인코딩
    • 이미지 : (samples, height, width, channels) 또는 (samples, channels, height, width) 크기의 랭크-4 텐서
      • 각 샘플은 픽셀의 2D 격자고 각 픽셀은 수치 값(채널, channel)의 벡터
      • 이미지는 전형적으로 높이, 너비 ,컬러 채널의 3차원으로 이루어짐
      • 흑백이미지 : 컬러 채널의 차원크기 1
        • 256 * 256 크기의 흑백 이미지에 대한 128개의 배치 : (128, 256, 256, 1)
      • 컬러이미지에 대한 128개의 배치 : (128, 256, 256, 3)


 

- 이미지 텐서 크기 지정 방식
    - 채널 마지막(channel-last) : (samples, height, width, color_depth), 텐서플로에서 사용
    - 채널 우선(channel_first) : (samples, color_depth, height, width), 많이 사용 x
        - keras API는 두 형식 모두 지원
  • 동영상, 비디오 데이터 : (samples, frames, height, width, channels) 또는 (samples, frames, channels, height, width) 크기의 랭크-5 텐서
    • 각 샘플은 이미지의 (길이가 frames인) 시퀀스
    • 하나의 비디오는 프레임의 연속이고 각 프레임은 하나의 컬러 이미지
      • 프레임 : (height, width, color_depth)
      • 프레임의 연속 (frames, height, width, color_depth)
      • 여러 비디오의 배치 (samples, frames, height, width, color_depth)
      • 예시
        • 60초짜리 144 * 256 유튜브 비디오 클립을 초당 4프레임으로 샘플링하면 240 프레임이 됨
          이런 비디오 클립을 4개 가진 배치 : (4, 240, 144, 256, 3)

 

참고자료

케라스 창시자에게 배우는 딥러닝

728x90