Tensor의 생성
0과 1로 초기화된 Tensor의 생성
- 0으로 초기화된 Tensor 생성
- 길이가 5인 1-D Tensor : a = torch.zeros(5)
- 크기가 2x3인 2-D Tensor : b = torch.zeros([2, 3])
- 크기가 3x2x4인 3-D Tensor : c = torch.zeros([3, 2, 4])
- 1으로 초기화된 Tensor 생성
- 길이가 3인 1-D Tensor : d = torch.ones(3)
- 크기가 3x2인 2-D Tensor : e = torch.ones([3, 2])
- 크기가 3x2x3인 3-D Tensor : f = torch.ones([3, 2, 3])
- 크기와 자료형이 같은 Tensor로 변환
- 0으로 초기화 : g = torch.zeros_like(e)
- 1로 초기화 : h = torch.ones_like(b)
난수로 초기화된 Tensor 생성
- [0, 1] 구간의 연속균등분포 난수 Tensor : torch.rand()
- 크기와 자료형이 같은 [0, 1] 구간의 연속균등분포 난수 Tensor : torch.rand_like()
- 표준정규분포 난수 Tensor : torch.randn()
- 크기와 자료형이 같은 표준정규분포 난수 Tensor : torch.randn_like()
지정된 범위 내에서 초기화된 Tensor 생성
- torch.arange(start=1, end=11, step=2) → [1, 3, 5, 6, 9]
- torch.arange(start=1, end=4, step=0.5) → [1., 1.5, 2., 2.5, 3., 3.5]
초기화되지 않은 Tensor 생성
- 초기화되지 않은 Tensor 생성 : q = torch.empty(5)
- 다른 데이터로 수정 : q.fill_(3.0) / fill_(q, 3.0)
초기화되지 않은 Tensor 생성 이유
✓ 성능 향상
Tensor를 생성하고 곧바로 다른 값들로 덮어쓸 예정인 경우라면, 초기 값을 설정하는 단계는 불필요한 자원을 소모하는 것임
✓ 메모리 사용 최적화
큰 Tensor를 다룰 때, 불필요한 초기화는 메모리 사용량을 증가시킴. 초기화되지 않은 Tensor를 사용함으로써 메모리 할당 후 즉시 필요한 계산에 사용하여 메모리 효율성을 높일 수 있음
|
list, Numpy 데이터로부터 Tensor 생성
- list_s = [1, 2, 3, 4, 5] → t = torch.tensor(list_s)
- numpy_u = np.array([[0, 1], [2, 3]]) → v = torch.from_numpy(numpy_u)
(cf. Tensor를 Numpy array로 변환 → v.numpy())
Tensor의 복제
- y = x.clone() → x와 계산 그래프에서 연결된 상태의 복제본이 생성
- z = x.detch() → x를 계산그래프에서 분리하여 새로운 Tensor z에 저장
CPU Tensor 생성
- 정수형 CPU Tensor 생성 : w = torch.IntTensor([1, 2, 3, 4, 5]) → [1, 2, 3, 4, 5]
- 실수형 CPU Tensor 생성 : x = torch.FloatTensor([1, 2, 3, 4, 5]) → [1., 2., 3., 4., 5.]
CUDA Tensor 생성과 변환
- CUDA 사용 가능 환경 확인 : torch.cuda.is_available()
- Tensor를 GPU에 할당 : torch.tensor([1, 2, 3, 4]).to(’cuda’) / torch.tensor([1, 2, 3, 4]).cuda()
- GPU에 할당된 Tensor를 CPU Tensor로 변환 : b.to(device=’cpu’) / b.cpu()
Tensor의 조작
Tensor의 인덱싱과 슬라이싱
- indexing이란 Tensor의 특정 위치의 요소에 접근하는 것을 의미한다.
- slicing이란 부분집합을 선택하여 새로운 Sub Tensor를 생성하는 과정을 의미한다.
Tensor의 모양 변경
- view() : Tensor의 메모리가 연속적으로 할당된 경우에 사용 가능
- 슬라이싱으로 Tensor를 조작했을 때, Sub Tensor를 생성하는 과정에서 contiguous 속성이 깨짐
- Tensor의 메모리가 연속적 또는 비연속적으로 할당되었는지 확인 : .is_contiguous()
- 연속적으로 할당되었다면 True
- 비연속적으로 할당되었다면 False
- f = torch.arange(12)
- g = f.view(4,3)
- h = f.view(3, 2, 2)
- flatten() : 데이터를 신경망 모델에 적합한 형태로 전처리하기 위해 많이 활용함
- 1-D Tensor로 평탄화 : i = torch.randn(3, 3) → j = torch.flatten(i) / j = i.flatten()
- 특정 차원 범위를 평탄화 (ex. k = torch.randn(3, 2, 2))
- 0번째 차원부터 마지막 차원까지 평탄화 : l = torch.flatten(k, 0) # (12, )
- 1번째 차원부터 마지막 차원까지 평탄화 : m = torch.flattend(k, 1) # (3, 4)
- 0번째 차원부터 1번째 차원까지 평탄화 : n = torch.flatten(k, 0, 1) # (6, 2)
- reshape() : view() 메서드와 달리 메모리가 연속적이지 않아도 사용 가능(cf. 성능 저하의 단점)
- transpose() : Tensor의 특정한 두 차원의 축을 서로 바꾸는 메서드
- 0차원과 1차원의 축 바꾸기 (q = torch.tensor([[0, 1, 2], [3, 4, 5]]))
- r = q.transpose(0, 1) : [[0, 3], [1, 4], [2, 5]]
- 1차원과 2차원의 축 바꾸기 (s = torch.tensor([[[0, 1], [2, 3]], [[4, 5], [6, 7]], [[8, 9], [10, 11]]]))
- t = s.transpose(1, 2) : [[[0, 2], [1, 3]], [[4, 6], [5, 7]], [[8, 10], [9, 11]]]
- 0차원과 1차원의 축 바꾸기 (q = torch.tensor([[0, 1, 2], [3, 4, 5]]))
- squeeze() : dim이 1인 특정 차원의 축소
- u = torch.randn(1, 3, 4)에서 dim이 1인 특정 차원을 축소 → v = torch.squeeze(u)
- w = torch.randn(1, 1, 4)에서 dim이 1인 특정 차원 모두를 축소 → x = torch.squeeze(w)
- w = torch.randn(1, 1, 4)에서 dim이 1인 특정 차원을 축소 → x = torch.squeeze(w, dim = 0)
- unsqueeze() : dim 1인 특정 차원의 확장
- y = torch.randn(3, 4)에서 0차원으로 dim이 1인 특정 차원을 확장
- z = torch.unsqueeze(y, dim = 0) → z.shape = (1, 3, 4)
- Tensor y에서 1차원으로 dim이 1인 특정 차원을 확장
- z = torch.unsqueeze(y, dim = 1) → z.shape = (3, 1, 4)
- Tensor y에서 2차원으로 dim이 1인 특정 차원을 확장
- z = torch.unsqueeze(y, dim = 2) → z.shape = (3, 4, 1)
- y = torch.randn(3, 4)에서 0차원으로 dim이 1인 특정 차원을 확장
- stack() : Tensor들 간 결합
- dim-0인 축을 생성하여 3개의 2D Tensor를 결합
- a = torch.stack((red_channel, green_channel, blue_channel))
- dim-1인 축을 생성하여 3개의 2D Tensor를 결합
- a = torch.stack((red_channel, green_channel, blue_channel), dim = 1)
- dim-2인 축을 생성하여 3개의 2D Tensor를 결합
- a = torch.stack((red_channel, green_channel, blue_channel), dim = 2)
- dim-0인 축을 생성하여 3개의 2D Tensor를 결합
view() 메서드는 Tensor의 메모리가 연속적으로 할당된 경우에 사용 가능하다고 했다. 하지만 아래의 경우에서 view() 메서드가 contiguous하지 않은 Tensor에도 작동하는 것을 보았다.
찾아보니, 원본 Tensor를 slicing하여 메모리가 contiguous하지 않아진 경우라도 갈라져 나온 element들의 메모리가 규칙적으로 할당되어 있는 경우라면 view를 사용할 수 있다고 한다.
'NAVER Boostcamp AI Tech > 주간학습정리' 카테고리의 다른 글
Day 5. 이진 분류(Binary Classification) (0) | 2024.08.25 |
---|---|
Day 4. 선형 회귀(Linear Regression) (0) | 2024.08.25 |
Day 3. Tensor 연산 및 심화 (0) | 2024.08.25 |
Day 1. PyTorch 기초 (0) | 2024.08.25 |