DL in Python/Pytorch 기초

[Pytorch 기초 - 1] Pytorch의 가장 기본적인 함수들

SuHawn 2020. 9. 1. 18:28

 

 

 

 

PyTorch Basic

PyTorch 기초 사용법

In [1]:
import numpy as np

import torch
In [2]:
torch.__version__
Out[2]:
'1.6.0'
In [3]:
nums = torch.arange(9)
nums
Out[3]:
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])
In [4]:
nums.shape
Out[4]:
torch.Size([9])
In [5]:
type(nums)
Out[5]:
torch.Tensor
In [6]:
nums.numpy()
Out[6]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int64)
In [7]:
nums.reshape(3,3)
Out[7]:
tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
In [9]:
randoms = torch.rand((3,3))
randoms
Out[9]:
tensor([[0.6835, 0.6693, 0.4525],
        [0.5450, 0.4758, 0.3792],
        [0.4692, 0.0504, 0.2349]])
In [10]:
zeros = torch.zeros((3,3))
zeros
Out[10]:
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
In [11]:
ones = torch.ones((3,3))
ones
Out[11]:
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
In [12]:
torch.zeros_like(ones)
Out[12]:
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
In [13]:
zeros.size()
Out[13]:
torch.Size([3, 3])
 

Operations

 

PyTorch로 수학연산

In [14]:
nums * 3
Out[14]:
tensor([ 0,  3,  6,  9, 12, 15, 18, 21, 24])
In [15]:
nums = nums.reshape((3,3))
In [16]:
nums + nums
Out[16]:
tensor([[ 0,  2,  4],
        [ 6,  8, 10],
        [12, 14, 16]])
In [18]:
result = torch.add(nums, 3)
In [19]:
result.numpy()
Out[19]:
array([[ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]], dtype=int64)
 

View : reshape과 동일하게 작용

In [20]:
range_nums = torch.arange(9).reshape(3,3)
In [21]:
range_nums
Out[21]:
tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
In [22]:
range_nums.view(-1)
Out[22]:
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])
In [23]:
range_nums.view(1,9)
Out[23]:
tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]])
 

Slice and Index

In [46]:
nums
Out[46]:
tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
In [47]:
nums[1]
Out[47]:
tensor([3, 4, 5])
In [48]:
nums[1,1]
Out[48]:
tensor(4)
In [49]:
nums[1:,1:]
Out[49]:
tensor([[4, 5],
        [7, 8]])
In [50]:
nums[1:]
Out[50]:
tensor([[3, 4, 5],
        [6, 7, 8]])
 

Compile

 

numpy를 torch tensor로 불러오기

In [51]:
arr = np.array([1,1,1])
In [52]:
arr_torch = torch.from_numpy(arr)
In [53]:
arr_torch.float()
Out[53]:
tensor([1., 1., 1.])
In [54]:
# gpu cuda 설정 가능, 없으면 cpu사용
device = 'cuda' if torch.cuda.is_available() else 'cpu'
In [55]:
arr_torch.to(device)
Out[55]:
tensor([1, 1, 1], dtype=torch.int32)
In [56]:
device  # 제 노트북에는 gpu가 없습니다.
Out[56]:
'cpu'
 

AutoGrad : 기울기를 주어 학습의 변화가 생기게 하는 함수

In [57]:
x = torch.ones(2,2, requires_grad = True)
x
Out[57]:
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
In [58]:
y = x + 2
y
Out[58]:
tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)
In [59]:
print(y.grad_fn)
 
<AddBackward0 object at 0x00000261C3211A88>
In [60]:
z = y * y * 3
out = z.mean()
In [61]:
print(z, out)
 
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
In [62]:
out.backward()  # back propagation
In [64]:
print(x.grad)   # 기울기
 
tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])
In [70]:
# 학습모드
# 기울기를 구함.
print(x.requires_grad)
print((x**2).requires_grad)
 
True
True
In [71]:
# test모드
with torch.no_grad(): # batch normalization / dropout 같은 것들이 작동을 하지 않게 됨. 
    print((x**2).requires_grad)
 
False