| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |
- ๋ฐฑ์ค
- ํ
- ๋ฌธ์์ด
- SQLDDL
- ์ ์ฌ์์๋ชจ๋ธ
- ์ธ๋๋ณ๊ฐ๋น์ง์ปฌ๋ ํฐ
- ์ฌ์ดํท๋ฐ
- DROPTABLE
- ํ์ด์ฌ
- TDD
- SQL
- latent factor
- ์ปจํ ์ด๋๊ฐ์ฒด
- ๋ฌด๊ฒฐ์ฑ
- ๋ถ๊ฝ๋ฐ์ดํฐ์
- knn_classify
- ๋ฌด๊ฒฐ์ฑ์ ์ง
- ๋ฌด๊ฒฐ์ฑ์ ์ง๋ฉ์ปค๋์ฆ
- Hyperlink Graphs
- ํด๋ฆฐ์ฝ๋
- ALTERTABLE
- ํค ์ข ๋ฅ
- ์๊ณ ๋ฆฌ์ฆ
- RENAMETABLE
- sklearn
- CREATETABLE
- ์ฃผ์ฑ๋ถ ์ฐพ๊ธฐ
- Python
- Key ์ข ๋ฅ
- latent factor model
- Today
- Total
DonHurry
step50. ๋ฏธ๋๋ฐฐ์น๋ฅผ ๋ฝ์์ฃผ๋ DataLoader ๋ณธ๋ฌธ
๐ข ๋ณธ ํฌ์คํ ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์์ํ๋ ๋ฅ๋ฌ๋3์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ต๋๋ค. ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ , ๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ๋ ํฌ์คํ ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ต์ฌ ๊ตฌ๋งค๋ฅผ ๊ฐ๋ ฅ ์ถ์ฒ๋๋ฆฝ๋๋ค.

