33๊ธฐ์ด๋ถํฐ ์์ํ๋ NLP: ๋ฌธ์-๋จ์ RNN์ผ๋ก ์ด๋ฆ ๋ถ๋ฅํ๊ธฐ
44********************************************************************************
55**Author**: `Sean Robertson <https://github.com/spro/practical-pytorch>`_
6- **๋ฒ์ญ**: `ํฉ์ฑ์ <https://github.com/adonisues>`_
6+ **๋ฒ์ญ**: `ํฉ์ฑ์ <https://github.com/adonisues>`_, `๊น์ ํ <https://github.com/garlicvread>`_
77
88
9- ๋จ์ด๋ฅผ ๋ถ๋ฅํ๊ธฐ ์ํด ๊ธฐ์ด์ ์ธ ๋ฌธ์-๋จ์ RNN์ ๊ตฌ์ถํ๊ณ ํ์ต ํ ์์ ์
๋๋ค.
10- ์ด ํํ ๋ฆฌ์ผ์์๋ (์ดํ 2๊ฐ ํํ ๋ฆฌ์ผ๊ณผ ํจ๊ป) NLP ๋ชจ๋ธ๋ง์ ์ํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ฅผ
11- `torchtext` ์ ํธ๋ฆฌํ ๋ง์ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ์ง ์๊ณ ์ด๋ป๊ฒ ํ๋์ง "๊ธฐ์ด๋ถํฐ(from scratch)"
12- ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ NLP ๋ชจ๋ธ๋ง์ ์ํ ์ ์ฒ๋ฆฌ๊ฐ ์ ์์ค์์ ์ด๋ป๊ฒ ์งํ๋๋์ง๋ฅผ ์ ์ ์์ต๋๋ค.
9+ ๋จ์ด๋ฅผ ๋ถ๋ฅํ๊ธฐ ์ํด ๊ธฐ์ด์ ์ธ ๋ฌธ์-๋จ์ RNN์ ๊ตฌ์ถํ๊ณ ํ์ตํ ์์ ์
๋๋ค.
10+ ์ด ํํ ๋ฆฌ์ผ์์๋(์ดํ 2๊ฐ ํํ ๋ฆฌ์ผ๊ณผ ํจ๊ป) NLP ๋ชจ๋ธ๋ง์ ์ํด `torchtext` ์
11+ ์๋ง์ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๋์ง "๊ธฐ์ด๋ถํฐ(from scratch)"
12+ ๋ณด์ฌ์ฃผ๋ฏ๋ก NLP ๋ชจ๋ธ๋ง์ ์ํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๊ฐ ์ ์์ค์์ ์ด๋ป๊ฒ ์งํ๋๋์ง ์ ์ ์์ต๋๋ค.
1313๋ฌธ์-๋จ์ RNN์ ๋จ์ด๋ฅผ ๋ฌธ์์ ์ฐ์์ผ๋ก ์ฝ์ด ๋ค์ฌ์ ๊ฐ ๋จ๊ณ์ ์์ธก๊ณผ
14- "์๋ ์ํ(Hidden State)" ์ถ๋ ฅํ๊ณ , ๋ค์ ๋จ๊ณ์ ์ด์ ์๋ ์ํ๋ฅผ ์ ๋ฌํฉ๋๋ค.
15- ๋จ์ด๊ฐ ์ํ ํด๋์ค๋ก ์ถ๋ ฅ์ด ๋๋๋ก ์ต์ข
์์ธก์ผ๋ก ์ ํํฉ๋๋ค.
14+ "์๋ ์ํ(Hidden State)"๋ฅผ ์ถ๋ ฅํ๊ณ , ๋ค์ ๋จ๊ณ์ ์ด์ ๋จ๊ณ์ ์๋ ์ํ๋ฅผ ์ ๋ฌํฉ๋๋ค.
15+ ๋จ์ด๊ฐ ์ํ ํด๋์ค๋ก ์ถ๋ ฅ๋๋๋ก ์ต์ข
์์ธก์ผ๋ก ์ ํํฉ๋๋ค.
1616
1717๊ตฌ์ฒด์ ์ผ๋ก, 18๊ฐ ์ธ์ด๋ก ๋ ์์ฒ ๊ฐ์ ์ฑ(ๅง)์ ํ๋ จ์ํค๊ณ ,
1818์ฒ ์์ ๋ฐ๋ผ ์ด๋ฆ์ด ์ด๋ค ์ธ์ด์ธ์ง ์์ธกํฉ๋๋ค:
3939- :doc:`/beginner/pytorch_with_examples` ๋๊ณ ๊น์ ํต์ฐฐ์ ์ํ ์๋ฃ
4040- :doc:`/beginner/former_torchies_tutorial` ์ด์ Lua Torch ์ฌ์ฉ์๋ฅผ ์ํ ์๋ฃ
4141
42- RNN๊ณผ ์๋ ๋ฐฉ์์ ์๋ ๊ฒ ๋ํ ์ ์ฉํฉ๋๋ค:
42+ RNN๊ณผ ๊ทธ ์๋ ๋ฐฉ์์ ์๋ ๊ฒ ๋ํ ์ ์ฉํฉ๋๋ค:
4343
4444- `The Unreasonable Effectiveness of Recurrent Neural
4545 Networks <https://karpathy.github.io/2015/05/21/rnn-effectiveness/>`__
5252==================
5353
5454.. note::
55- `์ฌ๊ธฐ <https://download.pytorch.org/tutorial/data.zip>`__ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด ๋ฐ๊ณ ,
55+ `์ฌ๊ธฐ <https://download.pytorch.org/tutorial/data.zip>`__ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๊ณ
5656 ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์์ถ์ ํธ์ญ์์ค.
5757
5858``data/names`` ๋๋ ํ ๋ฆฌ์๋ "[Language].txt" ๋ผ๋ 18 ๊ฐ์ ํ
์คํธ ํ์ผ์ด ์์ต๋๋ค.
59- ๊ฐ ํ์ผ์๋ ํ ์ค์ ํ๋์ ์ด๋ฆ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ ๋๋ถ๋ถ ๋ก๋ง์๋ก ๋์ด ์์ต๋๋ค
59+ ๊ฐ ํ์ผ์๋ ํ ์ค์ ํ๋์ ์ด๋ฆ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ ๋๋ถ๋ถ ๋ก๋ง์๋ก ๋์ด ์์ต๋๋ค.
6060(๊ทธ๋ฌ๋, ์ ๋์ฝ๋์์ ASCII๋ก ๋ณํํด์ผ ํจ).
6161
6262๊ฐ ์ธ์ด ๋ณ๋ก ์ด๋ฆ ๋ชฉ๋ก ์ฌ์ ``{language: [names ...]}`` ์ ๋ง๋ญ๋๋ค.
6363์ผ๋ฐ ๋ณ์ "category" ์ "line" (์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ธ์ด์ ์ด๋ฆ)์ ์ดํ์ ํ์ฅ์ฑ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
6464
6565.. note::
66- ์ญ์ ์ฃผ: "line" ์ ์
๋ ฅ์ "category"์ ํด๋์ค๋ฅผ ์ ์ฉํ์ฌ ๋ค๋ฅธ ๋ฌธ์ ์๋ ํ์ฉ ํ ์ ์์ต๋๋ค.
67- ์ฌ๊ธฐ์๋ "line"์ ์ด๋ฆ(ex. Robert )๋ฅผ ์
๋ ฅ์ผ๋ก "category"์ ํด๋์ค(ex. english)๋ก ์ฌ์ฉํฉ๋๋ค.
66+ ์ญ์ ์ฃผ: "line" ์ ์
๋ ฅ์ "category"์ ํด๋์ค๋ฅผ ์ ์ฉํ์ฌ ๋ค๋ฅธ ๋ฌธ์ ์๋ ํ์ฉํ ์ ์์ต๋๋ค.
67+ ์ฌ๊ธฐ์๋ "line"์ ์ด๋ฆ(ex. Robert)์ ์
๋ ฅ์ผ๋ก, "category"์ ํด๋์ค(ex. english)๋ก ์ฌ์ฉํฉ๋๋ค.
6868
6969"""
7070from __future__ import unicode_literals , print_function , division
@@ -111,7 +111,7 @@ def readLines(filename):
111111
112112######################################################################
113113# ์ด์ ๊ฐ ``category`` (์ธ์ด)๋ฅผ ``line`` (์ด๋ฆ)์ ๋งคํํ๋ ์ฌ์ ์ธ
114- # ``category_lines`` ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋์ค์ ์ฐธ์กฐ ํ ์ ์๋๋ก
114+ # ``category_lines`` ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋์ค์ ์ฐธ์กฐํ ์ ์๋๋ก
115115# ``all_categories`` (์ธ์ด ๋ชฉ๋ก)์ ``n_categories`` ๋ ์ถ์ ํฉ๋๋ค.
116116#
117117
@@ -122,15 +122,15 @@ def readLines(filename):
122122# ์ด๋ฆ์ Tensor๋ก ๋ณ๊ฒฝ
123123# --------------------------
124124#
125- # ์ด์ ๋ชจ๋ ์ด๋ฆ์ ์ฒด๊ณํ ํ์ผ๋ฏ๋ก , ์ด๋ฅผ ํ์ฉํ๊ธฐ ์ํด Tensor๋ก
126- # ์ ํํด์ผ ํฉ๋๋ค.
125+ # ์ด์ ๋ชจ๋ ์ด๋ฆ์ ์ฒด๊ณํํ์ผ๋ฏ๋ก , ์ด๋ฅผ ํ์ฉํ๊ธฐ ์ํด Tensor๋ก
126+ # ๋ณํํด์ผ ํฉ๋๋ค.
127127#
128- # ํ๋์ ๋ฌธ์๋ฅผ ํํํ๊ธฐ ์ํด, ํฌ๊ธฐ๊ฐ ``<1 x n_letters>`` ์ธ
129- # "One-Hot ๋ฒกํฐ" ๋ฅผ ์ฌ์ฉํฉ๋๋ค. One-Hot ๋ฒกํฐ๋ ํ์ฌ ๋ฌธ์์
130- # ์ฃผ์์๋ง 1์ ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ๊ทธ์ธ์ ๋๋จธ์ง๋ 0์ผ๋ก ์ฑ์์ง๋ค .
128+ # ํ๋์ ๋ฌธ์๋ฅผ ํํํ๊ธฐ ์ํด ํฌ๊ธฐ๊ฐ ``<1 x n_letters>`` ์ธ
129+ # "One-Hot ๋ฒกํฐ"๋ฅผ ์ฌ์ฉํฉ๋๋ค. One-Hot ๋ฒกํฐ๋ ํ์ฌ ๋ฌธ์์
130+ # ์ฃผ์์๋ 1์ด, ๊ทธ ์ธ ๋๋จธ์ง ์ฃผ์์๋ 0์ด ์ฑ์์ง ๋ฒกํฐ์
๋๋ค .
131131# ์์ ``"b" = <0 1 0 0 0 ...>`` .
132132#
133- # ๋จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด One-Hot ๋ฒกํฐ๋ค์ 2 ์ฐจ์ ํ๋ ฌ
133+ # ๋จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด One-Hot ๋ฒกํฐ๋ค์ 2์ฐจ์ ํ๋ ฌ
134134# ``<line_length x 1 x n_letters>`` ์ ๊ฒฐํฉ์ํต๋๋ค.
135135#
136136# ์์์ ๋ณด์ด๋ ์ถ๊ฐ์ ์ธ 1์ฐจ์์ PyTorch์์ ๋ชจ๋ ๊ฒ์ด ๋ฐฐ์น(batch)์ ์๋ค๊ณ ๊ฐ์ ํ๊ธฐ
@@ -140,9 +140,9 @@ def readLines(filename):
140140'''
141141.. NOTE::
142142์ญ์ ์ฃผ: One-Hot ๋ฒกํฐ๋ ์ธ์ด๋ฅผ ๋ค๋ฃฐ ๋ ์์ฃผ ์ด์ฉ๋๋ฉฐ,
143- ๋จ์ด,๊ธ์ ๋ฑ์ ๋ฒกํฐ๋ก ํํ ํ ๋ ๋จ์ด,๊ธ์ ์ฌ์ด์ ์๊ด ๊ด๊ณ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์์ ๊ฒฝ์ฐ,
143+ ๋จ์ด, ๊ธ์ ๋ฑ์ ๋ฒกํฐ๋ก ํํํ ๋ ๋จ์ด, ๊ธ์ ์ฌ์ด์ ์๊ด ๊ด๊ณ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์์ ๊ฒฝ์ฐ,
144144One-Hot์ผ๋ก ํํํ์ฌ ์๋ก ์ง๊ตํ๋ค๊ณ ๊ฐ์ ํ๊ณ ํ์ต์ ์์ํฉ๋๋ค.
145- ๋์ผํ๊ฒ ์๊ด ๊ด๊ณ๋ฅผ ์ ์ ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ์๋ One-Hot ๋ฒกํฐ๋ฅผ ํ์ฉ ํ ์ ์์ต๋๋ค.
145+ ์ด์ ๋์ผํ๊ฒ, ์๊ด ๊ด๊ณ๋ฅผ ์ ์ ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ์๋ One-Hot ๋ฒกํฐ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
146146'''
147147
148148import torch
@@ -151,7 +151,7 @@ def readLines(filename):
151151def letterToIndex (letter ):
152152 return all_letters .find (letter )
153153
154- # ๊ฒ์ฆ์ ์ํด์ ํ๊ฐ์ ๋ฌธ์๋ฅผ <1 x n_letters> Tensor๋ก ๋ณํ
154+ # ๊ฒ์ฆ์ ์ํด์ ํ ๊ฐ์ ๋ฌธ์๋ฅผ <1 x n_letters> Tensor๋ก ๋ณํ
155155def letterToTensor (letter ):
156156 tensor = torch .zeros (1 , n_letters )
157157 tensor [0 ][letterToIndex (letter )] = 1
@@ -175,17 +175,17 @@ def lineToTensor(line):
175175# ====================
176176#
177177# Autograd ์ ์, Torch์์ RNN(recurrent neural network) ์์ฑ์
178- # ์ฌ๋ฌ ์๊ฐ ๋จ๊ณ ๊ฑธ์ฒ์ ๊ณ์ธต์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณต์ ํ๋ ์์
์ ํฌํจํฉ๋๋ค.
178+ # ์ฌ๋ฌ ์๊ฐ ๋จ๊ณ ๊ฑธ์ณ์ ๊ณ์ธต์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณต์ ํ๋ ์์
์ ํฌํจํฉ๋๋ค.
179179# ๊ณ์ธต์ ์๋ ์ํ์ ๋ณํ๋(Gradient)๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด์ ์ด๊ฒ๋ค์ ๊ทธ๋ํ ์์ฒด์์
180180# ์์ ํ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ feed-forward ๊ณ์ธต๊ณผ
181- # ๊ฐ์ ๋งค์ฐ "์์ํ" ๋ฐฉ๋ฒ์ผ๋ก RNN์ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
181+ # ๊ฐ์ ๋งค์ฐ "์์ํ" ๋ฐฉ๋ฒ์ผ๋ก RNN์ ๊ตฌํํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
182182#
183- # ์ญ์ ์ฃผ : ์ฌ๊ธฐ์๋ ๊ต์ก๋ชฉ์ ์ผ๋ก nn.RNN ๋์ ์ง์ RNN์ ์ฌ์ฉํฉ๋๋ค.
183+ # ์ญ์ ์ฃผ : ์ฌ๊ธฐ์๋ ๊ต์ก ๋ชฉ์ ์ผ๋ก nn.RNN ๋์ ์ง์ RNN์ ์ฌ์ฉํฉ๋๋ค.
184184#
185185# ์ด RNN ๋ชจ๋(๋๋ถ๋ถ `Torch ์ฌ์ฉ์๋ฅผ ์ํ PyTorch ํํ ๋ฆฌ์ผ
186186# <https://tutorials.pytorch.kr/beginner/former_torchies/
187- # nnft_tutorial.html#example-2-recurrent-net>`__ ์์ ๋ณต์ฌํจ)
188- # ์ ์
๋ ฅ ๋ฐ ์๋ ์ํ๋ก ์๋ํ๋ 2๊ฐ์ ์ ํ ๊ณ์ธต์ด๋ฉฐ,
187+ # nnft_tutorial.html#example-2-recurrent-net>`__ ์์ ๋ณต์ฌํจ)์
188+ # ์
๋ ฅ ๋ฐ ์๋ ์ํ๋ก ์๋ํ๋ 2๊ฐ์ ์ ํ ๊ณ์ธต์ด๋ฉฐ,
189189# ์ถ๋ ฅ ๋ค์์ LogSoftmax ๊ณ์ธต์ด ์์ต๋๋ค.
190190#
191191# .. figure:: https://i.imgur.com/Z2xbySO.png
@@ -221,9 +221,9 @@ def initHidden(self):
221221
222222######################################################################
223223# ์ด ๋คํธ์ํฌ์ ํ ๋จ๊ณ๋ฅผ ์คํํ๋ ค๋ฉด ์
๋ ฅ(ํ์ฌ ๋ฌธ์ Tensor)๊ณผ
224- # ์ด์ ์ ์๋ ์ํ (์ฒ์์๋ 0์ผ๋ก ์ด๊ธฐํ)๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
225- # ์ถ๋ ฅ(๊ฐ ์ธ์ด์ ํ๋ฅ )๊ณผ ๋ค์ ์๋ ์ํ (๋ค์ ๋จ๊ณ๋ฅผ ์ํด ์ ์ง)๋ฅผ
226- # ๋๋ ค ๋ฐ์ต๋๋ค .
224+ # ์ด์ ์ ์๋ ์ํ(์ฒ์์๋ 0์ผ๋ก ์ด๊ธฐํ)๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
225+ # ์ถ๋ ฅ(๊ฐ ์ธ์ด์ ํ๋ฅ )๊ณผ ๋ค์ ์๋ ์ํ(๋ค์ ๋จ๊ณ๋ฅผ ์ํด ์ ์ง)๋ฅผ
226+ # ๋๋ ค๋ฐ์ต๋๋ค .
227227#
228228
229229input = letterToTensor ('A' )
@@ -236,7 +236,7 @@ def initHidden(self):
236236# ํจ์จ์ฑ์ ์ํด์ ๋งค ๋จ๊ณ๋ง๋ค ์๋ก์ด Tensor๋ฅผ ๋ง๋ค๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์
237237# ``letterToTensor`` ๋์ ``lineToTensor`` ๋ฅผ ์๋ผ์ ์ฌ์ฉํ
238238# ๊ฒ์
๋๋ค. ์ด๊ฒ์ Tensor์ ์ฌ์ ์ฐ์ฐ(pre-computing) ๋ฐฐ์น์ ์ํด
239- # ๋์ฑ ์ต์ ํ ๋ ์ ์์ต๋๋ค.
239+ # ๋์ฑ ์ต์ ํ๋ ์ ์์ต๋๋ค.
240240#
241241
242242input = lineToTensor ('Albert' )
@@ -248,7 +248,7 @@ def initHidden(self):
248248
249249######################################################################
250250# ๋ณด์๋ค์ํผ ์ถ๋ ฅ์ ``<1 x n_categories>`` Tensor์ด๊ณ , ๋ชจ๋ ํญ๋ชฉ์
251- # ํด๋น ์นดํ
๊ณ ๋ฆฌ์ ์ฐ๋(likelihood) ์
๋๋ค (๋ ๋์ ๊ฒ์ด ๋ ํ๋ฅ ๋์).
251+ # ํด๋น ์นดํ
๊ณ ๋ฆฌ์ ์ฐ๋(likelihood)์
๋๋ค(๋ ๋์ ๊ฒ์ด ๋ ํ๋ฅ ๋์).
252252#
253253
254254
@@ -259,16 +259,17 @@ def initHidden(self):
259259# ํ์ต ์ค๋น
260260# ----------------------
261261#
262- # ํ์ต์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ ๋ช๋ช ๋์๋๋ ํจ์๋ฅผ ๋ง๋ค์ด์ผํฉ๋๋ค.
263- # ์ฒซ์งธ๋ ์ฐ๋ฆฌ๊ฐ ์์๋ธ ๊ฐ ์นดํ
๊ณ ๋ฆฌ์ ์ฐ๋์ธ ๋คํธ์ํฌ ์ถ๋ ฅ์ ํด์ํ๋ ๊ฒ ์
๋๋ค.
264- # ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฃผ์๋ฅผ ์๊ธฐ ์ํด์ ``Tensor.topk`` ๋ฅผ ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
262+ # ํ์ต์ ๋ค์ด๊ฐ๊ธฐ ์ , ๋ช๋ช ๋์ ๋๋ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
263+ # ์ฒซ์งธ๋ ์ฐ๋ฆฌ๊ฐ ์์๋ธ ๊ฐ ์นดํ
๊ณ ๋ฆฌ์ ์ฐ๋์ธ ๋คํธ์ํฌ ์ถ๋ ฅ์ ํด์ํ๋ ํจ์์
๋๋ค.
264+ # ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฃผ์๋ฅผ ์๊ธฐ ์ํด์ ``Tensor.topk`` ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
265+ #
265266# ์ญ์ ์ฃผ: ๋คํธ์ํฌ ์ถ๋ ฅ(๊ฐ ์นดํ
๊ณ ๋ฆฌ์ ์ฐ๋)์ผ๋ก
266- # ๊ฐ์ฅ ํ๋ฅ ์ด ๋์ ์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ(์ธ์ด)๊ณผ ์นดํ
๊ณ ๋ฆฌ ๋ฒํธ ๋ฐํ
267+ # ๊ฐ์ฅ ํ๋ฅ ์ด ๋์ ์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ(์ธ์ด)๊ณผ ์นดํ
๊ณ ๋ฆฌ ๋ฒํธ๋ฅผ ๋ฐํ
267268#
268269
269270def categoryFromOutput (output ):
270- top_n , top_i = output .topk (1 ) # ํ
์์ ๊ฐ์ฅ ํฐ ๊ฐ ๋ฐ ์ฃผ์
271- category_i = top_i [0 ].item () # ํ
์์์ ์ ์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
271+ top_n , top_i = output .topk (1 ) # ํ
์์ ๊ฐ์ฅ ํฐ ๊ฐ ๋ฐ ์ฃผ์
272+ category_i = top_i [0 ].item () # ํ
์์์ ์ ์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
272273 return all_categories [category_i ], category_i
273274
274275print (categoryFromOutput (output ))
@@ -299,7 +300,7 @@ def randomTrainingExample():
299300# ๋คํธ์ํฌ ํ์ต
300301# --------------------
301302#
302- # ์ด์ ์ด ๋คํธ์ํฌ๋ฅผ ํ์ตํ๋๋ฐ ํ์ํ ์์(ํ์ต ๋ฐ์ดํฐ)๋ค์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ํฉ๋๋ค.
303+ # ์ด์ ์ด ๋คํธ์ํฌ๋ฅผ ํ์ตํ๋ ๋ฐ ํ์ํ ์์(ํ์ต ๋ฐ์ดํฐ)๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ํฉ๋๋ค.
303304# ๋ง์ผ ํ๋ ธ๋ค๋ฉด ์๋ ค ์ค๋๋ค.
304305#
305306# RNN์ ๋ง์ง๋ง ๊ณ์ธต์ด ``nn.LogSoftmax`` ์ด๋ฏ๋ก ์์ค ํจ์๋ก
@@ -313,17 +314,17 @@ def randomTrainingExample():
313314# ๊ฐ ํ์ต ๋ฃจํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
314315#
315316# - ์
๋ ฅ๊ณผ ๋ชฉํ Tensor ์์ฑ
316- # - 0 ๋ก ์ด๊ธฐํ๋ ์๋ ์ํ ์์ฑ
317- # - ๊ฐ ๋ฌธ์๋ฅผ ์ฝ๊ธฐ
317+ # - 0 ๋ก ์ด๊ธฐํ ๋ ์๋ ์ํ ์์ฑ
318+ # - ๊ฐ ๋ฌธ์ ์ฝ๊ธฐ
318319#
319- # - ๋ค์ ๋ฌธ์๋ฅผ ์ํ ์๋ ์ํ ์ ์ง
320+ # - ๋ค์ ๋ฌธ์๋ฅผ ์ํ ์๋ ์ํ ์ ์ง
320321#
321322# - ๋ชฉํ์ ์ต์ข
์ถ๋ ฅ ๋น๊ต
322323# - ์ญ์ ํ
323324# - ์ถ๋ ฅ๊ณผ ์์ค ๋ฐํ
324325#
325326
326- learning_rate = 0.005 # ์ด๊ฒ์ ๋๋ฌด ๋๊ฒ ์ค์ ํ๋ฉด ๋ฐ์ฐํ ์ ์๊ณ , ๋๋ฌด ๋ฎ์ผ๋ฉด ํ์ต์ด ๋์ง ์์ ์ ์์ต๋๋ค.
327+ learning_rate = 0.005 # ํ์ต๋ฅ ์ ๋๋ฌด ๋๊ฒ ์ค์ ํ๋ฉด ๋ฐ์ฐํ ์ ์๊ณ , ๋๋ฌด ๋ฎ์ผ๋ฉด ํ์ต์ด ๋์ง ์์ ์ ์์ต๋๋ค.
327328
328329def train (category_tensor , line_tensor ):
329330 hidden = rnn .initHidden ()
@@ -344,8 +345,8 @@ def train(category_tensor, line_tensor):
344345
345346
346347######################################################################
347- # ์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์คํํด์ผํฉ๋๋ค . ``train`` ํจ์๊ฐ ์ถ๋ ฅ๊ณผ ์์ค์
348- # ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ถ์ธก์ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ๋์ํ๋ฅผ ์ํ ์์ค์ ์ถ์ ํ ์
348+ # ์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์คํํด์ผ ํฉ๋๋ค . ``train`` ํจ์๊ฐ ์ถ๋ ฅ๊ณผ ์์ค์
349+ # ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ถ์ธก์ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ๋์ํ๋ฅผ ์ํ ์์ค์ ์ถ์ ํ ์
349350# ์์ต๋๋ค. 1000๊ฐ์ ์์ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ``print_every`` ์์ ๋ง
350351# ์ถ๋ ฅํ๊ณ , ์์ค์ ํ๊ท ์ ์ป์ต๋๋ค.
351352#
@@ -394,7 +395,7 @@ def timeSince(since):
394395# --------------------
395396#
396397# ``all_losses`` ๋ฅผ ์ด์ฉํ ์์ค ๋์ํ๋
397- # ๋คํธ์ํฌ์ ํ์ต์ ๋ณด์ฌ์ค๋ค :
398+ # ๋คํธ์ํฌ์ ํ์ต์ ๋ณด์ฌ์ค๋๋ค :
398399#
399400
400401import matplotlib .pyplot as plt
@@ -408,8 +409,8 @@ def timeSince(since):
408409# ๊ฒฐ๊ณผ ํ๊ฐ
409410# ======================
410411#
411- # ๋คํธ์ํฌ๊ฐ ๋ค๋ฅธ ์นดํ
๊ณ ๋ฆฌ์์ ์ผ๋ง๋ ์ ์๋ํ๋์ง ๋ณด๊ธฐ์ํด
412- # ๋ชจ๋ ์ค์ ์ธ์ด(ํ)๊ฐ ๋คํธ์ํฌ์์ ์ด๋ค ์ธ์ด๋ก ์ถ์ธก(์ด)๋๋์ง๋ฅผ ๋ํ๋ด๋
412+ # ๋คํธ์ํฌ๊ฐ ๋ค๋ฅธ ์นดํ
๊ณ ๋ฆฌ์์ ์ผ๋ง๋ ์ ์๋ํ๋์ง ๋ณด๊ธฐ ์ํด
413+ # ๋ชจ๋ ์ค์ ์ธ์ด(ํ)๊ฐ ๋คํธ์ํฌ์์ ์ด๋ค ์ธ์ด๋ก ์ถ์ธก(์ด)๋๋์ง ๋ํ๋ด๋
413414# ํผ๋ ํ๋ ฌ(confusion matrix)์ ๋ง๋ญ๋๋ค. ํผ๋ ํ๋ ฌ์ ๊ณ์ฐํ๊ธฐ ์ํด
414415# ``evaluate()`` ๋ก ๋ง์ ์์ ์ํ์ ๋คํธ์ํฌ์ ์คํํฉ๋๋ค.
415416# ``evaluate()`` ์ ``train ()`` ๊ณผ ์ญ์ ํ๋ฅผ ๋นผ๋ฉด ๋์ผํฉ๋๋ค.
@@ -428,7 +429,7 @@ def evaluate(line_tensor):
428429
429430 return output
430431
431- # ์์๋ค ์ค์ ์ด๋ค ๊ฒ์ด ์ ํํ๊ฒ ์์ธก๋์๋์ง ๊ธฐ๋ก
432+ # ์์ ์ค ์ด๋ค ๊ฒ์ด ์ ํํ ์์ธก๋์๋์ง ๊ธฐ๋ก
432433for i in range (n_confusion ):
433434 category , line , category_tensor , line_tensor = randomTrainingExample ()
434435 output = evaluate (line_tensor )
@@ -459,10 +460,10 @@ def evaluate(line_tensor):
459460
460461
461462######################################################################
462- # ์ฃผ์ถ์์ ๋ฒ์ด๋ ๋ฐ์ ์ ์ ์ ํํ์ฌ ์๋ชป ์ถ์ธกํ ์ธ์ด๋ฅผ ํ์
463- # ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ๊ตญ์ด๋ ์ค๊ตญ์ด๋ก ์ดํ๋ฆฌ์์ด๋ก ์คํ์ธ์ด๋ก.
464- # ๊ทธ๋ฆฌ์ค์ด๋ ๋งค์ฐ ์๋๋ ๊ฒ์ผ๋ก ์์ด๋ ๋งค์ฐ ๋์๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
465- # (๋ค๋ฅธ ์ธ์ด๋ค๊ณผ ์ค์ฒฉ ๋๋ฌธ์ผ๋ก ์ถ์ )
463+ # ์ฃผ์ถ์์ ๋ฒ์ด๋ ๋ฐ์ ์ ์ ์ ํํ์ฌ ์๋ชป ์ถ์ธกํ ์ธ์ด๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
464+ # ์๋ฅผ ๋ค์ด ํ๊ตญ์ด๋ ์ค๊ตญ์ด๋ก ์ดํ๋ฆฌ์์ด๋ก ์คํ์ธ์ด๋ก.
465+ # ๊ทธ๋ฆฌ์ค์ด๋ ๋งค์ฐ ์๋๋ ๊ฒ์ผ๋ก ์์ด๋ ๋งค์ฐ ๋์ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
466+ # (๋ค๋ฅธ ์ธ์ด๋ค๊ณผ์ ์ค์ฒฉ ๋๋ฌธ์ผ๋ก ์ถ์ )
466467#
467468
468469
@@ -494,12 +495,12 @@ def predict(input_line, n_predictions=3):
494495######################################################################
495496# `์ค์ฉ PyTorch ์ ์ฅ์
496497# <https://github.com/spro/practical-pytorch/tree/master/char-rnn-classification>`__
497- # ์ ์ต์ข
๋ฒ์ ์คํฌ๋ฆฝํธ๋ ์ ์ฝ๋๋ฅผ ๋ช๊ฐ์ ํ์ผ๋ก ๋ถํ ํ์ต๋๋ค.:
498+ # ์ ์ต์ข
๋ฒ์ ์คํฌ๋ฆฝํธ๋ ์ ์ฝ๋๋ฅผ ๋ช ๊ฐ์ ํ์ผ๋ก ๋ถํ ํ์ต๋๋ค.:
498499#
499500# - ``data.py`` (ํ์ผ ์ฝ๊ธฐ)
500501# - ``model.py`` (RNN ์ ์)
501502# - ``train.py`` (ํ์ต ์คํ)
502- # - ``predict.py`` (์ปค๋ฉ๋ ๋ผ์ธ ์ธ์๋ก ``predict()`` ์คํ)
503+ # - ``predict.py`` (์ปค๋งจ๋ ๋ผ์ธ ์ธ์๋ก ``predict()`` ์คํ)
503504# - ``server.py`` (bottle.py๋ฅผ ์ฌ์ฉํ์ฌ JSON API๋ก ์์ธก ์ ๊ณต)
504505#
505506# ํ์ต๊ณผ ๋คํธ์ํฌ ์ ์ฅ์ ์ํด ``train.py`` ์คํ.
@@ -522,7 +523,7 @@ def predict(input_line, n_predictions=3):
522523# ์ฐ์ต
523524# =========
524525#
525- # - "line -> category" ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ์งํฉ์ผ๋ก ์๋ํด๋ณด์ญ์์ค , ์๋ฅผ ๋ค์ด:
526+ # - "line -> category" ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ์งํฉ์ผ๋ก ์๋ํด ๋ณด์ญ์์ค , ์๋ฅผ ๋ค์ด:
526527#
527528# - ๋จ์ด -> ์ธ์ด
528529# - ์ด๋ฆ -> ์ฑ๋ณ
@@ -531,7 +532,7 @@ def predict(input_line, n_predictions=3):
531532#
532533# - ๋ ํฌ๊ณ ๋ ๋์ ๋ชจ์์ ๋คํธ์ํฌ๋ก ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ์ญ์์ค.
533534#
534- # - ๋๋ง์ ์ ํ ๊ณ์ธต์ ์ถ๊ฐํด ๋ณด์ญ์์ค
535- # - ``nn.LSTM`` ๊ณผ ``nn.GRU`` ๊ณ์ธต์ ์ถ๊ฐํด ๋ณด์ญ์์ค
536- # - ์ฌ๋ฌ ๊ฐ์ ์ด๋ฐ RNN์ ์์ ์์ค ๋คํธ์ํฌ๋ก ๊ฒฐํฉํด ๋ณด์ญ์์ค
535+ # - ๋ ๋ง์ ์ ํ ๊ณ์ธต์ ์ถ๊ฐํด ๋ณด์ญ์์ค.
536+ # - ``nn.LSTM`` ๊ณผ ``nn.GRU`` ๊ณ์ธต์ ์ถ๊ฐํด ๋ณด์ญ์์ค.
537+ # - ์์ ๊ฐ์ RNN ์ฌ๋ฌ ๊ฐ๋ฅผ ์์ ์์ค ๋คํธ์ํฌ๋ก ๊ฒฐํฉํด ๋ณด์ญ์์ค.
537538#
0 commit comments