使用Sigmoid训练一个逻辑与门和逻辑或门
项目 | 内容 |
---|---|
课程内容 | 2019人工智能实战 |
作业要求 | 第五次作业 |
课程目标 | 训练一个逻辑与门和逻辑或门 |
本次作业的帮助 | 熟悉Sigmoid激活函数 |
1.与门
- code
import numpy as np
import matplotlib.pyplot as plt
import math
def Sigmiod(x):
A = 1/(1+np.exp(-x))
return A
def ForwardCal(W, X, B):
Z = np.dot(W,X) + B
A = Sigmiod(Z)
return Z, A
def BackwardCal(X, Y, A, m):
dZ = A - Y
dB = dZ.sum(axis = 1, keepdims = True)/m
dW = np.dot(dZ, X.T)/m
return dW, dB
def CheckLoss(Y, A, m):
p1 = 1 - Y
p2 = np.log(A)
p3 = np.log(1-A)
p4 = np.multiply(Y, p2)
p5 = np.multiply(p1, p3)
Loss = np.sum(-(p4 + p5))
loss = Loss / m
return loss
if __name__=='__main__':
X = np.vstack(([0,0,1,1],[0,1,0,1]))
Y = np.array([0,0,0,1])
n = X.shape[0]
m = X.shape[1]
W = np.zeros((1,n))
B = np.zeros((1,1))
eta = 0.8
max_epoch = 99999
epoch = 0
for epoch in range(max_epoch):
Z, A = ForwardCal(W, X, B)
dW, dB = BackwardCal(X, Y, A, m)
W = W - eta*dW
B = B - eta*dB
loss = CheckLoss(Y, A, m)
if loss <= 1e-3:
break
for i in range(m):
if Y[i] == 0:
plt.plot(X[0,i], X[1,i], '.', c='r')
if Y[i] == 1:
plt.plot(X[0,i], X[1,i], '^', c='g')
a = - (W[0,0] / W[0,1])
b = - (B[0,0] / W[0,1])
x = np.linspace(-0.1,1.1,100)
y = a * x + b
plt.plot(x,y)
plt.axis([-0.1,1.1,-0.1,1.1])
plt.show()
print(W, B)
print(loss)
print(epoch)
- 运算结果
2.或门
- code
import numpy as np
import matplotlib.pyplot as plt
import math
def Sigmiod(x):
A = 1/(1+np.exp(-x))
return A
def ForwardCal(W, X, B):
Z = np.dot(W,X) + B
A = Sigmiod(Z)
return Z, A
def BackwardCal(X, Y, A, m):
dZ = A - Y
dB = dZ.sum(axis = 1, keepdims = True)/m
dW = np.dot(dZ, X.T)/m
return dW, dB
def CheckLoss(Y, A, m):
p1 = 1 - Y
p2 = np.log(A)
p3 = np.log(1-A)
p4 = np.multiply(Y, p2)
p5 = np.multiply(p1, p3)
Loss = np.sum(-(p4 + p5))
loss = Loss / m
return loss
if __name__=='__main__':
X = np.vstack(([0,0,1,1],[0,1,0,1]))
Y = np.array([0,1,1,1])
n = X.shape[0]
m = X.shape[1]
W = np.zeros((1,n))
B = np.zeros((1,1))
eta = 0.8
max_epoch = 99999
epoch = 0
for epoch in range(max_epoch):
Z, A = ForwardCal(W, X, B)
dW, dB = BackwardCal(X, Y, A, m)
W = W - eta*dW
B = B - eta*dB
loss = CheckLoss(Y, A, m)
if loss <= 1e-3:
break
只需修改与门代码中的
Y = np.array([0,0,0,1])
为
Y = np.array([0,1,1,1])
- 运算结果