A A
[PyTorch] PyTorch Intro & Tensor (ํ…์„œ)
โš ๏ธ ๋ณธ ๋‚ด์šฉ์€ PyTorch Korea์˜ ๊ณต์‹ ๋ฌธ์„œ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ ์€๊ฒƒ์ด๋‹ˆ ์–‘ํ•ด๋ฐ”๋ž๋‹ˆ๋‹ค!
 

ํ…์„œ(Tensor)

ํŒŒ์ดํ† ์น˜(PyTorch) ๊ธฐ๋ณธ ์ตํžˆ๊ธฐ|| ๋น ๋ฅธ ์‹œ์ž‘|| ํ…์„œ(Tensor)|| Dataset๊ณผ Dataloader|| ๋ณ€ํ˜•(Transform)|| ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ ๊ตฌ์„ฑํ•˜๊ธฐ|| Autograd|| ์ตœ์ ํ™”(Optimization)|| ๋ชจ๋ธ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ํ…์„œ(tensor)๋Š” ๋ฐฐ์—ด(array)์ด

tutorials.pytorch.kr


PyTorch (ํŒŒ์ดํ† ์น˜)

PyTorch๋Š” Facebook's AI Research (FAIR) ํŒ€์— ์˜ํ•ด ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ ์†Œ์Šค ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค.
PyTorch๋Š” ๋น ๋ฅด๊ณ  ์œ ์—ฐํ•œ ํ”„๋กœํ† ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์—ฐ๊ตฌ ๋ฐ ์‚ฐ์—… ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

PyTorch์˜ ์ฃผ์š” ํŠน์ง•

  • ๋™์  ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„ (Dynamic Computation Graph): PyTorch๋Š” ๋™์  ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ์ •์˜ํ•˜๊ณ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ์—ฐ์‚ฐ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ง๊ด€์ ์ด๊ณ  ์œ ์—ฐํ•œ ๋ชจ๋ธ ์ •์˜ ๋ฐ ๋””๋ฒ„๊น…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ ๋ฏธ๋ถ„ (Autograd): PyTorch๋Š” ์ž๋™ ๋ฏธ๋ถ„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ์—ญ์ „ํŒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ๊ธฐ์šธ๊ธฐ ๊ณ„์‚ฐ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ•™์Šต ์‹œ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, torch.autograd ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • GPU ๊ฐ€์†: PyTorch๋Š” CUDA๋ฅผ ํ†ตํ•œ GPU ๊ฐ€์†์„ ์ง€์›ํ•˜์—ฌ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์™€ ๋ณต์žกํ•œ ๋ชจ๋ธ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์„œ๋ฅผ GPU๋กœ ์‰ฝ๊ฒŒ ์ด๋™ํ•˜๊ณ , GPU์—์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ์—ฐํ•œ ์‹ ๊ฒฝ๋ง ๋ชจ๋“ˆ: PyTorch๋Š” ์‹ ๊ฒฝ๋ง ๋ชจ๋“ˆ์„ ์‰ฝ๊ฒŒ ์ •์˜ํ•˜๊ณ  ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. torch.nn ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๋ ˆ์ด์–ด์™€ ์†์‹ค ํ•จ์ˆ˜ ๋“ฑ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„: PyTorch๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์„ ์œ„ํ•œ torchvision, ๋ถ„์‚ฐ ํ•™์Šต์„ ์œ„ํ•œ torch.distributed, ๊ฐ•ํ™” ํ•™์Šต์„ ์œ„ํ•œ TorchRL ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Tensor (ํ…์„œ)

  • PyTorch Tensor๋Š” PyTorch ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ, ์ˆ˜์น˜ ์—ฐ์‚ฐ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” Numpy์˜ ndarray์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, GPU๋ฅผ ํ™œ์šฉํ•œ ๊ณ ์† ์—ฐ์‚ฐ์„ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…์„œ(tensor)๋Š” ๋ฐฐ์—ด(array)์ด๋‚˜ ํ–‰๋ ฌ(matrix)๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ํŠน์ˆ˜ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • PyTorch์—์„œ๋Š” ํ…์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์˜ ์ž…๋ ฅ(input)๊ณผ ์ถœ๋ ฅ(output), ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ธ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋ถ€ํ˜ธํ™”(encode)ํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜๋Š” PyTorch Tensor์— ๋Œ€ํ•œ ์ฃผ์š” ๊ฐœ๋…๊ณผ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

