Skip to content

Commit

Permalink
beginner_source/nn_tutorial.py fix typo (#852)
Browse files Browse the repository at this point in the history
fix typo
  • Loading branch information
Angela-Park-JE authored Sep 1, 2024
1 parent 0a68544 commit e314a4a
Showing 1 changed file with 31 additions and 31 deletions.
62 changes: 31 additions & 31 deletions beginner_source/nn_tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@

###############################################################################
# 이 νŠœν† λ¦¬μ–Όμ„ μŠ€ν¬λ¦½νŠΈκ°€ μ•„λ‹Œ λ…ΈνŠΈλΆμœΌλ‘œ μ‹€ν–‰ν•˜κΈ°λ₯Ό ꢌμž₯ν•©λ‹ˆλ‹€. λ…ΈνŠΈλΆ (``.ipynb``) νŒŒμΌμ„ λ‹€μš΄ λ°›μœΌμ‹œλ €λ©΄,
# νŽ˜μ΄μ§€ 상단에 μžˆλŠ” 링크λ₯Ό ν΄λ¦­ν•΄μ£Όμ„Έμš”.
# νŽ˜μ΄μ§€ 상단에 μžˆλŠ” 링크λ₯Ό 클릭해 μ£Όμ„Έμš”.
#
# PyTorch λŠ” μ—¬λŸ¬λΆ„μ΄ 신경망(neural network)λ₯Ό μƒμ„±ν•˜κ³  ν•™μŠ΅μ‹œν‚€λŠ” 것을 도와주기 μœ„ν•΄μ„œ
# PyTorchλŠ” μ—¬λŸ¬λΆ„μ΄ 신경망(neural network)λ₯Ό μƒμ„±ν•˜κ³  ν•™μŠ΅μ‹œν‚€λŠ” 것을 도와주기 μœ„ν•΄μ„œ
# `torch.nn <https://pytorch.org/docs/stable/nn.html>`_ ,
# `torch.optim <https://pytorch.org/docs/stable/optim.html>`_ ,
# `Dataset <https://pytorch.org/docs/stable/data.html?highlight=dataset#torch.utils.data.Dataset>`_ ,
# 그리고 `DataLoader <https://pytorch.org/docs/stable/data.html?highlight=dataloader#torch.utils.data.DataLoader>`_
# 와 같은 잘 λ””μžμΈλœ λͺ¨λ“ˆκ³Ό ν΄λž˜μŠ€λ“€μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
# μ΄λ“€μ˜ μ„±λŠ₯을 μ΅œλŒ€ν•œ ν™œμš©ν•˜κ³  μ—¬λŸ¬λΆ„μ˜ λ¬Έμ œμ— 맞게 μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆν•˜κΈ° μœ„ν•΄μ„œ,
# μ •ν™•νžˆ 이듀이 μ–΄λ–€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”μ§€ 이해할 ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.
# 이해λ₯Ό μ¦μ§„ν•˜κΈ° μœ„ν•΄μ„œ, μš°λ¦¬λŠ” λ¨Όμ € 이듀 λͺ¨λΈλ“€λ‘œλΆ€ν„° 아무 피쳐도 μ‚¬μš©ν•˜μ§€ μ•Šκ³ 
# 이해λ₯Ό μ¦μ§„ν•˜κΈ° μœ„ν•΄μ„œ, μš°λ¦¬λŠ” λ¨Όμ € 이듀 λͺ¨λΈλ“€λ‘œλΆ€ν„° 아무 νŠΉμ§•λ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³ 
# MNIST 데이터셋에 λŒ€ν•΄ 기초적인 신경망을 ν•™μŠ΅μ‹œν‚¬ κ²ƒμž…λ‹ˆλ‹€;
# μš°λ¦¬λŠ” μ²˜μŒμ—λŠ” κ°€μž₯ 기초적인 PyTorch ν…μ„œ(tensor) κΈ°λŠ₯λ§Œμ„ μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.
# κ·Έλ¦¬κ³ λ‚˜μ„œ μš°λ¦¬λŠ” 점차적으둜 ``torch.nn``, ``torch.optim``, ``Dataset``, λ˜λŠ”
# ``DataLoader`` λ‘œλΆ€ν„° ν•œλ²ˆμ— ν•˜λ‚˜μ”© 피쳐λ₯Ό μΆ”κ°€ν•˜λ©΄μ„œ, μ •ν™•νžˆ 각 뢀뢄이 μ–΄λ–€ 일을 ν•˜λŠ”μ§€ 그리고
# 그러고 λ‚˜μ„œ μš°λ¦¬λŠ” 점차적으둜 ``torch.nn``, ``torch.optim``, ``Dataset``, λ˜λŠ”
# ``DataLoader`` λ‘œλΆ€ν„° ν•œ λ²ˆμ— ν•˜λ‚˜μ”© νŠΉμ§•μ„ μΆ”κ°€ν•˜λ©΄μ„œ, μ •ν™•νžˆ 각 뢀뢄이 μ–΄λ–€ 일을 ν•˜λŠ”μ§€ 그리고
# 이것이 μ–΄λ–»κ²Œ μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ³  μœ μ—°ν•˜κ²Œ λ§Œλ“œλŠ”μ§€ 보여쀄 κ²ƒμž…λ‹ˆλ‹€.
#
# **이 νŠœν† λ¦¬μ–Όμ€ μ—¬λŸ¬λΆ„μ΄ 이미 PyTorchλ₯Ό μ„€μΉ˜ν•˜μ˜€κ³ , 그리고 ν…μ„œ μ—°μ‚°μ˜ κΈ°μ΄ˆμ— λŒ€ν•΄ μ΅μˆ™ν•˜λ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.**
Expand All @@ -35,7 +35,7 @@
# -------------------
#
# μš°λ¦¬λŠ” μ†μœΌλ‘œ μ“΄ 숫자(0μ—μ„œ 9 사이)의 흑백 μ΄λ―Έμ§€λ‘œ κ΅¬μ„±λœ ν΄λž˜μ‹
# `MNIST <http://deeplearning.net/data/mnist/>`_ 데이터셋을 μ‚¬μš©ν•  것 μž…λ‹ˆλ‹€.
# `MNIST <http://deeplearning.net/data/mnist/>`_ 데이터셋을 μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.
#
# μš°λ¦¬λŠ” 경둜 섀정을 λ‹΄λ‹Ήν•˜λŠ” (Python3 ν‘œμ€€ 라이브러리의 일뢀인)
# `pathlib <https://docs.python.org/3/library/pathlib.html>`_ 을 μ‚¬μš©ν•  것이고,
Expand All @@ -60,7 +60,7 @@

###############################################################################
# 이 데이터셋은 NumPy λ°°μ—΄ 포맷이고, 데이터λ₯Ό μ§λ ¬ν™”ν•˜κΈ° μœ„ν•œ
# python μ „μš© 포맷 pickle 을 μ΄μš©ν•˜μ—¬ μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
# python μ „μš© 포맷 pickle을 μ΄μš©ν•˜μ—¬ μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

import pickle
import gzip
Expand All @@ -69,8 +69,8 @@
((x_train, y_train), (x_valid, y_valid), _) = pickle.load(f, encoding="latin-1")

###############################################################################
# 각 μ΄λ―Έμ§€λŠ” 28 x 28 ν˜•νƒœ 이고, 784 (=28x28) 크기λ₯Ό 가진 ν•˜λ‚˜μ˜ ν–‰μœΌλ‘œ μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
# ν•˜λ‚˜λ₯Ό μ‚΄νŽ΄ λ΄…μ‹œλ‹€; λ¨Όμ € μš°λ¦¬λŠ” 이 이미지λ₯Ό 2d둜 μž¬κ΅¬μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.
# 각 μ΄λ―Έμ§€λŠ” 28 x 28 ν˜•νƒœμ΄κ³ , 784 (=28x28) 크기λ₯Ό 가진 ν•˜λ‚˜μ˜ ν–‰μœΌλ‘œ μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
# ν•œ μž₯을 μ‚΄νŽ΄λ΄…μ‹œλ‹€; λ¨Όμ € μš°λ¦¬λŠ” 이 이미지λ₯Ό 2d둜 μž¬κ΅¬μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

from matplotlib import pyplot
import numpy as np
Expand All @@ -84,7 +84,7 @@
print(x_train.shape)

###############################################################################
# PyTorchλŠ” NumPy λ°°μ—΄ λ³΄λ‹€λŠ” ``torch.tensor`` λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ, μš°λ¦¬λŠ” 데이터λ₯Ό λ³€ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
# PyTorchλŠ” NumPy λ°°μ—΄λ³΄λ‹€λŠ” ``torch.tensor`` λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ, 데이터λ₯Ό λ³€ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

import torch

Expand Down Expand Up @@ -125,13 +125,13 @@
bias = torch.zeros(10, requires_grad=True)

###############################################################################
# PyTorch의 기울기λ₯Ό μžλ™μœΌλ‘œ κ³„μ‚°ν•΄μ£ΌλŠ” κΈ°λŠ₯ 덕뢄에, Python ν‘œμ€€ ν•¨μˆ˜
# PyTorch의 기울기λ₯Ό μžλ™μœΌλ‘œ 계산 ν•΄μ£ΌλŠ” κΈ°λŠ₯ 덕뢄에, Python ν‘œμ€€ ν•¨μˆ˜
# (λ˜λŠ” 호좜 κ°€λŠ₯ν•œ 객체)λ₯Ό λͺ¨λΈλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€!
# κ·ΈλŸ¬λ―€λ‘œ κ°„λ‹¨ν•œ μ„ ν˜• λͺ¨λΈμ„ λ§Œλ“€κΈ° μœ„ν•΄μ„œ λ‹¨μˆœν•œ ν–‰λ ¬ κ³±μ…ˆκ³Ό λΈŒλ‘œλ“œμΊμŠ€νŠΈ(broadcast)
# λ§μ…ˆμ„ μ‚¬μš©ν•˜μ—¬ λ³΄κ² μŠ΅λ‹ˆλ‹€. λ˜ν•œ, μš°λ¦¬λŠ” ν™œμ„±ν™” ν•¨μˆ˜(activation function)κ°€ ν•„μš”ν•˜λ―€λ‘œ,
# `log_softmax` λ₯Ό κ΅¬ν˜„ν•˜κ³  μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.
# PyTorchμ—μ„œ λ§Žμ€ 사전 κ΅¬ν˜„λœ 손싀 ν•¨μˆ˜(loss function), ν™œμ„±ν™” ν•¨μˆ˜λ“€μ΄ μ œκ³΅λ˜μ§€λ§Œ,
# 일반적인 python을 μ‚¬μš©ν•˜μ—¬ μžμ‹ λ§Œμ˜ ν•¨μˆ˜λ₯Ό μ‰½κ²Œ μž‘μ„±ν•  수 μžˆμŒμ„ κΈ°μ–΅ν•΄μ£Όμ„Έμš”.
# 일반적인 python을 μ‚¬μš©ν•˜μ—¬ μžμ‹ λ§Œμ˜ ν•¨μˆ˜λ₯Ό μ‰½κ²Œ μž‘μ„±ν•  수 μžˆμŒμ„ κΈ°μ–΅ν•΄ μ£Όμ„Έμš”.
# PyTorchλŠ” 심지어 μ—¬λŸ¬λΆ„μ˜ ν•¨μˆ˜λ₯Ό μœ„ν•΄μ„œ λΉ λ₯Έ GPU λ˜λŠ” λ²‘ν„°ν™”λœ CPU μ½”λ“œλ₯Ό λ§Œλ“€μ–΄μ€„ κ²ƒμž…λ‹ˆλ‹€.

def log_softmax(x):
Expand Down Expand Up @@ -167,7 +167,7 @@ def nll(input, target):
loss_func = nll

###############################################################################
# 우리의 λ¬΄μž‘μœ„ λͺ¨λΈμ— λŒ€ν•œ 손싀을 μ κ²€ν•΄λ΄…μ‹œλ‹€, 그럼으둜써 μš°λ¦¬λŠ” λ‚˜μ€‘μ— μ—­μ „νŒŒ 이후에 κ°œμ„ μ΄ μžˆλŠ”μ§€
# 우리의 λ¬΄μž‘μœ„ λͺ¨λΈμ— λŒ€ν•œ 손싀을 점검해 λ΄„μœΌλ‘œμ¨ μ—­μ „νŒŒ 이후에 κ°œμ„ μ΄ μžˆλŠ”μ§€ λ‚˜μ€‘μ—
# 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

yb = y_train[0:bs]
Expand All @@ -176,7 +176,7 @@ def nll(input, target):

###############################################################################
# λ˜ν•œ, 우리 λͺ¨λΈμ˜ 정확도(accuracy)λ₯Ό κ³„μ‚°ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•©μ‹œλ‹€.
# 맀 μ˜ˆμΈ‘λ§ˆλ‹€, λ§Œμ•½ κ°€μž₯ 큰 κ°’μ˜ μΈλ±μŠ€κ°€ λͺ©ν‘œκ°’(target value)κ³Ό λ™μΌν•˜λ‹€λ©΄,
# 맀 μ˜ˆμΈ‘λ§ˆλ‹€, λ§Œμ•½ κ°€μž₯ 큰 κ°’μ˜ μΈλ±μŠ€κ°€ λͺ©ν‘―κ°’(target value)κ³Ό λ™μΌν•˜λ‹€λ©΄,
# κ·Έ μ˜ˆμΈ‘μ€ μ˜¬λ°”λ₯Έ κ²ƒμž…λ‹ˆλ‹€.

def accuracy(out, yb):
Expand All @@ -190,26 +190,26 @@ def accuracy(out, yb):
print(accuracy(preds, yb))

###############################################################################
# 이제 μš°λ¦¬λŠ” ν›ˆλ ¨ 루프(training loop)λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 맀 λ°˜λ³΅λ§ˆλ‹€, μš°λ¦¬λŠ” λ‹€μŒμ„ μˆ˜ν–‰ν•  κ²ƒμž…λ‹ˆλ‹€:
# 이제 μš°λ¦¬λŠ” ν›ˆλ ¨ 루프(training loop)λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 맀 λ°˜λ³΅λ§ˆλ‹€, λ‹€μŒμ„ μˆ˜ν–‰ν•  κ²ƒμž…λ‹ˆλ‹€:
#
# - λ°μ΄ν„°μ˜ λ―Έλ‹ˆλ°°μΉ˜λ₯Ό 선택 (``bs`` 크기)
# - λͺ¨λΈμ„ μ΄μš©ν•˜μ—¬ 예츑 μˆ˜ν–‰
# - 손싀 계산
# - ``loss.backward()`` λ₯Ό μ΄μš©ν•˜μ—¬ λͺ¨λΈμ˜ 기울기 μ—…λ°μ΄νŠΈ, 이 κ²½μš°μ—λŠ”, ``weights`` 와 ``bias``.
#
# 이제 μš°λ¦¬λŠ” 이 κΈ°μšΈκΈ°λ“€μ„ μ΄μš©ν•˜μ—¬ κ°€μ€‘μΉ˜μ™€ μ ˆνŽΈμ„ μ—…λ°μ΄νŠΈ ν•©λ‹ˆλ‹€.
# μš°λ¦¬λŠ” 이것을 ``torch.no_grad()`` μ»¨ν…μŠ€νŠΈ λ§€λ‹ˆμ Έ(context manager) λ‚΄μ—μ„œ μ‹€ν–‰ν•©λ‹ˆλ‹€,
# μš°λ¦¬λŠ” 이것을 ``torch.no_grad()`` μ»¨ν…μŠ€νŠΈ λ§€λ‹ˆμ €(context manager) λ‚΄μ—μ„œ μ‹€ν–‰ν•©λ‹ˆλ‹€,
# μ™œλƒν•˜λ©΄ μ΄λŸ¬ν•œ 싀행이 λ‹€μŒ 기울기의 계산에 κΈ°λ‘λ˜μ§€ μ•ŠκΈ°λ₯Ό μ›ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
# PyTorch의 μžλ™ 기울기(Autograd)κ°€ μ–΄λ–»κ²Œ 연산을 κΈ°λ‘ν•˜λŠ”μ§€
# `μ—¬κΈ° <https://pytorch.org/docs/stable/notes/autograd.html>`_ μ—μ„œ 더 μ•Œμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
# `μ—¬κΈ° <https://pytorch.org/docs/stable/notes/autograd.html>`_\μ—μ„œ 더 μ•Œμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
#
# μš°λ¦¬λŠ” κ·ΈλŸ¬κ³ λ‚˜μ„œ 기울기λ₯Ό 0으둜 μ„€μ •ν•©λ‹ˆλ‹€, 그럼으둜써 λ‹€μŒ 루프(loop)에 μ€€λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€.
# 그렇지 μ•ŠμœΌλ©΄, 우리의 κΈ°μšΈκΈ°λ“€μ€ μΌμ–΄λ‚œ λͺ¨λ“  μ—°μ‚°μ˜ λˆ„μ  집계λ₯Ό κΈ°λ‘ν•˜κ²Œ λ˜λ²„λ¦½λ‹ˆλ‹€.
# 그러고 λ‚˜μ„œ 기울기λ₯Ό 0으둜 μ„€μ •ν•©λ‹ˆλ‹€, 그럼으둜써 λ‹€μŒ 루프(loop)에 μ€€λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€.
# 그렇지 μ•ŠμœΌλ©΄, 우리의 κΈ°μšΈκΈ°λ“€μ€ μΌμ–΄λ‚œ λͺ¨λ“  μ—°μ‚°μ˜ λˆ„μ  집계λ₯Ό κΈ°λ‘ν•˜κ²Œ λ˜μ–΄λ²„λ¦½λ‹ˆλ‹€.
# (즉, ``loss.backward()`` κ°€ 이미 μ €μž₯된 것을 λŒ€μ²΄ν•˜κΈ°λ³΄λ‹¨, κΈ°μ‘΄ 값에 기울기λ₯Ό *λ”ν•˜κ²Œ* λ©λ‹ˆλ‹€).
#
# .. tip:: μ—¬λŸ¬λΆ„λ“€μ€ PyTorch μ½”λ“œμ— λŒ€ν•˜μ—¬ ν‘œμ€€ python 디버거(debugger)λ₯Ό μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ,
# 맀 λ‹¨κ³„λ§ˆλ‹€ λ‹€μ–‘ν•œ λ³€μˆ˜ 값을 점검할 수 μžˆμŠ΅λ‹ˆλ‹€.
# μ•„λž˜μ—μ„œ ``set_trace()`` λ₯Ό 주석 ν•΄μ œν•˜μ—¬ μ‚¬μš©ν•΄λ³΄μ„Έμš”.
# μ•„λž˜μ—μ„œ ``set_trace()`` λ₯Ό 주석 ν•΄μ œν•˜μ—¬ μ‚¬μš©ν•΄ λ³΄μ„Έμš”.
#

from IPython.core.debugger import set_trace
Expand All @@ -235,7 +235,7 @@ def accuracy(out, yb):
bias.grad.zero_()

###############################################################################
# 이제 λ‹€ λμŠ΅λ‹ˆλ‹€: μš°λ¦¬λŠ” 제일 κ°„λ‹¨ν•œ 신경망(neural network)의 λͺ¨λ“  것을 λ°‘λ°”λ‹₯λΆ€ν„° μƒμ„±ν•˜κ³ 
# 이제 λ‹€ λμŠ΅λ‹ˆλ‹€: 제일 κ°„λ‹¨ν•œ 신경망(neural network)의 λͺ¨λ“  것을 λ°‘λ°”λ‹₯λΆ€ν„° μƒμ„±ν•˜κ³ 
# ν›ˆλ ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€! (μ΄λ²ˆμ—λŠ” 은닉측(hidden layer)이 μ—†κΈ° λ•Œλ¬Έμ—,
# λ‘œμ§€μŠ€ν‹± νšŒκ·€(logistic regression)μž…λ‹ˆλ‹€).
#
Expand All @@ -248,7 +248,7 @@ def accuracy(out, yb):
# ``torch.nn.functional`` μ‚¬μš©ν•˜κΈ°
# -----------------------------------
#
# 이제 μš°λ¦¬λŠ” μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§(refactoring) ν•˜κ² μŠ΅λ‹ˆλ‹€, 그럼으둜써 이전과 λ™μΌν•˜μ§€λ§Œ,
# 이제 μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§(refactoring) ν•˜κ² μŠ΅λ‹ˆλ‹€. 그둜써 이전과 λ™μΌν•˜μ§€λ§Œ,
# PyTorch의 ``nn`` 클래슀의 μž₯점을 ν™œμš©ν•˜μ—¬ 더 κ°„κ²°ν•˜κ³  μœ μ—°ν•˜κ²Œ λ§Œλ“€ κ²ƒμž…λ‹ˆλ‹€.
# μ§€κΈˆλΆ€ν„° 맀 λ‹¨κ³„μ—μ„œ, μš°λ¦¬λŠ” μ½”λ“œλ₯Ό 더 짧고, μ΄ν•΄ν•˜κΈ° 쉽고, μœ μ—°ν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.
#
Expand All @@ -257,10 +257,10 @@ def accuracy(out, yb):
# (관둀에 따라, 일반적으둜 ``F`` λ„€μž„μŠ€νŽ˜μ΄μŠ€(namespace)λ₯Ό 톡해 μž„ν¬νŠΈ(import) ν•©λ‹ˆλ‹€).
# 이 λͺ¨λ“ˆμ—λŠ” ``torch.nn`` 라이브러리의 λͺ¨λ“  ν•¨μˆ˜κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€
# (라이브러리의 λ‹€λ₯Έ λΆ€λΆ„μ—λŠ” ν΄λž˜μŠ€κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.)
# λ‹€μ–‘ν•œ 손싀 및 ν™œμ„±ν™” ν•¨μˆ˜ 뿐만 μ•„λ‹ˆλΌ, 풀링(pooling) ν•¨μˆ˜μ™€ 같이 신경망을 λ§Œλ“œλŠ”λ°
# λ‹€μ–‘ν•œ 손싀 및 ν™œμ„±ν™” ν•¨μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ, 풀링(pooling) ν•¨μˆ˜μ™€ 같이 신경망을 λ§Œλ“œλŠ”λ°
# νŽΈλ¦¬ν•œ λͺ‡ 가지 ν•¨μˆ˜λ„ μ—¬κΈ°μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.
# (μ»¨λ³Όλ£¨μ…˜(convolution) μ—°μ‚°, μ„ ν˜•(linear) λ ˆμ΄μ–΄, 등을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ„ μžˆμ§€λ§Œ,
# μ•žμœΌλ‘œ λ³΄μ‹œκ² μ§€λ§Œ 일반적으둜 라이브러리의 λ‹€λ₯Έ 뢀뢄을 μ‚¬μš©ν•˜μ—¬ 더 잘 처리 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.)
# μ•žμœΌλ‘œ λ³΄μ‹œκ² μ§€λ§Œ λŒ€κ°œλŠ” 라이브러리의 λ‹€λ₯Έ 뢀뢄을 μ‚¬μš©ν•˜μ—¬ 더 잘 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.)
#
# λ§Œμ•½ μ—¬λŸ¬λΆ„λ“€μ΄ 음의 둜그 μš°λ„ 손싀과 둜그 μ†Œν”„νŠΈλ§₯슀 (log softmax) ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 경우,
# PyTorchλŠ” 이 λ‘˜μ„ κ²°ν•©ν•˜λŠ” 단일 ν•¨μˆ˜μΈ ``F.cross_entropy`` λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
Expand All @@ -274,23 +274,23 @@ def model(xb):
return xb @ weights + bias

###############################################################################
# 더이상 ``model`` ν•¨μˆ˜μ—μ„œ ``log_softmax`` λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ³  μžˆμŠ΅λ‹ˆλ‹€.
# 손싀과 정확도과 이전과 λ™μΌν•œμ§€ ν™•μΈν•΄λ΄…μ‹œλ‹€:
# 더 이상 ``model`` ν•¨μˆ˜μ—μ„œ ``log_softmax`` λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ³  μžˆμŠ΅λ‹ˆλ‹€.
# 손싀과 정확도과 이전과 λ™μΌν•œμ§€ 확인해 λ΄…μ‹œλ‹€:

print(loss_func(model(xb), yb), accuracy(model(xb), yb))

###############################################################################
# ``nn.Module`` 을 μ΄μš©ν•˜μ—¬ λ¦¬νŒ©ν† λ§ ν•˜κΈ°
# -----------------------------------------
# λ‹€μŒμœΌλ‘œ, 더 λͺ…ν™•ν•˜κ³  κ°„κ²°ν•œ ν›ˆλ ¨ 루프λ₯Ό μœ„ν•΄ ``nn.Module`` 및 ``nn.Parameter`` λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
# μš°λ¦¬λŠ” ``nn.Module`` (μžμ²΄κ°€ 클래슀이고 μƒνƒœλ₯Ό μΆ”μ²™ν•  수 μžˆλŠ”) ν•˜μœ„ 클래슀(subclass)λ₯Ό λ§Œλ“­λ‹ˆλ‹€.
# μš°λ¦¬λŠ” ``nn.Module`` (μžμ²΄κ°€ 클래슀이고 μƒνƒœλ₯Ό 좔적할 수 μžˆλŠ”) ν•˜μœ„ 클래슀(subclass)λ₯Ό λ§Œλ“­λ‹ˆλ‹€.
# 이 κ²½μš°μ—λŠ”, ν¬μ›Œλ“œ(forward) 단계에 λŒ€ν•œ κ°€μ€‘μΉ˜, 절편, 그리고 λ©”μ†Œλ“œ(method) 등을 μœ μ§€ν•˜λŠ”
# 클래슀λ₯Ό λ§Œλ“€κ³ μž ν•©λ‹ˆλ‹€.
# ``nn.Module`` 은 μš°λ¦¬κ°€ μ‚¬μš©ν•  λͺ‡ 가지 속성(attribute)κ³Ό λ©”μ†Œλ“œλ₯Ό (``.parameters()`` 와
# ``.zero_grad()`` 같은) 가지고 μžˆμŠ΅λ‹ˆλ‹€.
#
# .. note:: ``nn.Module`` (λŒ€λ¬Έμž M) 은 PyTorch 의 νŠΉμ • κ°œλ…μ΄κ³ , μš°λ¦¬λŠ” 이 클래슀λ₯Ό
# 많이 μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€. ``nn.Module`` λ₯Ό Python 의 μ½”λ“œλ₯Ό μž„ν¬νŠΈν•˜κΈ° μœ„ν•œ μ½”λ“œ 파일인
# .. note:: ``nn.Module`` (λŒ€λ¬Έμž M) 은 PyTorch의 νŠΉμ • κ°œλ…μ΄κ³ , μš°λ¦¬λŠ” 이 클래슀λ₯Ό
# 많이 μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€. ``nn.Module`` λ₯Ό Python의 μ½”λ“œλ₯Ό μž„ν¬νŠΈν•˜κΈ° μœ„ν•œ μ½”λ“œ 파일인
# `module <https://docs.python.org/3/tutorial/modules.html>`_ (μ†Œλ¬Έμž ``m``)
# 의 κ°œλ…κ³Ό ν—·κ°ˆλ¦¬μ§€ λ§μ•„μ£Όμ„Έμš”.

Expand All @@ -314,7 +314,7 @@ def forward(self, xb):
###############################################################################
# 이제 μš°λ¦¬λŠ” 이전과 λ™μΌν•œ λ°©μ‹μœΌλ‘œ 손싀을 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.
# μ—¬κΈ°μ„œ ``nn.Module`` μ˜€λΈŒμ νŠΈλ“€μ€ 마치 ν•¨μˆ˜μ²˜λŸΌ μ‚¬μš©λ©λ‹ˆλ‹€ (즉, 이듀은 *ν˜ΈμΆœκ°€λŠ₯* ν•©λ‹ˆλ‹€),
# κ·ΈλŸ¬λ‚˜ λ°°ν›„μ—μ„œ PyTorch λŠ” 우리의 ``forward`` λ©”μ†Œλ“œλ₯Ό μžλ™μœΌλ‘œ ν˜ΈμΆœν•©λ‹ˆλ‹€.
# κ·ΈλŸ¬λ‚˜ λ°°ν›„μ—μ„œ PyTorchλŠ” 우리의 ``forward`` λ©”μ†Œλ“œλ₯Ό μžλ™μœΌλ‘œ ν˜ΈμΆœν•©λ‹ˆλ‹€.

print(loss_func(model(xb), yb))

Expand Down Expand Up @@ -363,7 +363,7 @@ def fit():
fit()

###############################################################################
# 손싀이 μ€„μ–΄λ“€μ—ˆλŠ”μ§€ λ‹€μ‹œ ν•œλ²ˆ ν™•μΈν•©μ‹œλ‹€:
# 손싀이 μ€„μ–΄λ“€μ—ˆλŠ”μ§€ λ‹€μ‹œ ν•œ 번 ν™•μΈν•©μ‹œλ‹€:

print(loss_func(model(xb), yb))

Expand Down

0 comments on commit e314a4a

Please sign in to comment.