chainer로 신경망 구축

14066 단어 Python3Chainer
'라이브러리를 사용하지 않고 파이썬으로 신경망을 구축해보기' (이하, 전 기사)의 내용을 chainer로 실행해 본다.

전 기사는 매우 알기 쉽고 정중하게 쓰여져 있기 때문에 꼭 일독을 추천한다.

설치



필요한 패키지를 pip로 설치하기 만하면됩니다.
$ pip3 install numpy scipy scikit-learn chainer

실행



IPython Notebook에서 실행

gist에도 올렸습니다.
htps : // 기 st. 기주 b. 코 m / 마우에키 / 네 4 세 4에서 7c689c2b6 아 2df9fd7 아 9 아 0c31

가져오기


import numpy as np
import sklearn.datasets
import matplotlib
import matplotlib.pyplot as plt

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

%matplotlib inline

데이터 생성



전 기사과 정확히 동일
np.random.seed(0)
X,y=sklearn.datasets.make_moons(200,noise=0.20)
plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)



체인 작성


n_units = 3

class Model(Chain):
    def __init__(self):
        super(Model, self).__init__(
            l1=L.Linear(2, n_units),
            l2=L.Linear(n_units, 2),
        )

    def __call__(self, x):
        h1 = F.tanh(self.l1(x))
        y = self.l2(h1)
        return y
Chain 클래스를 상속하고 생성자에서 네트워크를 작성하고 __call__ 메소드에 forward 함수를 작성합니다.

Classifier Chain 작성



softmax 함수를 사용한 손실 함수의 정의 등은 Classifier 클래스가 은폐해 주기 때문에 자작할 필요는 없다
model = L.Classifier(Model())

optimizer 작성



학습, 모델의 갱신은 optimizer가 실시해 준다. 이번에는 전 기사와는 다르지만 알고리즘으로 Adam을 선택 (SDG에서는 만족스러운 결과가되지 않았다)
optimizer = optimizers.Adam()
optimizer.setup(model)

학습


x = Variable(X.astype(np.float32))
t = Variable(y.astype(np.int32))

for _ in range(20000):
    optimizer.update(model, x, t)

chainer에서는 입력값 등을 Variable로 하여 준다. 이 때 입력값은 float32 , 출력값은 int32 로 하지 않으면 에러가 되므로 형 변환을 하고 있는 것에 주의.

결과 표시


def predict(model, x_data):
    x = Variable(x_data.astype(np.float32))
    y = model.predictor(x)
    return np.argmax(y.data, axis=1)

plot_decision_boundary(lambda x: predict(model, x))



원래 기사에 가까운 결과를 얻었습니다.
# https://gist.github.com/dennybritz/ff8e7c2954dd47a4ce5f
def plot_decision_boundary(pred_func):
    # Set min and max values and give it some padding
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    h = 0.01
    # Generate a grid of points with distance h between them
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    # Predict the function value for the whole gid
    Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # Plot the contour and training examples
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)

좋은 웹페이지 즐겨찾기