Tensor
numpy에 ndarray가 있다면, PyTorch에는 Tensor가 있다.
이 외에도 대부분의 numpy에서 사용법과 비슷하게 pytorch에서 적용된다.
torch.tensor vs torch.Tensor
torch.Tensor
- 클래스 (Class)
- int 입력시 float로 변환
- torch 데이터 입력시 입력 받은 데이터의 메모리 공간을 그대로 사용 (얕은 복사; shallow copy와 비슷)
- list, numpy 데이터 입력 시 입력 받은 데이터를 복사하여 생성 (깊은복사; deep copy와 비슷)
torch.tensor
- 함수 (Function)
- 항상 data를 복사
- int 입력시 int 그대로 입력
- 입력 받은 데이터를 새로운 메모리 공간으로 복사하여 생성
차원
CV분야에서의 3D Tensor의 경우에는 (배치 사이즈, 이미지의 높이, 이미지의 너비)
를 의미한다.
이미지가 흑백인 경우에는 이러한 3D Tensor로 가능하지만, 컬러인 경우에는 Channel 차원이 추가되어 (배치 사이즈, 채널의 수, 이미지의 높이, 이미지의 너비)
인 4D Tensor로 사용된다.
* 이때 컬러의 채널 수는 R, G, B로 3이다. 즉, (배치 사이즈, 3, 이미지의 높이, 이미지의 너비)
로 사용된다.
unsqeeze()와 sqeeze()
sqeeze
- 차원이 1인 차원을 제거
- 따로 차원을 설정하지 않으면 1인 차원을 모두 제거
- dim 지정 선택
unsqeeze
- 1인 차원을 생성
- 어느 차원에 1인 차원을 생성할 지 지정
- dim 지정 필수
view VS reshape
- tensor의 shape을 바꾸는데 사용
- view는 copy를 하여 데이터값들을 가져온 것이 아닌, 데이터의 shape만 다르게 보이도록 해주는 것. (view 이후에 기존 데이터 값을 변경하면, view가 적용된 데이터 값도 변경됨)
cat VS stack
- cat은 주어진 차원을 기준으로 주어진 텐서들을 붙임 (차원이 깊어지고, 차원의 수는 유지)
- stack은 새로운 차원으로 주어진 텐서들을 붙임 (차원이 확장되고, 기존 차원들의 깊이는 유지)
- e.g. (3, 4)의 shape을 갖는 2개의 텐서 A와 B를 붙이는 경우, torch.cat([A, B], dim=0)의 결과는 (6, 4)의 shape을 갖고, torch.stack([A, B], dim=0)의 결과는 (2, 3, 4)의 shape을 갖는다.
dot VS mm VS matmul
- dot은 벡터의 내적연산
- mm은 행렬 곱 연산 (matmul도 동일)
- mm과 다르게 matmul은 자동 broadcasting 지원하여 계산
* 어떤 조건을 만족했을 때 연산이 가능해지도록 배열을 자동 변환
참고 사이트
https://stackoverflow.com/questions/54307225/whats-the-difference-between-torch-stack-and-torch-cat