前言
本文主要记录自己学习神经网络的过程,写成博客就当是在温习知识的同时也可以在日后复习。也希望个位志同道合的朋友每天进步,愿csdn照亮您的事业和前程。
一、深度学习是什么?
简单来说深度学习就是今年来随着人工智能兴起的,当今在机器人、人工智能、人脸检测、图像识别等领域广泛应用的机器学习的算法。
二、使用步骤
1.引入库:本案例主要用到两个库numpy和matplotlib
import numpy as np
import matplotlib.pyplot as plt
2.明确思路
首先我们先来分析一下思路,异或就是两个输入相同的时候出0,不同时出1。我们先做如下定义:输入x1,x2都为0或者1时为负样本用-1表示;x1,x2不相同时为正样本用1表示。
因为我们要区分两类样本所以靠单单的一层线性网络(单层感知器)是无法实现的,所以我们要加一个隐藏层。这里采用增加非线性输入的方式来产生非线性成分
确定输入x0,x1,x2,x1^2,x2*x1,x2^2,其中x0是偏置设定为1,权重的范围为-1到1,激活函数选sign函数即y=x。
-
x0 x1 x2 x1^2 x1*x2 x2^2 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 - 输入层乘以权重后的展开(这边只写了一行,其他的类似)
这里我们把x1,x2看做x,y这样上式就是y关于x的一元二次函数,其中的w0到w5都为常量,x0得值为设定的1。用求根公式求出两个根
-
用plt以xdata(-1,2)为横坐标,求出的根为纵坐标生成两条曲线
代码呈现:
import numpy as np
import matplotlib.pyplot as plt
# 区分异或 激活函数y=x
x = np.array([[1,0,0,0,0,0],
[1,0,1,0,0,1],
[1,1,0,1,0,0],
[1,1,1,1,1,1]])
l = np.array([-1,1,1,-1])
b = 0.52 # 学习率
n = 0
w = 0
def update():
global w
global l
global y
global b
global n
w = -1+np.random.random(6)*2 # 产生-1到1的数
r = np.dot(x,w.T) # np.dot 矩阵相乘
wc = b*((l-r.T).dot(x))/x.shape[0] # 误差:学习率乘以原矩阵和标签矩阵的积 要除以x矩阵的行数使数据不会过大 (l-r.T).dot(x)也为矩阵的乘法运算 x.dot(x)
n = n + 1
w = w + wc # 更新权值
for _ in range(10000):
update()
print("权矩阵为",w)
x1 = [0,1] #np.random.randint(low=0,high=3,size=2)
#print(x1)
y1 = [1,0]
x2 = [0,1]
y2 = [0,1]
def caculater(x,root):
a = w[5]
b = w[2]+x*w[4]
c = w[1]*x+w[0]+x*x*w[3]
if (root == 1):
return (-b + np.sqrt(abs(b * b - 4 * a * c))) / (2 * a)
elif(root == 2):
return (-b - np.sqrt(abs(b * b - 4 * a * c))) / (2 * a)
xdata = np.linspace(-1,2) # 均匀生成步长
plt.figure()
plt.plot(xdata,caculater(xdata,1),'r')
plt.plot(xdata,caculater(xdata,2),'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.rcParams['font.sans-serif']=['SimHei']
plt.title('线性神经网络')
plt.show()
总结
其中以上就是线性神经网络解决简单的异或问题,线性神经网络和感知器的区别在于,感知器的激活函数只能输出-1和1,线性神经网络的激活函数可以取任意值。上面的例子中涉及到的误差也就是后面的代价函数,这边只是皮毛。