2019人工智能实战 第五次作业 段峙宇

使用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])
  • 运算结果

猜你喜欢

转载自www.cnblogs.com/dzysblog/p/10672815.html