【深度学习】多层感知器解决异或问题
利用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次):