728x90

1. 텐서 다루기

1.1 텐서 생성 및 변환

텐서는 파이토치의 가장 기본의 되는 데이터 구조이다. 넘파이의 ndarray와 비슷하며 GPU에서의 연산도 가능하다.

텐서 생성은 다음과 같은 코드를 이용한다.

print(torch.tensor([[1, 2], [3, 4]])) # 2차원 형태의 텐서 생성
print('=======================')
print(torch.tensor([[1, 2], [3, 4]], device='cuda:0')) # GPU에 텐서 생성
print('=======================')
print(torch.tensor([[1, 2], [3, 4]], dtype=torch.float64)) # dtype을 이용하여 텐서 생성
tensor([[1, 2],
        [3, 4]])
=======================
tensor([[1, 2],
        [3, 4]], device='cuda:0')
=======================
tensor([[1., 2.],
        [3., 4.]], dtype=torch.float64)

텐서를 ndarray로 변환해보자.

temp = torch.tensor([[1, 2], [3, 4]])
temp.numpy() # 텐서를 ndarray로 변환

temp = torch.tensor([[1, 2], [3, 4]], device='cuda:0')
temp.to('cpu').numpy() # gpu상의 텐서를 cpu텐서로 변환한 후 ndarray로 변환
array([[1, 2],
       [3, 4]])
       
array([[1, 2],
       [3, 4]])

 

1.2 텐서의 인덱스 조작

텐서는 넘파이의 ndarray를 조작하는 것과 유사하게 동작하기 때문에 배열처럼 인덱스를 바로 지정하거나 슬라이스 등을 사용할 수 있다.

temp = torch.FloatTensor([1, 2, 3, 4, 5, 6, 7])
print(temp[0], temp[1]) # 인덱스로 접근
print(temp[0:3]) # 슬라이스로 접근
tensor(1.) tensor(2.)
tensor([1., 2., 3.])

 

1.3 텐서 차원 조작

텐서는 넘파이의 ndarray처럼 다양한 수학 연산이 가능하며, GPU를 사용하면 더 빠르게 연산할 수 있따. 참고로 텐서 간의 타입이 다르면 연산이 불가능하다.

텐서의 차원을 변경하는 가장 대표적인 방법은 view를 이용하는 것이다(하지만 reshape을 더 권장한다고 한다. 나도 reshape이 더 익숙하기도 하고). 이외에도 텐서를 결합하는 stack, cat과 차원을 교환하는 t, transpose도 사용된다. 

temp = torch.tensor([[1, 2], [3, 4]])
print(temp.shape)
print('=======================')
print(temp.view(4, 1)) # 2x2 행렬을 4x1 행렬로 변형
print('=======================')
print(temp.view(-1)) # 2x2 행렬을 1차원 벡터로 변형
print('=======================')
print(temp.view(1, -1)) # 2x2 행렬을 1x4 행렬로 변형
print('=======================')
torch.Size([2, 2])
=======================
tensor([[1],
        [2],
        [3],
        [4]])
=======================
tensor([1, 2, 3, 4])
=======================
tensor([[1, 2, 3, 4]])
=======================
tensor([[1],
        [2],
        [3],
        [4]])

 

 

728x90

'딥러닝 > Pytorch' 카테고리의 다른 글

Pytorch 기본 문법 - 모델 훈련  (0) 2022.05.23
Pytorch 기본 문법 - 파라미터 정의  (0) 2022.05.23
Pytorch 기본 문법 - 모델 정의  (0) 2022.05.23
Pytorch 기본 문법 - 데이터 준비  (1) 2022.05.18
Pytorch 개요  (0) 2022.05.18
728x90

파이토치를 공부하기 전에 파이토치 개요에 대해 알아보고자 한다.

 

파이토치 공식 튜토리얼에서는 파이토치를 다음과 같이 언급하고 있다.

  • 넘파이를 대체하면서 GPU를 이용한 연산이 필요한 경우
  • 최대한의 유연성과 속도를 제공하는 딥러닝 연구 플랫폼이 필요한 경우

하지만 무엇보다 주목받는 이유는 간결하고 빠른 구현성에 있다고 한다. 사실 위의 이유는 와닿지는 않고 최근 논문들의 코드가 대부분 파이토치로 구현되어 있기 때문에 공부의 필요성을 느꼈다.

 

1. 파이토치 특징 및 장점

한마디로 말하면 GPU에서 텐서 조작 및 동적 신경망 구축이 가능한 프레임워크이다.

여기서 말하는 동적 신경망이란 훈련을 반복할 때마다 네트워크 변경이 가능한 신경망을 의미한다고 한다. 연산 그래프를 정의하는 것과 동시에 값도 초기화되는 'Define by Run' 방식을 사용하기 때문에 연산 그래프와 연산을 분리해서 생각할 필요가 없고 때문에 코드를 이해하기 쉽다.

텐서플로우와 파이토치의 차이 (출처 - https://www.popit.kr/딥러닝-프레임워크-조사와-몇가지-홍보/)

 

2. 파이토치의 아키텍쳐

파이토치의 아키텍처는 간단하다. 크게 세 개의 계층으로 나누어있다고 한다. 가장 상위 계층은 파이토치 API가 위치해 있으며 그 아래는 파이토치 엔진이 있다. 파이토치 엔진에서는 다차원 텐서 및 자동 미분을 처리한다. 그리고 마지막으로 가장 아래에는 텐서에 대한 연산을 처리한다.

파이토치 아키텍처 (출처-딥러닝 파이토치 교과서)

3. 텐서를 메모리에 저장하기

텐서는 1차원이든 N차원이든 메모리에 저장할 때는 1차원 배열 형태가 된다. 즉, 1차원 배열 형태여야만 메모리에 저장할 수 있다.

그리고 변환된 1차원 배열을 스토리지라고 한다. 스토리지를 이해하기 위해서는 오프셋과 스트라이드 개념을 알아야 한다고 한다.

  • 오프셋(offset) : 텐서에서 첫 번째 요소가 스토리지에 저장된 인덱스
  • 스트라이드(stride) : 각 차원에 따라 다음 요소를 얻기 위해 건너뛰기가 필요한 스토리지의 요소 개수이다. 즉, 스트라이드는 메모리에서의 텐서 레이아웃을 표현하는 것으로 이해하면 된다. 요소가 연속적으로 저장되기 때문에 행 준심으로 스트라이드는 항상 1이다.

 

728x90
728x90

많은 고민 끝에 티스토리를 통해 블로그를 쓰기로 했다.

 

깃허브 블로그를 도전했지만 너무 복잡하고 글쓰기보다 테마 꾸미기에 시간이 더 뺏기는 느낌....

 

얼마나 자주 쓸지는 모르겠지만 최대한 열심히 써보자...!

728x90

'기타' 카테고리의 다른 글

블로그 이사합니다!  (0) 2023.03.01

+ Recent posts