PyTorch Tensor์˜ ์ฃผ์š” ํŠน์ง•

  1. Numpy์™€ ์œ ์‚ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค: PyTorch Tensor๋Š” Numpy ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ, ์ต์ˆ™ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Numpy์™€ ๋‹ฌ๋ฆฌ GPU ๊ฐ€์†์„ ํ†ตํ•ด ๋” ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์–‘ํ•œ ์ฐจ์› ์ง€์›: 1์ฐจ์› ๋ฒกํ„ฐ๋ถ€ํ„ฐ ๊ณ ์ฐจ์› ํ…์„œ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์ฐจ์›์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€, ๋น„๋””์˜ค, ์Œ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. GPU ๊ฐ€์† ์ง€์›: PyTorch Tensor๋Š” GPU(CUDA)๋ฅผ ํ™œ์šฉํ•œ ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜์—ฌ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์™€ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tensor.cuda() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์„œ๋ฅผ GPU๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ž๋™ ๋ฏธ๋ถ„(Autograd): PyTorch๋Š” ์ž๋™ ๋ฏธ๋ถ„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ•™์Šต ์‹œ ๊ธฐ์šธ๊ธฐ(Gradient)๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ญ์ „ํŒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  5. ๋‹ค์–‘ํ•œ ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•: PyTorch๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…์„œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“  ์š”์†Œ๊ฐ€ 0์ธ ํ…์„œ, 1์ธ ํ…์„œ, ๋žœ๋ค ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ํ…์„œ ๋“ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ํ…์„œ๋Š” GPU๋‚˜ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†๊ธฐ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๋ฉด Numpy ์˜ ndarray์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์ œ๋กœ ํ…์„œ์™€ NumPy ๋ฐฐ์—ด(array)์€ ์ข…์ข… ๋™์ผํ•œ ๋‚ด๋ถ€(underly) ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ…์„œ๋Š” ๋˜ํ•œ ์ž๋™ ๋ฏธ๋ถ„(automatic differentiation)์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ndarray์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด Tensor API๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
import torch
import numpy as np

Tensor (ํ…์„œ) ์ดˆ๊ธฐํ™”

Tensor๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ˆ์ œ๋“ค์„ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์ง์ ‘(directly) ์ƒ์„ฑํ•˜๊ธฐ

  • ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์ง์ ‘ ํ…์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ž๋ฃŒํ˜•(data type)์€ ์ž๋™์œผ๋กœ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.
# ๋‹ค์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ํ…์„œ ์ƒ์„ฑ
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)

NumPy ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ

  • ํ…์„œ๋Š” NumPy ๋ฐฐ์—ด๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
np_array = np.array(data)
x_np = torch.from_numpy(np_array)

๋‹ค๋ฅธ ํ…์„œ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ

  • ๋ช…์‹œ์ ์œผ๋กœ ์žฌ์ •์˜(override)ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํ…์„œ์˜ ์†์„ฑ(๋ชจ์–‘(shape), ์ž๋ฃŒํ˜•(datatype))์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
x_ones = torch.ones_like(x_data) # x_data์˜ ์†์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
print(f"Ones Tensor: \n {x_ones} \n")

x_rand = torch.rand_like(x_data, dtype=torch.float) # x_data์˜ ์†์„ฑ์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
print(f"Random Tensor: \n {x_rand} \n")
Ones Tensor: 
 tensor([[1, 1],
        [1, 1]]) 

Random Tensor: 
 tensor([[0.2622, 0.0260],
        [0.2886, 0.1260]])

