Tensor Shape와 연산

인공지능응용 · 5주차

이번 주 목표 · 데이터 수와 각 축의 의미를 확인한 뒤 결합·변형·연산합니다.

실행: Colab에서 내 Drive에 사본을 저장한 뒤 Code Cell의 ▶ 또는 Shift+Enter로 위에서부터 실행하세요. ⟦직접 입력⟧ 표시가 있는 Text Cell은 더블클릭해서 수정합니다.

표에서 사진 묶음까지: 축이 필요한 이유

개념 설명용 예시 · 학생별 측정표와 사진 묶음은 축의 의미를 설명하기 위한 예입니다. 이번 실습에서는 직접 만든 숫자 Tensor로 축과 연산을 확인합니다.

3주차에는 여러 측정값을 행과 열로 정리했습니다. 학생 네 명의 측정 항목이 세 개라면 (4,3) 배열을 만들고, 행은 학생, 열은 측정 항목으로 정할 수 있습니다. 값뿐 아니라 값이 놓인 자리에도 의미가 있습니다.

사진은 어떨까요? 흑백 사진 한 장은 세로·가로 위치마다 밝기 하나를 둡니다. 컬러 사진은 같은 위치에 색 성분도 구분해야 하고, 여러 장이면 사진 번호도 구분해야 합니다.

표현할 데이터 구분할 항목의 예
흑백 사진 한 장 세로 위치, 가로 위치
컬러 사진 한 장 색 성분, 세로 위치, 가로 위치
컬러 사진 여러 장 사진 번호, 색 성분, 세로 위치, 가로 위치

이처럼 여러 축으로 수치를 배치한 배열을 이번 실습에서는 Tensor로 다룹니다. 축 순서는 도구와 모델에 따라 다를 수 있으므로 직접 정하고 확인해야 합니다. PyTorch Tensor는 이 배열에 대한 계산과 AI 학습에 필요한 자동미분 등을 지원합니다.

실습의 학생별·항목별 평균도 같은 원리입니다. 학생들을 모아 평균을 내면 항목별 결과가 남고, 항목들을 모아 평균을 내면 학생별 결과가 남습니다. 함수의 축 번호를 외우기 전에 무엇을 모으고 무엇을 남길지 생각하면 결과의 shape를 예상할 수 있습니다.

NumPy의 축을 PyTorch에서 읽기

Tensor의 rank는 Tensor의 축 개수(ndim)를 뜻합니다. torch.Size([4,3])은 4행 3열이라는 shape입니다. NumPy에서 axis로 지정했던 축은 PyTorch에서 dim으로 지정합니다. 모델링 실습부터는 PyTorch Tensor를 사용하지만 “어느 축이 표본이고 어느 축이 특징인가?”라는 확인 순서는 같습니다.

1. 숫자 묶음에 축의 의미 붙이기

Tensor는 여러 축을 가진 수치 배열입니다. (학생 수,특징 수)=(4,3)이면 학생 네 명의 특징 세 개입니다. 같은 숫자라도 축의 의미를 모르면 평균을 잘못 계산할 수 있습니다.

숫자 묶음에 축의 의미 붙이기

입력 데이터의 shape와 함께 dtype도 확인하세요. 평균·학습 입력에는 float가 흔하고, 클래스 인덱스에는 long을 사용합니다. Tensor(텐서)가 어느 장치에 있는지도 device로 확인하세요.

2. cat과 stack 구분

cat은 기존 축을 따라 연결합니다. (2,3) 두 개를 dim=0으로 cat하면 (4,3)입니다. stack은 새 축을 만들어 dim=0이면 (2,2,3)이 됩니다. 먼저 예상 shape를 종이에 적고 실행하세요.

cat과 stack 구분

cat에서는 연결할 축을 제외한 크기가 같아야 합니다. stack에서는 모든 입력 shape가 같아야 합니다. 오류가 나면 함수 이름보다 이 조건을 먼저 확인하세요.

3. reshape는 데이터를 늘리지 않는다

원소 12개는 (3,4), (4,3), (2,2,3)으로 바꿀 수 있습니다. -1은 전체 원소 수로부터 한 축의 크기를 계산하라는 뜻입니다. unsqueeze는 길이 1인 축을 추가하고 squeeze는 그런 축을 제거합니다.

reshape는 데이터를 늘리지 않는다

view를 쓰려면 데이터가 메모리에 배치된 방식이 조건에 맞아야 합니다. transpose 뒤에는 reshape를 쓰거나, contiguous()로 메모리를 연속적으로 정리한 뒤 view를 사용하세요. 원본과 독립된 데이터가 필요하면 clone을 명시합니다.

4. 어느 축을 줄였는가?

(4,3)에서 mean(dim=0)은 학생 축을 줄여 특징별 평균 세 개를 얻습니다. mean(dim=1)은 특징 축을 줄여 학생별 평균 네 개를 얻습니다. Matrix Multiplication(행렬곱)에서는 안쪽 차원이 맞는지 확인합니다.

어느 축을 줄였는가?

broadcasting은 오른쪽 축부터 크기를 맞추며, 각 축의 크기가 같거나 하나가 1일 때 적용됩니다. 연산이 성공했다는 사실만으로 의도한 계산이라고 단정하지 마세요.

학습 내용 확인

  1. 코드에 넣을 값은 무엇이며, 결과 배열의 각 행·열은 무엇을 뜻하나요? 물리량을 계산한다면 단위도 확인했나요?
  2. 조건을 하나 바꿨을 때 다시 실행해야 하는 부분을 찾을 수 있나요?
  3. 실행 결과가 예상과 맞나요? 다르다면 출력값이나 그래프를 보고 이유를 설명할 수 있나요?

PyTorch 공식 Tutorials

실습 자료