1. 程式人生 > >【深度學習】多層感知器解決異或問題

【深度學習】多層感知器解決異或問題

利用Python 建立兩層感知器,利用W-H學習規則訓練網路權值:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-


import random

import numpy as np
import matplotlib.pyplot as plt

xh_number = 10000


class My_Per:
    def __init__(self, lr=0.1):
        self.lr = lr
        self.errors = []
        self.b1 = random.random()
        self.b2 = random.random()
        self.b0 = random.random()
        self.w1 = [0.12365, -0.12569]
        self.w2 = [0.12365, -0.12569]
        self.w0 = [0.12365, -0.12569]

    def train(self, Px, t, flag):
        update = self.lr * (t - self.predict(Px, flag))
        if flag == 1:
            self.b1 += update
            self.w1[0] += update*Px[0]
            self.w1[1] += update*Px[1]
        elif flag == 2:
            self.b2 += update
            self.w2[0] += update*Px[0]
            self.w2[1] += update*Px[1]
        else:
            self.b0 += update
            self.w0[0] += update*Px[0]
            self.w0[1] += update*Px[1]

    def predict(self, Px, flag):
        if flag == 1:
            number = self.w1[0] * Px[0] + self.w1[1] * Px[1] + self.b1
        elif flag == 2:
            number = self.w2[0] * Px[0] + self.w2[1] * Px[1] + self.b2
        else:
            number = self.w0[0] * Px[0] + self.w0[1] * Px[1] + self.b0

        return np.where(number >= 0, 1, 0)


def main():

    P = [[0, 0], [0, 1], [1, 0], [1, 1]]
    P1 = [[1, 0], [0, 0], [0, 0], [0, 1]]
    T = [0, 1, 1, 0]
    t1 = [1, 0, 0, 0]
    t2 = [0, 0, 0, 1]

    my_per = My_Per(0.1)
    plt.figure()
    plt.plot([0, 0], [0, 1], 'bo')
    plt.plot([1, 1], [0, 1], 'bo')
    flag = 1
    for i in range(xh_number):
        for i in range(4):
             if flag == 1:
                Px = P[i]
                t = t1[i]
                my_per.train(Px, t, flag)
                flag = 2
             elif flag == 2:
                Px = P[i]
                t = t2[i]
                my_per.train(Px, t, flag)
                flag = 0
             else:
                Px = P1[i]
                t = T[i]
                my_per.train(Px, t, flag)
                flag = 1
    x1 = np.arange(-1, 1)
    y1 = -my_per.w1[0]/my_per.w1[1]*x1-my_per.b1/my_per.w1[1]
    plt.plot(x1, y1)
    x2 = np.arange(-1, 1)
    y2 = -my_per.w2[0]/my_per.w2[1]*x1-my_per.b2/my_per.w2[1]
    plt.plot(x2, y2)
    plt.show()


if __name__ == "__main__":
    main()

分類結果(選取2次): 在這裡插入圖片描述 在這裡插入圖片描述