본문 바로가기
컴퓨터

[pytorch] 파이토치 튜토리얼 1

by skyjwoo 2020. 2. 3.
728x90
반응형

pytorch 홈페이지에 튜토리얼을 제공하고 있길래 한번 진행해 보았다. 

https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py

 

What is PyTorch? — PyTorch Tutorials 1.4.0 documentation

Note Click here to download the full example code What is PyTorch? It’s a Python-based scientific computing package targeted at two sets of audiences: A replacement for NumPy to use the power of GPUs a deep learning research platform that provides maximum

pytorch.org

첫번째 내용은 tensor와 덧셈연산, numpy 연동, cuda에서 tensor 생성에 대해 다룬다.

 

 

 

 

 

 

 

 

Pytorch tutorial 1

In [37]:
from __future__ import print_function #future가 뭐지? https://docs.python.org/3/reference/simple_stmts.html#future
import torch
 

tensors, 텐서

In [38]:
# Tensor: numpy의 ndarray와 비슷하다.
x = torch.empty(5, 3)
print(x)
 
tensor([[9.2755e-39, 1.0561e-38, 8.1735e-39],
        [7.9898e-39, 4.2246e-39, 1.0286e-38],
        [1.0653e-38, 1.0194e-38, 8.4490e-39],
        [1.0469e-38, 9.3674e-39, 9.9184e-39],
        [8.7245e-39, 9.2755e-39, 8.9082e-39]])
In [39]:
#초기화된 값(random하게)
x = torch.rand(5, 3)
print(x)
 
tensor([[0.5727, 0.9304, 0.5839],
        [0.8587, 0.8554, 0.3834],
        [0.1824, 0.8313, 0.6214],
        [0.0142, 0.3319, 0.9920],
        [0.3406, 0.9266, 0.7336]])
In [40]:
#0으로 초기화
x = torch.zeros(5, 3, dtype=torch.long)
print(x)
print(x.dtype)
 
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
torch.int64
In [41]:
#직접 값 입력하기
x = torch.tensor([5.5, 3])
print(x)
 
tensor([5.5000, 3.0000])
In [42]:
x = x.new_ones(5, 3, dtype=torch.double)      # new_* methods는 크기 입력을 받는다. 
print(x)

x = torch.randn_like(x, dtype=torch.float)    # type 오버라이딩도 가능, 기존의 1이 입력된 x에 임의의 값으로 덮어 쓴다. 
print(x)         
 
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
tensor([[-0.1490, -0.7520, -1.8902],
        [ 0.2256, -0.1183,  0.3363],
        [-1.9171, -1.4326,  0.3849],
        [ 0.2223,  0.8722, -1.8860],
        [ 0.3801, -1.0309,  0.3910]])
In [43]:
#size 역시 같다. torch.size의 경우 tuple 자료형처럼 적용된다. 
print(x.size())
 
torch.Size([5, 3])
 

operation, 연산

In [44]:
print(x.size(), y.size()) #size 같아야 연산 가능
y = torch.rand(5, 3)

#더하기에는 2가지 방법이 있다. 
print(x + y) #1

print(torch.add(x, y)) #2
 
torch.Size([5, 3]) torch.Size([16])
tensor([[ 0.4468, -0.1817, -1.7446],
        [ 0.7823,  0.6452,  1.1184],
        [-1.3973, -1.0352,  0.7035],
        [ 0.4703,  1.3143, -1.2564],
        [ 1.2479, -0.5109,  0.8679]])
tensor([[ 0.4468, -0.1817, -1.7446],
        [ 0.7823,  0.6452,  1.1184],
        [-1.3973, -1.0352,  0.7035],
        [ 0.4703,  1.3143, -1.2564],
        [ 1.2479, -0.5109,  0.8679]])
In [45]:
#더한 값을 특정 변수에 넣기
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
 
tensor([[ 0.4468, -0.1817, -1.7446],
        [ 0.7823,  0.6452,  1.1184],
        [-1.3973, -1.0352,  0.7035],
        [ 0.4703,  1.3143, -1.2564],
        [ 1.2479, -0.5109,  0.8679]])
In [46]:
# adds x to y, 값을 삽입, 변수 y에 x+y을 넣는다. y = y+x
y.add_(x)
print(y)
 
tensor([[ 0.4468, -0.1817, -1.7446],
        [ 0.7823,  0.6452,  1.1184],
        [-1.3973, -1.0352,  0.7035],
        [ 0.4703,  1.3143, -1.2564],
        [ 1.2479, -0.5109,  0.8679]])
In [47]:
#tensor변수의 값을 바꾸게되는 연산들은 뒤에 '_'가 붙는다. For example: x.copy_(y), x.t_(), will change x.
In [48]:
#numpy처럼 slicing가능
print(x[:, 1])
 
tensor([-0.7520, -0.1183, -1.4326,  0.8722, -1.0309])
In [49]:
#tensor의 size를 변경하기
x = torch.randn(4, 4) #4*4=2*8=16*1
y = x.view(16) #4*4 -> 16*1
z = x.view(-1, 8)  # -1은 나머지 값들로부터 유추된다. 여기서는 2가 된다. 
print(x.size(), y.size(), z.size())
 
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
In [50]:
#tensor의 원소가 하나뿐이라면 하나의 값으로 받을 수 있다(array형태가 아닌). 
x = torch.randn(1)
print(x)
print(x.item())
 
tensor([0.2389])
0.238921120762825
In [51]:
# tensor 연산 모음집: https://pytorch.org/docs/stable/torch.html
 

NumPy Bridge

In [54]:
# torch의 tensor와 numpy의 array는 (tensor가 cpu에서 돌아갈 경우) 같은 메모리를 공유한다. 따라서 서로 변환이 매우 쉽다. 
In [55]:
#torch -> numpy로 변환, 
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
 
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
In [56]:
# a: torch, b: numpy, a에만 더했는데, b도 변함, 같은 메모리를 공유하기 때문에!!
a.add_(1)
print(a)
print(b)
 
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
In [57]:
#numpy를 torch로 변환
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
#모든 cpu에서 돌아가는 tensor(charTensor제외)는 numpy로 변환 또는 그 역변환이 가능하다. 
 
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
In [60]:
# CUDA가 가능한 경우에만 사용
# ``torch.device``객체를 이용해 GPU에서(로) tensor를 이동시킬 수 있다. 
if torch.cuda.is_available():
    print('available!')
    device = torch.device("cuda")          # CUDA device 객체 받기
    y = torch.ones_like(x, device=device)  # GPU에서 tensor 생성
    x = x.to(device)                       # tensor를 GPU로 보내서 생성``.to("cuda")``
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` method는 dtype도 바꿀 수 있다. 
else:
    not print('not available')
 
not available
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
728x90
반응형

댓글