| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ํ
- ๋ฌด๊ฒฐ์ฑ์ ์ง
- ALTERTABLE
- sklearn
- ์ฌ์ดํท๋ฐ
- ํด๋ฆฐ์ฝ๋
- latent factor model
- CREATETABLE
- RENAMETABLE
- ํค ์ข ๋ฅ
- ํ์ด์ฌ
- ์ ์ฌ์์๋ชจ๋ธ
- SQL
- Hyperlink Graphs
- ๋ฌด๊ฒฐ์ฑ์ ์ง๋ฉ์ปค๋์ฆ
- ์๊ณ ๋ฆฌ์ฆ
- TDD
- ๋ฐฑ์ค
- latent factor
- Python
- ์ฃผ์ฑ๋ถ ์ฐพ๊ธฐ
- knn_classify
- ๋ฌธ์์ด
- ์ปจํ ์ด๋๊ฐ์ฒด
- ์ธ๋๋ณ๊ฐ๋น์ง์ปฌ๋ ํฐ
- ๋ฌด๊ฒฐ์ฑ
- SQLDDL
- ๋ถ๊ฝ๋ฐ์ดํฐ์
- Key ์ข ๋ฅ
- DROPTABLE
- Today
- Total
DonHurry
step44. ๋งค๊ฐ๋ณ์๋ฅผ ๋ชจ์๋๋ ๊ณ์ธต ๋ณธ๋ฌธ
๐ข ๋ณธ ํฌ์คํ ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์์ํ๋ ๋ฅ๋ฌ๋3์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ต๋๋ค. ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ , ๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ๋ ํฌ์คํ ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ต์ฌ ๊ตฌ๋งค๋ฅผ ๊ฐ๋ ฅ ์ถ์ฒ๋๋ฆฝ๋๋ค.

