1. 텐서(tensor)
대부분 머신 러닝 시스템은 주로 텐서를 기본 데이터 구조로 채택하고 있습니다. 여러분은 텐서플로(TensorFlow)에서 이 용어를 들어본 적이 있을 것입니다. 이제 텐서가 정확히 무엇인지 살펴보겠습니다.
텐서는 데이터를 담는 컨테이너로, 주로 수치형 데이터를 다루기 때문에 숫자를 위한 컨테이너로 볼 수 있습니다. 텐서에서는 종종 차원을 축(axis)이라고 지칭합니다.
1) 스칼라 텐서
하나의 숫자만을 담고 있는 텐서를 스칼라 또는 랭크 0 텐서라고 부릅니다. 스칼라 텐서의 축 개수는 0이며, 이를 랭크(rank)로도 표현합니다.
스칼라 텐서의 예는 다음과 같습니다.
import numpy as np
# 스칼라 텐서 생성
scalar_tensor = np.array(5)
# 생성된 스칼라 텐서 출력
print("스칼라 텐서:")
print(scalar_tensor) # 출력: 5
# 텐서의 형태 출력
print("텐서의 형태 (Shape):", scalar_tensor.shape) # 출력: ()
# 텐서의 랭크 출력
print("텐서의 랭크 (Rank):", np.ndim(scalar_tensor)) # 출력: 0
이 코드에서 scalar_tensor.shape는 빈 괄호 ()로 출력되고, 이는 스칼라 텐서의 형태(shape)가 비어있다는 것을 나타냅니다. 랭크는 0이므로 스칼라 텐서는 0차원입니다. 출력된 값들은 주석에 표시된 것처럼 나타납니다.
2) 벡터
숫자의 배열을 벡터 또는 랭크 1 텐서라고 합니다. 랭크 1 텐서는 하나의 축을 가지고 있습니다.
import numpy as np
# 벡터 생성
vector = np.array([1, 2, 3, 4, 5])
# 생성된 벡터 출력
print("벡터:")
print(vector) # 출력: [1 2 3 4 5]
# 벡터의 형태 출력
print("벡터의 형태 (Shape):", vector.shape) # 출력: (5,)
# 벡터의 랭크 출력
print("벡터의 랭크 (Rank):", np.ndim(vector)) # 출력: 1
위의 코드에서는 NumPy의 np.array() 함수를 사용하여 숫자의 배열을 갖는 벡터를 생성하였습니다.
3) 행렬
벡터의 배열을 행렬 또는 랭크 2 텐서라고 합니다. 행렬은 2개의 축을 가지고 있습니다. 이 축은 행과 열이라고 불립니다. 행렬은 숫자가 채워진 사각 격자로 나타낼 수 있습니다.
import numpy as np
# 행렬 생성
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 생성된 행렬 출력
print("행렬:")
print(matrix)
# 출력:
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# 행렬의 형태 출력
print("행렬의 형태 (Shape):", matrix.shape) # 출력: (3, 3)
# 행렬의 랭크 출력
print("행렬의 랭크 (Rank):", np.ndim(matrix)) # 출력: 2
4) 랭크-3 텐서
이러한 행렬들을 하나의 새로운 배열로 통합하면, 숫자로 채워진 직육면체 형태로 해석할 수 있는 랭크-3 텐서가 생성됩니다.
랭크-3 텐서들을 하나의 배열로 통합하면 랭크-4 텐서가 형성되는 식으로 계속 진행됩니다. 딥러닝에서는 일반적으로 랭크 0에서 4까지의 텐서를 다루며, 동영상 데이터를 처리하는 경우에는 랭크-5 텐서까지 활용될 수 있습니다.
import numpy as np
# 랭크-3 텐서 생성
tensor_rank_3 = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]], [[13, 14, 15], [16, 17, 18]]])
# 생성된 랭크-3 텐서 출력
print("랭크-3 텐서:")
print(tensor_rank_3)
# 출력:
# [[[ 1 2 3]
# [ 4 5 6]]
#
# [[ 7 8 9]
# [10 11 12]]
#
# [[13 14 15]
# [16 17 18]]]
# 랭크-3 텐서의 형태 출력
print("랭크-3 텐서의 형태 (Shape):", tensor_rank_3.shape)
# 출력: (3, 2, 3) - 이는 3개의 행렬이 있고, 각 행렬은 2행 3열의 크기를 가지고 있다는 뜻입니다.
# 랭크-3 텐서의 랭크 출력
print("랭크-3 텐서의 랭크 (Rank):", np.ndim(tensor_rank_3))
# 출력: 3
2. 텐서의 특성
- 축의 개수(랭크): 랭크-3 텐서는 3개의 축을, 행렬(랭크-2텐서)은 2개의 축을 가지고 있습니다. 주로 파이썬 라이브러리인 넘파이나 텐서플로에서는 ndim 속성을 통해 이를 확인할 수 있습니다.
- 크기(shape): 텐서의 각 축을 따라 차원이 어떻게 구성되었는지를 나타내는 파이썬의 튜플입니다.
- 데이터 타입(dtype): 텐서에 담겨 있는 데이터의 형식을 나타냅니다. 예를 들어, 텐서의 데이터 타입은 float32, float64 등이 될 수 있습니다.
3. 텐서 데이터의 예제
1) 벡터 데이터의 예시
첫 번째 축은 샘플 축이며, 두 번째 축은 특성 축입니다.
생물 다양성 연구를 위한 벡터 데이터 예시로, 동물들의 특성을 기록하는 데이터를 살펴봅시다.
각 동물은 세 가지 특성을 가지고 있습니다.
- 몸무게 (kg)
- 크기 (cm)
- 식성 (식용 여부, 1 또는 0)
이러한 특성들을 기록한 각 동물의 정보를 벡터로 나타낼 수 있습니다.
예를 들어, 1000마리의 동물에 대한 정보를 담고 있는 벡터 데이터가 있다고 가정해봅시다. 이 경우, 첫 번째 축은 각 동물을 나타내고, 두 번째 축은 동물의 각 특성을 표현합니다. 전체 데이터셋은 (1000, 3) 크기의 랭크-2 텐서로 표현됩니다. 데이터셋에서 각 행은 하나의 동물에 대한 정보를 담고 있습니다.
2) 시계열 데이터의 예시
데이터에서 시간이 중요한 경우, 시간 축을 고려하여 랭크-3 텐서로 저장됩니다. 각 샘플은 벡터의 시퀀스로 표현되므로 배치 데이터는 랭크-3 텐서로 표현됩니다. 보통 시간 축은 항상 두 번째 축으로 설정됩니다.
예를 들어, 각 시간마다 기록된 온도와 습도 데이터를 고려해봅시다.
가정:
각 샘플은 24시간 동안 1시간 간격으로 기록된 온도와 습도 데이터를 가지고 있습니다.
7일 동안의 데이터가 있다고 가정합니다.
각 시간에는 온도와 습도를 기록했으므로 각 벡터는 두 개의 특성을 가집니다.
이러한 데이터는 (7, 24, 2) 크기의 랭크-3 텐서로 표현됩니다. 첫 번째 축은 각 날짜를 나타내며, 두 번째 축은 하루의 시간을 나타내고, 세 번째 축은 온도와 습도라는 두 개의 특성을 표현합니다.
3) 이미지 데이터의 예시
이미지는 일반적으로 높이, 너비, 그리고 컬러 채널의 3차원으로 이루어져 있습니다. 흑백 이미지는 하나의 컬러 채널만을 가지고 있어 랭크-2 텐서로 표현될 수 있지만, 관례적으로 이미지 텐서는 항상 랭크-3 텐서로 저장됩니다. 흑백 이미지의 경우, 채널 차원의 크기는 1입니다. 예를 들어, 256x256 크기의 흑백 이미지에 대한 128개의 배치는 (128, 256, 256, 1) 크기의 텐서에 저장될 수 있습니다. 반면, 컬러 이미지에 대한 128개의 배치는 (128, 256, 256, 3) 크기의 텐서로 표현될 수 있습니다.
이미지 텐서의 크기를 지정하는 방식에는 두 가지가 있습니다. 채널 마지막 방식과 채널 우선 방식입니다. 텐서플로에서는 주로 채널 마지막 방식을 사용합니다.
채널 마지막 방식은 (샘플 수, 높이, 너비, 채널 수)로 표현되며, 컬러 채널의 깊이가 가장 마지막에 위치합니다.
채널 우선 방식은 (샘플 수, 채널 수, 높이, 너비)로 표현되며, 컬러 채널의 깊이가 배치 축 바로 뒤에 위치합니다. 케라스 API는 이 두 가지 형식을 모두 지원합니다.
4) 비디오 데이터의 예시
비디오 데이터는 현실에서 랭크-5 텐서가 필요한 드물지만 중요한 데이터 중 하나입니다. 하나의 비디오는 연속된 프레임으로 이루어져 있으며, 각 프레임은 하나의 컬러 이미지입니다.
가상의 비디오 클립을 상상해봅시다. 각 프레임은 256*256 크기의 컬러 이미지로 구성되어 있습니다. 비디오는 60초 동안의 내용을 담고 있으며, 초당 4프레임으로 샘플링되었습니다. 이 상황에서 4개의 비디오 클립이 있다고 가정합니다.
이 데이터는 (4, 240, 256, 256, 3) 크기의 랭크-5 텐서로 표현됩니다. 첫 번째 축은 각 비디오를 나타내며, 두 번째 축은 비디오의 프레임을 나타내고, 세 번째와 네 번째 축은 각 프레임의 높이와 너비를 나타내며, 다섯 번째 축은 컬러 이미지의 RGB 채널을 나타냅니다.
'AI 및 데이터 분석' 카테고리의 다른 글
텐서플로와 케라스 소개: 딥러닝의 핵심 도구들 (0) | 2023.12.13 |
---|---|
신경망 훈련과 역전파: 모델 최적화의 핵심 메커니즘 (0) | 2023.12.12 |
텍스트 데이터 전처리와 벡터화 (0) | 2023.12.04 |
모델의 훈련 성능을 향상 시키는 효과적인 전략 (0) | 2023.12.03 |
머신러닝(ML) 모델 평가를 위한 데이터 분할과 평가 방법 (0) | 2023.12.03 |