๋ฌด์ž‘์œ„(random) ๋˜๋Š” ์ƒ์ˆ˜(constant) ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ

  • shape ์€ ํ…์„œ์˜ ์ฐจ์›(dimension)์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠœํ”Œ(tuple)๋กœ, ์•„๋ž˜ ํ•จ์ˆ˜๋“ค์—์„œ๋Š” ์ถœ๋ ฅ ํ…์„œ์˜ ์ฐจ์›์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
Random Tensor: 
 tensor([[0.8583, 0.1453, 0.4702],
        [0.7411, 0.6996, 0.9439]]) 

Ones Tensor: 
 tensor([[1., 1., 1.],
        [1., 1., 1.]]) 

Zeros Tensor: 
 tensor([[0., 0., 0.],
        [0., 0., 0.]])

Others

  • ํŠน์ • ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
# ๋ชจ๋“  ์š”์†Œ๊ฐ€ 0์ธ ํ…์„œ
zero_tensor = torch.zeros((3, 3))

# ๋ชจ๋“  ์š”์†Œ๊ฐ€ 1์ธ ํ…์„œ
one_tensor = torch.ones((2, 2))

# ์ฃผ์–ด์ง„ ๊ฐ’์œผ๋กœ ํ…์„œ ์ดˆ๊ธฐํ™”
full_tensor = torch.full((2, 3), 7)

print(zero_tensor)
print(one_tensor)
print(full_tensor)
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
tensor([[1., 1.],
        [1., 1.]])
tensor([[7, 7, 7],
        [7, 7, 7]])
  • ๋ฒ”์œ„ ๊ฐ’์„ ๊ฐ–๋Š” ํ…์„œ ์ƒ์„ฑ
# ์—ฐ์†์ ์ธ ๊ฐ’์œผ๋กœ ํ…์„œ ์ƒ์„ฑ
arange_tensor = torch.arange(0, 10, step=2)

# ๊ท ๋“ฑ ๊ฐ„๊ฒฉ์œผ๋กœ ๋‚˜๋‰œ ๊ฐ’์„ ๊ฐ–๋Š” ํ…์„œ ์ƒ์„ฑ
linspace_tensor = torch.linspace(0, 1, steps=5)

print(arange_tensor)
print(linspace_tensor)
tensor([0, 2, 4, 6, 8])
tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])
  • ๊ธฐ์กด ํ…์„œ์˜ ํฌ๊ธฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ํ…์„œ ์ƒ์„ฑ
# ๊ธฐ์กด ํ…์„œ์˜ ํฌ๊ธฐ๋ฅผ ๋”ฐ๋ฅด๋Š” 0์œผ๋กœ ์ฑ„์›Œ์ง„ ํ…์„œ ์ƒ์„ฑ
existing_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
zeros_like_tensor = torch.zeros_like(existing_tensor)

# ๊ธฐ์กด ํ…์„œ์˜ ํฌ๊ธฐ๋ฅผ ๋”ฐ๋ฅด๋Š” 1์œผ๋กœ ์ฑ„์›Œ์ง„ ํ…์„œ ์ƒ์„ฑ
ones_like_tensor = torch.ones_like(existing_tensor)

print(zeros_like_tensor)
print(ones_like_tensor)
tensor([[0, 0, 0],
        [0, 0, 0]])
tensor([[1, 1, 1],
        [1, 1, 1]])

ํ…์„œ์˜ ์†์„ฑ(Attribute)

  • ํ…์„œ์˜ ์†์„ฑ์€ ํ…์„œ์˜ ๋ชจ์–‘(shape), ์ž๋ฃŒํ˜•(datatype) ๋ฐ ์–ด๋Š ์žฅ์น˜์— ์ €์žฅ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํ…์„œ์˜ ๋ชจ์–‘ (Shape)

  • ํ…์„œ์˜ ๋ชจ์–‘์€ ํ…์„œ์˜ ๊ฐ ์ฐจ์›์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
