深度学习理论基础4-简单逻辑电路的感知机实现

接下来我们小试牛刀,为感知机设定权重及阀值,实现一些简单的逻辑电路。

----------------------------------------------------与门------------------------------------------------------------

让我讲一个与门的故事,从前有个叫‘与门’的门会在两个输入都为1的情况下输出1,其他情况输出0。全剧终!

现在我们创造一个感知机,用于模拟与门的功能。

 (w 1 , w 2 , θ) =(0.5, 0.5, 0.7)    ---->验证一下:

输入0,0时:0*0.5+0*0.5<0.7--输出0

输入1,0时:1*0.5+0*0.5<0.7--输出0

输入0,1时:0*0.5+1*0.5<0.7--输出0

输入1,1时:1*0.5+1*0.5>0.7--输出1

嗯,果然和与门一模一样。

既然创建感知机这么简单,我们再创建10000个感知机

 (w 1 , w 2 , θ) =(0.5, 0.5, 0.8)

 (w 1 , w 2 , θ) =(1.0, 1.0, 1.0)

。。。。。。

实际上实现这种功能的感知机有无数个。

----------------------------------------------------与非门------------------------------------------------------------

'与非门'也就是'与门'的死对头。它的输出和'与门'完全相反。除了输入(1,1)时输出为0外,其他情况输出1。

我们同样创造了一些实现'与非门'逻辑的感知机。请自行验证。

(w 1 , w 2 , θ) =(-0.5,- 0.5, -0.7) 

 (w 1 , w 2 , θ) =(-0.5, -0.5, -0.8)

 (w 1 , w 2 , θ) =(-1.0, -1.0, -1.0)

眼尖的你已经发现我只是把'与门'的参数全部进行了取反。为什么呢?聪明的你花费1至+∞分钟思考其中的逻辑吧。

----------------------------------------------------或门------------------------------------------------------------

或门:只要有一个输入信号是1,输出就为1

惯例,让我们创造一些'或门'感知机。

(w 1 , w 2 , θ) =(1.0,1.0,0.9)

(w 1 , w 2 , θ) =(0.8,0.8,0.7)

(w 1 , w 2 , θ) =(0.2,0.3,0.1)

----------------------------------------------------感知机的实现------------------------------------------------------------

以与门为例:

#与门
def AND(x1,x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1 * w1 + x2 * w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1

或者我们应该使用numpy实现相同的功能:

#用np实现与门
def AND(x1,x2):
    x=np.array([x1,x2])
    w=np.array([0.5,0.5])
    b=-0.7
    tem=np.sum(x*w)+b
    return 1 if tem>0 else 0

眼尖的你已经发现,我偷偷把权重变成了负值。并且修改了后面的判断逻辑。这是一个简单的转换,一图便知。

之所以这么做。是因为我们已经对原理有了认识,应该向便于使用的方向渐进。这个公式对后面的学习及应用更加方便。

----------------------------------------------------与非门感知机的实现------------------------------------------------------------

#用np实现与非门
def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
    b = 0.7
    tem=np.sum(x*w)+b
    return 1 if tem>0 else 0

----------------------------------------------------或门感知机的实现------------------------------------------------------------

#用np实现或门
def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.2, 0.3]) # 仅权重和偏置与AND不同!
    b = -0.1
    tem=np.sum(x*w)+b
    return 1 if tem>0 else 0

 ----------------------------------------------------运行下面的代码验证我们的感知机------------------------------------------------------------

def main():
    print(AND(0, 0),end='|')  # 输出0
    print(AND(1, 0),end='|')  # 输出0
    print(AND(0, 1),end='|')  # 输出0
    print(AND(1, 1),end='|')  # 输出1
    print()
    print(NAND(0, 0),end='|')  # 输出1
    print(NAND(1, 0),end='|')  # 输出1
    print(NAND(0, 1),end='|')  # 输出1
    print(NAND(1, 1),end='|')  # 输出0
    print()
    print(OR(0, 0),end='|')  # 输出0
    print(OR(1, 0),end='|')  # 输出1
    print(OR(0, 1),end='|')  # 输出1
    print(OR(1, 1),end='|')  # 输出1
    print()

if __name__=='__main__':
    main()

拿眼珠子可以看到,结果与我们期待的结果完全一致。

 ----------------------------------------------------结语------------------------------------------------------------

做完上面那些你可能已经激动难耐,毕竟修改下参数就可以‘做任何事情’。但不要妄图这样就能创造人工智能,然后机器人反叛,一统天下。你会在下一节看到感知机的局限性。

猜你喜欢

转载自blog.csdn.net/qq_40878431/article/details/85370158