Tensor 연산
학습 목표
shape가 맞아도 의도한 연산이 아닐 수 있습니다. 축·행렬곱·Broadcasting을 출력의 의미와 연결합니다.
Batch와 특징의 축
시작 조건
첫 코드 셀의 X를 사용합니다. 행은 표본, 열은 특징입니다.
진행 방법
X의 Shape·dtype와X[1],X[:,2]의 의미를 기록하세요.torch.cat([X,X], dim=0)과torch.cat([X,X], dim=1),torch.stack([X,X], dim=0)과torch.stack([X,X], dim=1)의 Shape를 먼저 예상하세요.- 네 연산을 각각 실행하세요. 두 선택과 네 연산을 여섯 행에 적고, 예상 Shape·실제 Shape·축의 의미를 기록하세요. 새 축이 생기는 연산을 구분하세요.
남길 결과
- 두 선택과 네 연산의 비교 표.
import torch
X=torch.arange(12,dtype=torch.float32).reshape(3,4)
print(X,X.shape,torch.cat([X,X],dim=0).shape)
# TODO: 나머지 연결 연산의 예상·실제를 기록하세요.
결과 기록·자가 점검
연산:
예상 shape:
실제 shape:
축의 의미:
확인할 점
- cat과 stack을 단순히 같은 연결이라고 쓰지 않았는가?
- 값과 shape를 함께 확인했는가?
원소곱과 행렬곱
시작 조건
앞 활동과 같은 X에서 X*X, X.T@X, X@X.T를 계산합니다.
진행 방법
- 코드를 실행하기 전에 세 연산의 예상 Shape를 기록하세요. 실행한 뒤 ‘연산식·예상 Shape·실제 Shape’ 세 열로 대조하세요.
X.T@X의 (0,1) 원소를 손으로 계산하세요. 손계산 값과 실행 결과의 해당 원소를 나란히 적고 일치 여부를 기록하세요.Y=X+1로 두고X*Y,X.T@Y를 각각 계산해 결과 배열을 출력하세요. 두 행에 연산식과 실제 Shape를 기록해 두 곱을 구분하세요.
남길 결과
- 연산별 Shape 기록, 원소 하나의 손계산·실행 값,
Y를 사용한 두 연산의 출력.
print(X*X,X.T@X,X@X.T)
Y=X+1
# TODO: 선택 원소와 Y를 사용한 두 연산을 비교하세요.
결과 기록·자가 점검
연산:
결과 shape:
선택 원소의 직접 계산:
실제 값:
확인할 점
- 행렬곱과 원소곱의 연산 규칙을 구분했는가?
- Transpose 후의 축 의미를 설명했는가?
reshape와 Broadcast 오류 찾기
시작 조건
원소 수 12를 (2,6),(4,3),(2,2,3)으로 바꾸고, 벡터 [1,2,3,4]를 X에 더합니다.
진행 방법
- 지정한 세 shape로
X를 reshape하고numel()과flatten()결과를 원래X와 대조하세요. 원소 수와 순서가 유지되는지 기록하세요. X의 shape 를 유지하고[1,2,3,4]와[1,2,3]을 각각 더하세요. 성공한 출력 shape와 실패한 호출의 오류 메시지를 기록하세요.- 행마다 각각 1·2·3을 더하려면 세 원소를 어느 shape로 만들어야 하는지 먼저 적고, 그 shape로 바꾸어 덧셈을 실행하세요. 수정한 입력 shape와 결과 배열을 남기세요.
남길 결과
- 성공·오류·수정 사례 각 1개 이상.
for shape in [(2,6),(4,3),(2,2,3)]:print(shape,X.reshape(shape).shape)
# TODO: Broadcast 성공·오류·의도한 수정 사례를 기록하세요.
결과 기록·자가 점검
조작:
입력 shape:
출력·오류:
수정한 shape:
확인할 점
- 오류를 try/except로 기록해 뒤 셀까지 실행되게 했는가?
- 단순히 실행되는 shape와 원하는 축 의미가 같은지 확인했는가?