import torch

# 3x2 ํ…์„œ ์ƒ์„ฑ
tensor = torch.tensor([[1, 2], [3, 4], [5, 6]])

# ํ…์„œ์˜ ๋ชจ์–‘ ์ถœ๋ ฅ
print(tensor.shape)  # Output: torch.Size([3, 2])

์ž๋ฃŒํ˜• (Datatype)

  • ํ…์„œ์˜ ์ž๋ฃŒํ˜•์€ ํ…์„œ์˜ ์š”์†Œ๋“ค์ด ์–ด๋–ค ๋ฐ์ดํ„ฐ ํƒ€์ž…์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
# ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์€ float
float_tensor = torch.tensor([1.0, 2.0, 3.0])
print(float_tensor.dtype)  # Output: torch.float32

# ์ •์ˆ˜ํ˜• ํ…์„œ ์ƒ์„ฑ
int_tensor = torch.tensor([1, 2, 3], dtype=torch.int32)
print(int_tensor.dtype)  # Output: torch.int32

# ๋ถ€์šธํ˜• ํ…์„œ ์ƒ์„ฑ
bool_tensor = torch.tensor([True, False, True], dtype=torch.bool)
print(bool_tensor.dtype)  # Output: torch.bool

์žฅ์น˜ (Device)

  • ํ…์„œ์˜ ์žฅ์น˜๋Š” ํ…์„œ๊ฐ€ ์ €์žฅ๋˜๊ณ  ์—ฐ์‚ฐ๋˜๋Š” ํ•˜๋“œ์›จ์–ด ์žฅ์น˜(CPU ๋˜๋Š” GPU)๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
# CPU์— ํ…์„œ ์ƒ์„ฑ
cpu_tensor = torch.tensor([1, 2, 3])
print(cpu_tensor.device)  # Output: cpu

# GPU๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
if torch.cuda.is_available():
    # GPU์— ํ…์„œ ์ƒ์„ฑ
    gpu_tensor = torch.tensor([1, 2, 3], device='cuda')
    print(gpu_tensor.device)  # Output: cuda:0

Total Example

# ํ…์„œ ์ƒ์„ฑ
tensor = torch.tensor([[1.0, 2.0], [3.0, 4.0]], dtype=torch.float64, device='cpu')

# ํ…์„œ ์†์„ฑ ์ถœ๋ ฅ
print("Shape:", tensor.shape)        # Output: Shape: torch.Size([2, 2])
print("Datatype:", tensor.dtype)     # Output: Datatype: torch.float64
print("Device:", tensor.device)      # Output: Device: cpu

# GPU๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
if torch.cuda.is_available():
    # GPU๋กœ ํ…์„œ ์ด๋™
    tensor = tensor.to('cuda')
    print("Device after moving to GPU:", tensor.device)  # Output: Device after moving to GPU: cuda:0
Shape: torch.Size([2, 2])
Datatype: torch.float64
Device: cpu

Tensor ์—ฐ์‚ฐ (Operation)

  • ์ „์น˜(transposing), ์ธ๋ฑ์‹ฑ(indexing), ์Šฌ๋ผ์ด์‹ฑ(slicing), ์ˆ˜ํ•™ ๊ณ„์‚ฐ, ์„ ํ˜• ๋Œ€์ˆ˜, ์ž„์˜ ์ƒ˜ํ”Œ๋ง(random sampling) ๋“ฑ, 100๊ฐ€์ง€ ์ด์ƒ์˜ ํ…์„œ ์—ฐ์‚ฐ๋“ค์„ ์•„๋ž˜ ๋งํฌ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 

torch — PyTorch 2.4 documentation

Shortcuts

