Last active
February 25, 2016 01:24
-
-
Save joumyakun/ac8de526ab7905c944ab to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
""" | |
参考 http://hi-king.hatenablog.com/entry/2015/06/27/194630 | |
クラスタリングの実験 | |
""" | |
import numpy as np | |
import chainer as chnr | |
from chainer import optimizers | |
import chainer.functions as F | |
import matplotlib.pyplot as plt | |
class SmallClassificationModel(chnr.FunctionSet): | |
def __init__(self, dsize, lsize): | |
# dsize:入力ノード数, lsize:出力ノード数 | |
super(SmallClassificationModel, self).__init__( | |
fc1 = F.Linear(dsize, dsize), | |
fc2 = F.Linear(dsize, lsize) | |
) | |
def _forward(self, x): | |
#二層以上かつシグモイド関数を使うところが革新的 | |
h = F.sigmoid(self.fc1(x)) | |
y = self.fc2(h) | |
return y | |
def train(self, x_data, y_data): | |
# データ, ラベルの入力 | |
x = chnr.Variable(x_data.reshape(1, x_data.shape[0]).astype(np.float32), volatile=False) | |
y = chnr.Variable(y_data.astype(np.int32), volatile=False) | |
# ネットワークに入力した結果 | |
h = self._forward(x) | |
# 結果の評価 | |
optimizer.zero_grads() | |
error = F.softmax_cross_entropy(h, y) | |
error.backward() | |
optimizer.update() | |
return h.data.argmax(), error.data | |
datas_and_labels = [ | |
[np.array([0,0]),np.array([0])], | |
[np.array([0,1]),np.array([1])], | |
[np.array([1,0]),np.array([1])], | |
[np.array([1,1]),np.array([0])], | |
]*10000 | |
data_size,label_size = 2, 2 | |
""" | |
datas_and_labels = [ | |
[np.array([0,0,0]),np.array([0])], | |
[np.array([1,0,0]),np.array([1])], | |
[np.array([0,1,0]),np.array([0])], | |
[np.array([0,0,1]),np.array([1])], | |
[np.array([1,1,0]),np.array([0])], | |
[np.array([1,0,1]),np.array([1])], | |
[np.array([0,1,1]),np.array([0])], | |
[np.array([1,1,1]),np.array([1])], | |
]*1000 | |
data_size,label_size = 3, 2 | |
""" | |
""" | |
datas_and_labels = [ | |
[np.array([0,0,0,0]),np.array([0])], | |
[np.array([1,0,0,0]),np.array([1])], | |
[np.array([0,1,0,0]),np.array([1])], | |
[np.array([0,0,1,0]),np.array([1])], | |
[np.array([0,0,0,1]),np.array([1])], | |
[np.array([1,1,0,0]),np.array([2])], | |
[np.array([1,0,1,0]),np.array([2])], | |
[np.array([1,0,0,1]),np.array([2])], | |
[np.array([0,1,1,0]),np.array([2])], | |
[np.array([0,1,0,1]),np.array([2])], | |
[np.array([0,0,1,1]),np.array([2])], | |
[np.array([1,1,1,0]),np.array([3])], | |
[np.array([1,1,0,1]),np.array([3])], | |
[np.array([1,0,1,1]),np.array([3])], | |
[np.array([0,1,1,1]),np.array([3])], | |
[np.array([1,1,1,1]),np.array([4])], | |
]*1000 | |
data_size,label_size = 4, 5 | |
""" | |
model = SmallClassificationModel(data_size, label_size) | |
optimizer = optimizers.MomentumSGD(lr=0.01, momentum=0.9) | |
optimizer.setup(model.collect_parameters()) | |
errors = [] | |
for epoch,(data, label) in enumerate(datas_and_labels): | |
p_class, error = model.train(data, label) | |
errors.append(error) | |
print("---epoch {}---".format(epoch)) | |
print("source label: {l}, data: {d}".format(l=label[0], d=data)) | |
print("predict label: {p}, error: {e}".format(p=p_class, e=error)) | |
plt.plot(errors, "b-") | |
plt.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment