【深度學習】多層感知器解決異或問題
阿新 • • 發佈:2018-12-14
利用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次):