์ ๋ฒ ๋จ๊ณ์์๋ ๋ฐ์ดํฐ์ ์ค ์ผ๋ถ๋ฅผ ๋ฏธ๋๋ฐฐ์น๋ก ๋ฝ์ ํ์ต์์ผฐ์ต๋๋ค. ์ด๋ฒ ๋จ๊ณ์์๋ ์ด๋ฌํ ๊ณผ์ ์ DataLoader ํด๋์ค๋ก ๊ตฌํํฉ๋๋ค. DataLoader๋ ๋ฏธ๋๋ฐฐ์น ์์ฑ, ๋ฐ์ดํฐ์ ์๊ธฐ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฐ์ ํ์ด์ฌ์ ๋ฐ๋ณต์์ ๋ํด ์๊ณ ์์ด์ผ ํฉ๋๋ค.
์ ์ ๋ฆฌ๋ ๊ธ์ ์๋ ๋งํฌ์ ์ฒจ๋ถํ๋, ์ฐธ๊ณ ๋ฐ๋๋๋ค.
[Python] ๋ณผ ๋๋ง๋ค ํท๊ฐ๋ฆฌ๋ Iterable, Iterator, Generator ์ ๋ฆฌํ๊ธฐ
Iterable vs Iterator vs Generator ๋ค๋ฅธ ๋ถ๋ค์ ์ฝ๋๋ฅผ ์ฝ์ ๋๋ง๋ค, ๋ด๊ฐ ์ฌ์ฉํ ๋๋ง๋ค, ํท๊ฐ๋ฆฌ๋ Iterable, Iterator, Generator๋ฅผ ์ด๋ฒ ๊ธ์ ์์ฑํด๋ณด๋ฉด์, ๋ง์ง๋ง์ผ๋ก! (๋ผ๋ ๋ค์ง์ผ๋ก) ์ ๋ฆฌํด๋ด ๋๋ค. ์ ์๊ณ
emjayahn.github.io
ํ์ด์ฌ์์๋ ๋ฐ๋ณต์๋ฅผ ์ง์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ ์ฝ๋๊ฐ ๊ณ ์ ํ ๋ฐ๋ณต์๋ฅผ ๋ง๋๋ ์์์ ๋๋ค. __iter__๋ผ๋ ํน์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ์๊ธฐ ์์ ์ ๋ฐํํ๋๋ก ํฉ๋๋ค. ๋ค์ ์์ ๋ฐํ์ __next__๋ฅผ ํ์ฉํฉ๋๋ค.
class MyIterator:
def __init__(self, max_cnt):
self.max_cnt = max_cnt
self.cnt = 0
def __iter__(self):
return self
def __next__(self):
if self.cnt == self.max_cnt:
raise StopIteration()
self.cnt += 1
return self.cnt
๊ธฐ๋ณธ ๊ฐ๋ ์ ๊ณต๋ถํ์์ผ๋, ์ด์ ๋ DataLodaer๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ์ด๊ธฐํ ์ฝ๋์์ ์ธ์๋ฅผ ์ธ์คํด์ค ๋ณ์๋ก ์ ์ฅํ๊ณ , reset ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. reset ๋ฉ์๋์์๋ ์ธ์คํด์ค ๋ณ์์ ๋ฐ๋ณต ํ์๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ , ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ค์์์ง ๊ฒฐ์ ํฉ๋๋ค. __next__ ๋ฉ์๋๊ฐ ๋ฏธ๋๋ฐฐ์น๋ฅผ ๊บผ๋ด ndarray ์ธ์คํด์ค๋ก ๋ณํํ๋ ์ฝ๋์ ๋๋ค. ์ง๊ธ๊น์ง ์ฌ์ฉํ๋ ์ฝ๋์ ๊ฐ์ผ๋ฏ๋ก ์ค๋ช ์ ์๋ตํ๊ฒ ์ต๋๋ค.
import math
import numpy as np
class DataLoader:
def __init__(self, dataset, batch_size, shuffle=True):
self.dataset = dataset # Dataset ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑํ๋ ์ธ์คํด์ค
self.batch_size = batch_size
self.shuffle = shuffle
self.data_size = len(dataset)
self.max_iter = math.ceil(self.data_size / batch_size)
self.reset()
def reset(self):
self.iteration = 0
if self.shuffle:
self.index = np.random.permutation(len(self.dataset))
else:
self.index = np.arange(len(self.dataset))
def __iter__(self):
return self
def __next__(self):
if self.iteration >= self.max_iter:
self.reset()
raise StopIteration
i, batch_size = self.iteration, self.batch_size
batch_index = self.index[i * batch_size:(i + 1) * batch_size]
batch = [self.dataset[i] for i in batch_index]
x = np.array([example[0] for example in batch])
t = np.array([example[1] for example in batch])
self.iteration += 1
return x, t
def next(self):
return self.__next__()
๋ณธ๊ฒฉ์ ์ธ ํ์ต ์ด์ ์ ์ ํ๋๋ฅผ ํ๊ฐํ๋ accuracy ํจ์๋ฅผ ๊ตฌํํ๊ฒ ์ต๋๋ค. ์ธ์ y์ t๋ฅผ ๋ฐ์ ์ ๋ต๋ฅ ์ ๊ณ์ฐํด์ค๋๋ค. ์ฐธ๊ณ ๋ก ์๋์ ๊ฐ์ด np.ndarray ๋ฐ์ดํฐ ํ์ ์ (pred == t.data) ์ฒ๋ผ ๋น๊ตํ๋ฉด ๊ฐ ์์๋ง๋ค ์ผ์น ๋ถ์ผ์น๋ฅผ [True True False] ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐํํด์ค๋๋ค. (ํ์ด์ฌ์ ๋ฆฌ์คํธ๋ฅผ ๋น๊ตํ๋ฉด ๋ฆฌ์คํธ ์ ์ฒด ์์๊ฐ ๊ฐ์์ง ๋ค๋ฅธ์ง ํ๋์ ๋ถ๋ฆฌ์ธ ํ์ ์ ๋ฐํํฉ๋๋ค.)
def accuracy(y, t):
y, t = as_variable(y), as_variable(t)
pred = y.data.argmax(axis=1).reshape(t.shape)
result = (pred == t.data)
acc = result.mean()
return Variable(as_array(acc))
์ด์ ์คํ์ด๋ ๋ฐ์ดํฐ์ ์ ํ์ฉํ์ฌ ํ์ต์ ์งํํฉ๋๋ค. ์ด๋ฒ์๋ train๊ณผ test์ฉ์ ๋๋์ด์ ์งํํฉ๋๋ค. ํ ์คํธ ์์๋ ์ญ์ ํ๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ์ด์ ์ ๊ตฌํํ๋ with dezero.no_grad() ๋ฅผ ํ์ฉํด ์์ ์๋ชจ๋ฅผ ํผํฉ๋๋ค.
import dezero
import dezero.functions as F
from dezero import optimizers
from dezero import DataLoader
from dezero.models import MLP
max_epoch = 300
batch_size = 30
hidden_size = 10
lr = 1.0
train_set = dezero.datasets.Spiral(train=True)
test_set = dezero.datasets.Spiral(train=False)
train_loader = DataLoader(train_set, batch_size)
test_loader = DataLoader(test_set, batch_size, shuffle=False)
model = MLP((hidden_size, 3))
optimizer = optimizers.SGD(lr).setup(model)
for epoch in range(max_epoch):
sum_loss, sum_acc = 0, 0
for x, t in train_loader:
y = model(x)
loss = F.softmax_cross_entropy(y, t)
acc = F.accuracy(y, t)
model.cleargrads()
loss.backward()
optimizer.update()
sum_loss += float(loss.data) * len(t)
sum_acc += float(acc.data) * len(t)
print('epoch: {}'.format(epoch + 1))
print('train loss: {:.4f}, accuracy: {:.4f}'.format(
sum_loss / len(train_set), sum_acc / len(train_set)))
sum_loss, sum_acc = 0, 0
with dezero.no_grad():
for x, t in test_loader:
y = model(x)
loss = F.softmax_cross_entropy(y, t)
acc = F.accuracy(y, t)
sum_loss += float(loss.data) * len(t)
sum_acc += float(acc.data) * len(t)
print('test loss: {:.4f}, accuracy: {:.4f}'.format(
sum_loss / len(test_set), sum_acc / len(test_set)))
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ํ๋ก ๋ํ๋ด๋ฉด epoch์ด ์งํ๋ ์๋ก loss๊ฐ ๋ฎ์์ง๊ณ ์ ํ๋๊ฐ ์์นํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ํ์ต์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง๊ณ ์์ผ๋ฉฐ, train๊ณผ test์ ์ฐจ์ด๊ฐ ์์ผ๋ฏ๋ก ๋ชจ๋ธ์ด ๊ณผ๋์ ํฉ ๋ฌธ์ ๋ ์ผ์ผํค์ง ์์์ต๋๋ค. ๋ค์ ๋จ๊ณ์์๋ ์คํ์ด๋ด ๋ฐ์ดํฐ์ ๋์ MNIST ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.

'DeZero > ๐ป์ 4๊ณ ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| step49. Dataset ํด๋์ค์ ์ ์ฒ๋ฆฌ (0) | 2023.03.01 |
|---|---|
| step48. ๋ค์ค ํด๋์ค ๋ถ๋ฅ (0) | 2023.02.28 |
| step47. ์ํํธ๋งฅ์ค ํจ์์ ๊ต์ฐจ ์ํธ๋กํผ ์ค์ฐจ (0) | 2023.02.27 |
| step46. Optimizer๋ก ์ํํ๋ ๋งค๊ฐ๋ณ์ ๊ฐฑ์ (0) | 2023.02.25 |
| step45. ๊ณ์ธต์ ๋ชจ์๋๋ ๊ณ์ธต (0) | 2023.02.24 |