【自学】深度学习入门 基于python的理论与实现 LESSON1 <感知机的实现>
Rachel MuZy · 收录于 2023-11-21 05:06:41 · source URL
目录
前言
感知机是神经网络的起源算法,本节用感知机解决一些简单问题
一、感知机是什么
(1)感知机接收多个输入信号、输出一个信号。
(2)感知机的信号只有0/1两种取值,本人默认为0表示不传递信号、1表示传递信号
(3)权重越大,对应的信号重要性越高。可以将权重类比为电阻。
二、感知机的实现
1.使用权重和偏置实现与门、非们、与非门
代码:此代码为与门
import numpy as np
results = []
def AND(x_1, x_2):
x_1 = np.array(x_1)
x_2 = np.array(x_2)
b = -0.7
tmp = x_1 * 0.5 + x_2 * 0.5 + b
for i in tmp:
if i <= 0:
result = 0
results.append(result)
else:
result = 1
results.append(result)
return results
output = AND([1, 0, 1], [0, 1, 1])
print(output)
结果:
[0, 0, 1]
注意:
(1)偏置和权重的作用是不一样的:权重是控制输入信号的参数(w1, w2),偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。
(2)与门、与非门、或门具有相同结构的感知机,区别只在于权重和偏置参数的值。
2.感知机的局限性(异或门)
想要实现异或门,单独的感知机是不能实现的,需要多个感知机的叠加。异或门的电路组合如图所示:
代码:
import numpy as np
and_results = []
nand_results = []
or_results = []
def AND(x_1, x_2):
x_1 = np.array(x_1)
x_2 = np.array(x_2)
b = -0.7
and_result = x_1 * 0.5 + x_2 * 0.5 + b
for i in and_result:
if i <= 0:
result_1 = 0
and_results.append(result_1)
else:
result_1 = 1
and_results.append(result_1)
return and_results
def NAND(x_1, x_2):
x_1 = np.array(x_1)
x_2 = np.array(x_2)
nand_result = x_1 * (-0.5) + x_2 * (-0.5) + 0.7
for o in nand_result:
if o <= 0:
result_2 = 0
nand_results.append(result_2)
else:
result_2 = 1
nand_results.append(result_2)
return nand_results
def OR(x_1, x_2):
x_1 = np.array(x_1)
x_2 = np.array(x_2)
or_result = x_1 * 0.5 + x_2 * 0.5 - 0.2
for p in or_result:
if p <= 0:
result_3 = 0
or_results.append(result_3)
else:
result_3 = 1
or_results.append(result_3)
return or_results
def XOR(x_1, x_2):
s1 = NAND(x_1, x_2)
s2 = OR(x_1, x_2)
y = AND(s1, s2)
return y
output = XOR([1, 1, 0, 1], [0, 1, 0, 1])
print(output)
结果:
[1, 0, 0, 0]
注意:
(1)使用两层感知机可以表示异或门
(2)单层感知机只能表示线性空间,多层感知机可以表示非线性空间。
(3)多层感知机理论上可以表示计算机
总结
感知机是一种非常简单的算法,是神经网络的基础。下一节我会学习神经网络。