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)
- 첫 번째 차원 (1000000): 전체 샘플 수, 즉 1백만 개의 트윗
- 두 번째 차원 (280): 각 트윗의 최대 길이 (트윗의 최대 글자 수). 트위터는 최대 280자의 제한이 있음
- 세 번째 차원 (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)
- 60초짜리 144 * 256 유튜브 비디오 클립을 초당 4프레임으로 샘플링하면 240 프레임이 됨
참고자료
케라스 창시자에게 배우는 딥러닝
728x90
'AIFFLE > STUDY' 카테고리의 다른 글
평가지표 - accuracy, precision, recall, F score, PR curve, AUC-ROC (0) | 2024.05.23 |
---|---|
[DL] 일반화 성능 향상시키기 (0) | 2024.05.21 |
머신러닝과 딥러닝 (0) | 2024.05.21 |
[Linux] 리눅스(Linux) 명령어 쉽게 찾아보기 - man, tldr (0) | 2024.05.14 |
[Markdown] 마크다운(Markdown) 링크, 이미지, 동영상 삽입하기 (0) | 2024.05.14 |