【Chainer】 다층 퍼셉트론에 의한 XOR 학습

소개



Chainer를 사용하고 싶다. 하지만 잘 모르겠다.
그렇다, 다층 퍼셉트론에 의한 XOR의 학습으로부터 처음 보자.

※Chainer를 사용할 수 있는 환경이 갖추어져 있는 전제로 본 기사는 쓰여져 있습니다.

이 기사에서 사용하는 코드
  • GitHub/ichiroex/xor-mlp-chainer

  • 환경


  • 파이썬 2.7 시스템
  • chainer 1.6.2.1

  • 학습 데이터


    # Prepare dataset
    source = [[0, 0], [1, 0], [0, 1], [1, 1]]
    target = [[0], [1], [1], [0]]
    dataset = {}
    dataset['source'] = np.array(source, dtype=np.float32)
    dataset['target'] = np.array(target, dtype=np.float32)
    

    모델 정의



    이번 이용하는 모델은 2입력, 1출력입니다.
    N = len(source) # train data size
    
    in_units  = 2   # 入力層のユニット数
    n_units   = 2   # 隠れ層のユニット数
    out_units = 1   # 出力層のユニット数
    
    #モデルの定義
    model = chainer.Chain(l1=L.Linear(in_units, n_units),
                          l2=L.Linear(n_units , out_units))
    
    

    순전파


    def forward(x, t):
        h1 = F.sigmoid(model.l1(x))
        return model.l2(h1)
    

    학습



    훈련 오차가 0.00001 미만이거나 epoch가 n_epoch 이상이 될 때까지 반복합니다.
    # Setup optimizer
    optimizer = optimizers.Adam()
    optimizer.setup(model)
    
    # Learning loop
    loss_val = 100
    epoch = 0
    while loss_val > 1e-5:
    
        # training
        x = chainer.Variable(xp.asarray(dataset['source'])) #source
        t = chainer.Variable(xp.asarray(dataset['target'])) #target
    
        model.zerograds()       # 勾配をゼロ初期化
        y    = forward(x, t)    # 順伝搬
    
        loss = F.mean_squared_error(y, t) #平均二乗誤差
    
        loss.backward()              # 誤差逆伝播
        optimizer.update()           # 最適化 
    
        # 途中結果を表示
        if epoch % 1000 == 0:
            #誤差と正解率を計算
            loss_val = loss.data
    
            print 'epoch:', epoch
            print 'x:\n', x.data
            print 't:\n', t.data
            print 'y:\n', y.data
    
            print('train mean loss={}'.format(loss_val)) # 訓練誤差, 正解率
            print ' - - - - - - - - - '
    
        # n_epoch以上になると終了
        if epoch >= n_epoch:
            break
    
        epoch += 1
    
    #modelとoptimizerを保存
    print 'save the model'
    serializers.save_npz('xor_mlp.model', model)
    print 'save the optimizer'
    serializers.save_npz('xor_mlp.state', optimizer)
    

    실행 결과



    회귀 문제로 학습하고 있습니다.
    예측할 때는 0.5이상이라면 1, 0.5미만이라면 0과 같이 역치를 결정할 필요가 있습니다.
    $ python train_xor.py --gpu 1
    epoch: 0
    x:
    [[ 0.  0.]
     [ 1.  0.]
     [ 0.  1.]
     [ 1.  1.]]
    t:
    [[ 0.]
     [ 1.]
     [ 1.]
     [ 0.]]
    y:
    [[-0.62479508]  # 0に近づいて欲しい
     [-0.85900736]  # 1に近づいて欲しい
     [-0.4117983 ]  # 1に近づいて欲しい
     [-0.62129647]] # 0に近づいて欲しい
    train mean loss=1.55636525154  # 訓練誤差 (小さくなってほしい)
     - - - - - - - - -
    epoch: 1000
    x:
    [[ 0.  0.]
     [ 1.  0.]
     [ 0.  1.]
     [ 1.  1.]]
    t:
    [[ 0.]
     [ 1.]
     [ 1.]
     [ 0.]]
    y:
    [[ 0.39130747]
     [ 0.40636665]
     [ 0.50217605]
     [ 0.52426183]]
    train mean loss=0.257050335407
     - - - - - - - - -
    
    ...
    
    
     - - - - - - - - -
    epoch: 8000
    x:
    [[ 0.  0.]
     [ 1.  0.]
     [ 0.  1.]
     [ 1.  1.]]
    t:
    [[ 0.]
     [ 1.]
     [ 1.]
     [ 0.]]
    y:
    [[ 0.00557911]
     [ 0.98262894]
     [ 0.98446763]
     [ 0.02371788]]
    train mean loss=0.000284168170765
     - - - - - - - - -
    epoch: 9000
    x:
    [[ 0.  0.]
     [ 1.  0.]
     [ 0.  1.]
     [ 1.  1.]]
    t:
    [[ 0.]
     [ 1.]
     [ 1.]
     [ 0.]]
    y:
    [[  5.99622726e-05] # 0に近づいた
     [  9.99812365e-01] # 1に近づいた
     [  9.99832511e-01] # 1に近づいた
     [  2.56299973e-04]] # 0に近づいた
    train mean loss=3.31361960093e-08
     - - - - - - - - -
    save the model
    save the optimizer
    
    



    참고 기사


  • XOR 학습
  • chainer에서 신경망을 배우자 (chainer에서 신경망 2)
  • 좋은 웹페이지 즐겨찾기