HAZEL

[ PyTorch 01. ] Basic, Operations, View, Slice and Index, Compile, AutoGrad 본문

DATA ANALYSIS/ML & DL

[ PyTorch 01. ] Basic, Operations, View, Slice and Index, Compile, AutoGrad

Rmsid01 2021. 4. 29. 12:50

01. PyTorch Basic

: 타입만 다를 뿐 numpy 와 유사하게 동작한다.

import numpy as np
import torch

 

1. 기본 arange

print(np.arange(9))   # [0 1 2 3 4 5 6 7 8]

print(torch.arange(9))  # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])

 

2. shape

# shape 를 알수 있음
nums = torch.arange(6)
nums.shape

 

3. type

type(nums)

 

4. numpy 로 변환

# 넘파이 변환이 가능함
nums.numpy()

 

5. reshape 

# numpy 와 유사하게 reshape 를 할 수 있음
nums.reshape(2,3)

6. rand

# 랜덤으로 3,3 텐서 만들어주기 
randoms = torch.rand((3,3))


# tensor([[0.0872, 0.9097, 0.4892],
#        [0.7905, 0.4164, 0.2248],
#        [0.4963, 0.1735, 0.3112]])

 

7. zeros 

# np.zeros((3,3)) 와 유사함 
zeros = torch.zeros((3,3))
torch.zeros_like(ones)

8. ones 

ones = torch.ones((3,3))

 

 

2. Operations

PyTorch로 수학 연산 -  넘파이처럼 브로드캐스트 가능함

nums = nums.reshape((2,5))
nums + nums 

# tensor([[ 0,  2,  4,  6,  8],
#        [10, 12, 14, 16, 18]])
torch.add(nums, 3)

# tensor([[ 3,  4,  5,  6,  7],
#        [ 8,  9, 10, 11, 12]])
# 넘파이로도 꺼내올 수 있음 
result = torch.add(nums, 3)
result.numpy()

 

3. View

 reshape 과 같은 기능이지만, View 보다는, reshape를 더 많이 사용함. 

range_nums = torch.arange(9).reshape(3,3)

tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
range_nums.view(-1)


tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])

 

 

4. Slice and Index

nums = torch.arange(9).reshape((3,3))

tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
nums[1]  # tensor([3, 4, 5])
nums[1,1]  #tensor(4)

# 슬라이스로 중간에 있는값을 가져옴
nums[1:, 1:]  # tensor([[4, 5], [7, 8]])

nums[1:] # tensor([[3, 4, 5], [6, 7, 8]])

 

5. Compile

arr = np.array([1,1,1])
arr_torch = torch.from_numpy(arr)  # numpy를 torch tensor 로 불러오기
arr_torch  # int 형으로 들어와 있는데 , 이것을 float 형으로 바꿀 수 있음

# float 로 형변환
arr_torch.float()

# device 설정 - cuda(gpu) 가 없다면 자동으로 cpu 로 넘어가게끔 하는 코드
# gpu 인지 신경쓰지말고 그냥 공홈에 나와있는 이 코드를 사용하면 된다고 함. 

device = "cuda" if torch.cuda.is_available() else 'cpu'
arr_torch.to(device)  # device로 컴파일 됬다고 생각하면 된다고 함. 

 

6. AutoGrad : 자동 미분 

: 기울기를 주어서 학습이 되도록 하는 것

: Tensor 의 모든 연산에 대해서 자동 미분을 제공한다. 

 

requires_grad 속성을 True로 설정하면, tensor에서 이뤄진 모든 연산들을 추적(track) 한다.

x = torch.ones(2,2, requires_grad = True)

y = x + 2

# tensor([[3., 3.],
#       [3., 3.]], grad_fn=<AddBackward0>)
z = y* y * 3
# tensor([[27., 27.],
#        [27., 27.]], grad_fn=<MulBackward0>) 
        
out = z.mean()
# tensor(27., grad_fn=<MeanBackward0>)

 

추적한 후, 계산이 완료되면 `backward()` 를 호출하여, 모든 기울기를 자동으로 계산할 수 있게 한다. 

이것이 .grad 속성에 누적된다. 

out.backward() # 역전파
print(x.grad) # 기울기 구하기 - 미분 d(out)/dx를 출력


# tensor([[4.5000, 4.5000],
#         [4.5000, 4.5000]])

 

기록을 추적하는 것을 중단하려면, `.detach()` 를 호출하여 연산기록으로부터 분리하여 이후 연산들의 추적을 방지할 수 있다.

 

`with torch.no_grad():` 코드로 감싸면 기울기를 구하지 않고, 배치노멀 이런걸 작동이 안된다. 트레인모드보다 빨라진다.

따라서 테스트할 땐 아래의 코드를 사용하면 된다.  즉, 연산 기록 추적을 멈출 수 있게 한다. 

with torch.no_grad():
    print((x**2).requires_grad) 

* 아래 문서를 참고하였습니다. 

tutorials.pytorch.kr/beginner/blitz/autograd_tutorial.html

패스트 캠퍼스 - 딥러닝/인공지능 올인원 패키지 Online