์ ๋จ๊ณ์์๋ ๋จ์ํ์ง๋ง ์ ๊ฒฝ๋ง์ ๊ตฌํํด๋ณด์์ต๋๋ค. ์ด์ DeZero๋ ์ ๊ฒฝ๋ง ํ๋ ์์ํฌ์ ๊ตฌ์์ ๊ฐ์ถ๊ณ ์์ง๋ง, ์ฌ์ฉ ํธ์์ฑ ์ธก๋ฉด์์๋ ๋ณด์ํ ์ ์ด ๋ง์ต๋๋ค. ์ด๋ฒ ๋จ๊ณ์์๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ด๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. Parameter์ Layer๋ผ๋ ํด๋์ค๋ฅผ ๊ตฌํํ๊ณ , ์ด๋ฅผ ํตํด ๋งค๊ฐ๋ณ์ ๊ด๋ฆฌ๋ฅผ ์๋ํํฉ๋๋ค.
Parameter ํด๋์ค๋ ์๋ ๋ด์ฉ์ด ๋ค์ ๋๋ค. Variable ํด๋์ค์ ๋์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ง๋๋ค. ๋ฌผ๋ก Variable ์ธ์คํด์ค์ Parameter ์ธ์คํด์ค๋ ๊ตฌ๋ณ์ด ๊ฐ๋ฅํฉ๋๋ค.
class Parameter(Variable):
pass
Layer ํด๋์ค๋ Function ํด๋์ค์ฒ๋ผ ๋ณ์๋ฅผ ๋ณํํ๋ ํด๋์ค์ง๋ง, Function ํด๋์ค์ ๋ฌ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์งํฉ๋๋ค. ์ค๋ช ์ ์๋์์ ์ด์ด๋๊ฐ๊ฒ ์ต๋๋ค.
class Layer:
def __init__(self):
self._params = set()
def __setattr__(self, name, value):
if isinstance(value, Parameter):
self._params.add(name)
super().__setattr__(name, value)
def __call__(self, *inputs):
outputs = self.forward(*inputs)
if not isinstance(outputs, tuple):
outputs = (outputs,)
self.inputs = [weakref.ref(x) for x in inputs]
self.outputs = [weakref.ref(y) for y in outputs]
return outputs if len(outputs) > 1 else outputs[0]
def forward(self, inputs):
raise NotImplementedError()
def params(self):
for name in self._params:
yield self.__dict__[name]
def cleargrads(self):
for param in self.params():
param.cleargrad()
Layer ํด๋์ค๋ _params๋ผ๋ ์ธ์คํด์ค ๋ณ์๋ฅผ ๋๊ณ , ๋งค๊ฐ๋ณ์๋ฅผ ๋ณด๊ดํฉ๋๋ค. ์ด๋ __setattr__์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ค์ ํ ๋ ํธ์ถ๋๋ ํน์ ๋ฉ์๋๋ก, ์ด ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ์ปค์คํ ๋ก์ง์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ value๊ฐ Parameter ์ธ์คํด์ค์ธ ๊ฒฝ์ฐ self._params์ name์ ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค.
__call__ ๋ฉ์๋๋ Function ํด๋์ค์ ๋น์ทํ๊ฒ ๊ตฌํ๋์ด ์์ต๋๋ค. params ๋ฉ์๋์ ๊ฒฝ์ฐ Layer ์ธ์คํด์ค์ ์๋ Parameter ์ธ์คํด์ค๋ฅผ ๊บผ๋ด์ฃผ๊ณ , cleargrads ๋ฉ์๋๋ ๋ชจ๋ ๋งค๊ฐ๋ณ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
Layer ํด๋์ค์ ๊ฒฝ์ฐ base ํด๋์ค์ด๊ณ , ๋ค๋ฅธ ํด๋์ค๋ค์ ์ด๋ฅผ ์์๋ฐ์ ๊ตฌํํฉ๋๋ค. ์ด๋ฒ์๋ Linear ํด๋์ค๋ฅผ ๊ตฌํํฉ๋๋ค. __init__์ ์ธ์๋ ์์๋๋ก ์ถ๋ ฅ ํฌ๊ธฐ, ํธํฅ ์ฌ์ฉ ์ฌ๋ถ ํ๋๊ทธ, ๋ฐ์ดํฐ ํ์ , ์ ๋ ฅ ํฌ๊ธฐ์ ๋๋ค. ํน์ดํ ์ ์ ๊ฐ์ค์น W๋ฅผ ์์ฑํ๋ ์์ ์ ๋ฆ์ถ ๊ฒ์ ๋๋ค. ๊ฐ์ค์น๋ฅผ __init__ ๋ฉ์๋๊ฐ ์๋ forward ๋ฉ์๋์์ ์์ฑํจ์ผ๋ก์จ Linear ํด๋์ค์ ์ ๋ ฅ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ง์ ํ์ง ์์๋ ๋๋ ๊ฒ์ด์ฃ .
class Linear(Layer):
def __init__(self, out_size, nobias=False, dtype=np.float32, in_size=None):
super().__init__()
self.in_size = in_size
self.out_size = out_size
self.dtype = dtype
self.W = Parameter(None, name='W')
# in_size๊ฐ ์ง์ ๋์ด ์์ง ์๋ ๊ฒฝ์ฐ ๋์ค์ผ๋ก ์ฐ๊ธฐ
if self.in_size is not None:
self._init_W()
if nobias:
self.b = None
else:
self.b = Parameter(np.zeros(out_size, dtype=dtype), name='b')
def _init_W(self):
I, O = self.in_size, self.out_size
W_data = np.random.randn(I, O).astype(self.dtype) * np.sqrt(1 / I)
self.W.data = W_data
def forward(self, x):
# ๋ฐ์ดํฐ๋ฅผ ํ๋ ค๋ณด๋ด๋ ์์ ์ ๊ฐ์ค์น ์ด๊ธฐํ
if self.W.data is None:
self.in_size = x.shape[1]
self._init_W()
y = F.linear(x, self.W, self.b)
return y
์ด์ ํ ์คํธ๋ฅผ ์งํํฉ๋๋ค. ์ด์ ๋จ๊ณ์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ํ ์คํธ ์ฝ๋์ง๋ง ํจ์ฌ ๋ ๊ฐ๊ฒฐํด์ก์ต๋๋ค. ๋งค๊ฐ๋ณ์ ๊ด๋ฆฌ๋ฅผ Linear ์ธ์คํด์ค๊ฐ ๋งก๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค์ ๋จ๊ณ์์๋ ์ฌ๋ฌ Layer๋ฅผ ํ๋์ ํด๋์ค๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํ๋๋ก ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
import numpy as np
from dezero import Variable
import dezero.functions as F
import dezero.layers as L
# dataset
np.random.seed(0)
x = np.random.rand(100, 1)
y = np.sin(2 * np.pi * x) + np.random.rand(100, 1)
l1 = L.Linear(10) # output size
l2 = L.Linear(1)
def predict(x):
y = l1(x)
y = F.sigmoid(y)
y = l2(y)
return y
lr = 0.2
iters = 10000
for i in range(iters):
y_pred = predict(x)
loss = F.mean_squared_error(y, y_pred)
l1.cleargrads()
l2.cleargrads()
loss.backward()
for l in [l1, l2]:
for p in l.params():
p.data -= lr * p.grad.data
if i % 1000 == 0:
print(loss)'DeZero > ๐ป์ 4๊ณ ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| step46. Optimizer๋ก ์ํํ๋ ๋งค๊ฐ๋ณ์ ๊ฐฑ์ (0) | 2023.02.25 |
|---|---|
| step45. ๊ณ์ธต์ ๋ชจ์๋๋ ๊ณ์ธต (0) | 2023.02.24 |
| step 43. ์ ๊ฒฝ๋ง (0) | 2023.02.19 |
| step42. ์ ํ ํ๊ท (0) | 2023.02.18 |
| step41. ํ๋ ฌ์ ๊ณฑ (0) | 2023.02.16 |