pytorch.org

  • ๊ฐ ์—ฐ์‚ฐ๋“ค์€ (์ผ๋ฐ˜์ ์œผ๋กœ CPU๋ณด๋‹ค ๋น ๋ฅธ) GPU์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Colab์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, Edit > Notebook Settings ์—์„œ GPU๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์„œ๋Š” CPU์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • .to ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด (GPU์˜ ๊ฐ€์šฉ์„ฑ(availability)์„ ํ™•์ธํ•œ ๋’ค) GPU๋กœ ํ…์„œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์น˜๋“ค ๊ฐ„์— ํฐ ํ…์„œ๋“ค์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ๋น„์šฉ์ด ๋งŽ์ด๋“ ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
# GPU๊ฐ€ ์กด์žฌํ•˜๋ฉด ํ…์„œ๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค
if torch.cuda.is_available():
    tensor = tensor.to("cuda")

NumPy์‹์˜ ํ‘œ์ค€ ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ

tensor = torch.ones(4, 4)
print(f"First row: {tensor[0]}")
print(f"First column: {tensor[:, 0]}")
print(f"Last column: {tensor[..., -1]}")
tensor[:,1] = 0
print(tensor)
First row: tensor([1., 1., 1., 1.])
First column: tensor([1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])
  • ํ…์„œ ํ•ฉ์น˜๊ธฐ: torch.cat ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ์ฐจ์›์— ๋”ฐ๋ผ ์ผ๋ จ์˜ ํ…์„œ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])

์‚ฐ์ˆ  ์—ฐ์‚ฐ(Arithmetic operations)

# ๋‘ ํ…์„œ ๊ฐ„์˜ ํ–‰๋ ฌ ๊ณฑ(matrix multiplication)์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. y1, y2, y3์€ ๋ชจ๋‘ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
# ``tensor.T`` ๋Š” ํ…์„œ์˜ ์ „์น˜(transpose)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)

y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)


# ์š”์†Œ๋ณ„ ๊ณฑ(element-wise product)์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. z1, z2, z3๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
z1 = tensor * tensor
z2 = tensor.mul(tensor)

z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)
tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])
  • ๋‹จ์ผ-์š”์†Œ(single-element) ํ…์„œ: ํ…์„œ์˜ ๋ชจ๋“  ๊ฐ’์„ ํ•˜๋‚˜๋กœ ์ง‘๊ณ„(aggregate)ํ•˜์—ฌ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์ธ ํ…์„œ์˜ ๊ฒฝ์šฐ, item() ์„ ์‚ฌ์šฉํ•˜์—ฌ Python ์ˆซ์ž ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))

# 12.0 <class 'float'>
  • ๋ฐ”๊ฟ”์น˜๊ธฐ(in-place) ์—ฐ์‚ฐ: ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ํ”ผ์—ฐ์‚ฐ์ž(operand)์— ์ €์žฅํ•˜๋Š” ์—ฐ์‚ฐ์„ ๋ฐ”๊ฟ”์น˜๊ธฐ ์—ฐ์‚ฐ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, _ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: x.copy_(y) ๋‚˜ x.t_() ๋Š” x ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
print(f"{tensor} \n")
tensor.add_(5)
print(tensor)
tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]]) 

tensor([[6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.]])

Numpy ๋ณ€ํ™˜ (Bridge)

CPU ์ƒ์˜ ํ…์„œ์™€ NumPy ๋ฐฐ์—ด์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ํ•˜๋‚˜๋„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

ํ…์„œ๋ฅผ NumPy ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
t: tensor([1., 1., 1., 1., 1.])
n: [1. 1. 1. 1. 1.]
  • ํ…์„œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด NumPy ๋ฐฐ์—ด์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
t.add_(1)
print(f"t: {t}")
print(f"n: {n}")
t: tensor([2., 2., 2., 2., 2.])
n: [2. 2. 2. 2. 2.]

NumPy ๋ฐฐ์—ด์„ ํ…์„œ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

n = np.ones(5)
t = torch.from_numpy(n)
  • NumPy ๋ฐฐ์—ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ…์„œ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")
t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n: [2. 2. 2. 2. 2.]