-
Notifications
You must be signed in to change notification settings - Fork 0
/
train.py
65 lines (49 loc) · 1.87 KB
/
train.py
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# coding: utf-8
import random
import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, Variable, \
optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
import animeface
import net
batchsize = 100
n_epoch = 100
train_rate = 0.8
def train():
model = L.Classifier(net.MyChain())
optimizer = optimizers.SGD()
optimizer.setup(model)
dataset = animeface.load_dataset()
N = int(len(dataset) * train_rate)
N_test = len(dataset) - N
for epoch in range(n_epoch):
print "epoch {0}".format(epoch)
random.shuffle(dataset)
data = np.array([x[0] for x in dataset], np.float32)
target = np.array([x[1] for x in dataset], np.int32)
x_train, x_test = np.split(data, [N])
y_train, y_test = np.split(target, [N])
indexes = np.random.permutation(N)
sum_loss, sum_accuracy = 0, 0
for i in range(0, N, batchsize):
x = Variable(x_train[indexes[i: i + batchsize]])
t = Variable(y_train[indexes[i: i + batchsize]])
optimizer.update(model, x, t)
sum_loss += float(model.loss.data) * batchsize
sum_accuracy += float(model.accuracy.data) * batchsize
print "train loss={0}, accuracy={1}".format(sum_loss/N, sum_accuracy/N)
sum_loss, sum_accuracy = 0, 0
for i in range(0, N_test, batchsize):
x = Variable(x_test[i: i + batchsize])
t = Variable(y_test[i: i + batchsize])
loss = model(x, t)
sum_loss += float(loss.data) * batchsize
sum_accuracy += float(model.accuracy.data) * batchsize
print "test loss={0}, accuracy={1}".format(
sum_loss/N_test, sum_accuracy/N_test)
serializers.save_npz("animeface.model", model)
if __name__ == "__main__":
train()