#|深度学习(5)构造简单的神经网络
目录
一、激励函数
二、创建数组(初始输入和输出)
三、更新权重
1、创建权重(w0和w1)
2、限值(-1~1)
3、正向传播
4、反向传播
4-1、求l2差错
【#|深度学习(5)构造简单的神经网络】4-2、求l1差错
五、更新权重
总代码
一、激励函数
文章图片
# 激励函数
def Sigmoid(x, deriv = False):
# 反向传播
if deriv == True:
return x*(x-1)#求导
# 正向传播
else:
return 1/(1+np.exp(-x)) #1/[1+e^(-x)]
二、创建数组(初始输入和输出)
# 创建数组(输入参数、标签)
x, y = Create_Array()
# 创建数组(输入和标签)
def Create_Array():
# 输入
# (这里有5个数据,3个特征)
x = np.array([
[0, 0, 1],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1],
[0, 0, 1]
])
print(x.shape)
# 标签(类别标签)
# 这里有5个标签(对应5个数据),共2种标签
y = np.array([
[0],
[1],
[1],
[0],
[0]
])
print(y.shape)
return x,y
文章图片
三、更新权重
文章图片
1、创建权重(w0和w1)
# 1、创建w0和w1
w0 = np.random.random((3, 4))#3:输入特征有3个4:神经元数量
w1 = np.random.random((4, 1))#4:输入特征4个1:神经元数量(输出特征)
文章图片
文章图片
可以看出来它的取值在0~1,我们想把它限制在-1~1。
2、限值(-1~1)
# 2、限值在-1~1(本来是0~1)
w0 = w0 * 2 - 1
w1 = w1 * 2 - 1
文章图片
文章图片
3、正向传播
文章图片
矩阵:例如w0[3,4],可以理解为:前面输入为3,后面输出为4。
# 3、正向传播
l0 = x#输入层(第一层)
l1 = Sigmoid(np.dot(l0, w0))#中间层(第二层)
l2 = Sigmoid(np.dot(l1, w1))#输出层(第三层)
文章图片
文章图片
文章图片
4、反向传播
文章图片
矩阵:例如w0[3,4],可以理解为:前面输入为3,后面输出为4。4-1、求l2差错
l2误差 = l2值 - 预期值
# l2
l2_loss = l2 - y# l2误差(损失)(预测值和真实值的差)
l2_delta = l2_loss * Sigmoid(l2, deriv=True)# l2每个样本错了多少
文章图片
4-2、求l1差错
l1误差 = l2误差 * w1转置
# l1
l1_loss = l2_delta.dot(w1.T)# l1误差(损失)(l2差错矩阵*w1转置)
l1_delta = l2_loss * Sigmoid(l2, deriv=True)# l1每个样本错了多少
文章图片
五、更新权重
w1 -= l1转置 * l2差错
w0 -= l0转置 * l1差错
# 5、更新权重:w1和w0
w1 -= l1.T.dot(l2_delta)
w0 -= l0.T.dot(l1_delta)
#每10000次打印一次(观察优化效果)
if i%10000 == 0:
print('w1:', w1)
print('w0', w0)
print('---------------------------------------------')
观察优化效果:
误差: [[ 0.32966685]
[-0.67656896]
[-0.66531841]
[ 0.32919543]
[ 0.32966685]]
w1: [[ 0.12175521]
[-0.31912182]
[-0.25200495]
[-0.81755089]]
w0 [[-0.928634010.44797085 -0.13338118 -0.47594584]
[ 0.184544010.589644720.20720542 -0.15294761]
[-0.75583748 -0.053542750.886984580.44581214]]
---------------------------------------------
误差: [[ 9.99991933e-01]
[-7.32072362e-06]
[-9.10900613e-06]
[ 9.99991930e-01]
[ 9.99991933e-01]]
w1: [[2.69487986]
[2.64026488]
[3.62495426]
[3.06034898]]
w0 [[-0.749740590.626864270.04551225 -0.29705242]
[ 0.400140020.805240730.422801430.0626484 ]
[ 2.920794983.623089714.563617044.1224446 ]]
---------------------------------------------
误差: [[ 9.99995932e-01]
[-3.69171529e-06]
[-4.46189795e-06]
[ 9.99996035e-01]
[ 9.99995932e-01]]
w1: [[2.85382632]
[2.80498355]
[3.79129229]
[3.22544424]]
w0 [[-0.694328920.682275940.10092392 -0.24164074]
[ 0.455551830.860652540.478213240.11806021]
[ 3.088514353.790809084.731336414.29016397]]
---------------------------------------------
误差: [[ 9.99997276e-01]
[-2.47455531e-06]
[-2.94423290e-06]
[ 9.99997376e-01]
[ 9.99997276e-01]]
w1: [[2.94760072]
[2.90159829]
[3.88874508]
[3.3222891 ]]
w0 [[-0.662297770.714307090.13295506 -0.2096096 ]
[ 0.487583010.892683720.510244420.15009139]
[ 3.186663023.888957764.829485084.38831264]]
---------------------------------------------
误差: [[ 9.99997951e-01]
[-1.86322517e-06]
[-2.19361346e-06]
[ 9.99998039e-01]
[ 9.99997951e-01]]
w1: [[3.01447732]
[2.97028531]
[3.95798219]
[3.39113988]]
w0 [[-0.639693950.736910910.15555889 -0.18700578]
[ 0.510186860.915287560.532848260.17269523]
[ 3.256350093.958644834.899172154.45799971]]
---------------------------------------------
误差: [[ 9.99998358e-01]
[-1.49514816e-06]
[-1.74651365e-06]
[ 9.99998435e-01]
[ 9.99998358e-01]]
w1: [[3.06653951]
[3.02364596]
[4.01174561]
[3.44462675]]
w0 [[-0.622216160.75438870.17303668 -0.16952798]
[ 0.527664660.932765370.550326070.19017304]
[ 3.310439594.012734334.953261654.51208921]]
可以发现误差在不断减小,说明我们的神经网络优化起了效果。
总代码
# 简单的神经网络
import numpy as np# 激励函数
def Sigmoid(x, deriv = False):
# 反向传播
if deriv == True:
return x*(x-1)#求导
# 正向传播
else:
return 1/(1+np.exp(-x)) #1/[1+e^(-x)]# 创建数组(输入和标签)
def Create_Array():
# 输入
# (这里有5个数据,3个特征)
x = np.array([
[0, 0, 1],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1],
[0, 0, 1]
])
print(x.shape)
# 标签(类别标签)
# 这里有5个标签(对应5个数据),共2种标签
y = np.array([
[0],
[1],
[1],
[0],
[0]
])
print(y.shape)
return x,y# 更新权重
def Update_Weight(x, y):
# 1、创建w0和w1
w0 = np.random.random((3, 4))#3:输入特征有3个4:神经元数量
w1 = np.random.random((4, 1))#4:输入特征4个1:神经元数量(输出特征)
# 2、限值在-1~1(本来是0~1)
w0 = w0 * 2 - 1
w1 = w1 * 2 - 1# 遍历
for i in range(60000):
# 3、正向传播
l0 = x#输入层(第一层)
l1 = Sigmoid(np.dot(l0, w0))#中间层(第二层)
l2 = Sigmoid(np.dot(l1, w1))#输出层(第三层)# 4、反向传播
# l2
l2_loss = l2 - y# l2误差(损失)(预测值和真实值的差)
l2_delta = l2_loss * Sigmoid(l2, deriv=True)# l2每个样本错了多少# l1
l1_loss = l2_delta.dot(w1.T)# l1误差(损失)(l2差错矩阵*w1转置)
l1_delta = l2_loss * Sigmoid(l2, deriv=True)# l1每个样本错了多少# 5、更新权重:w1和w0
w1 -= l1.T.dot(l2_delta)
w0 -= l0.T.dot(l1_delta)#每10000次打印一次(观察优化效果)
if i%10000 == 0:
print('误差:', l2_loss)
print('w1:', w1)
print('w0', w0)
print('---------------------------------------------')if __name__ == '__main__':
# 创建数组(输入参数、标签)
x, y = Create_Array()
# 更新权重
Update_Weight(x, y)
以后深度学习,一般不会自己写,一般都是用别人写好的框架,比如caffe、tensorflow等等框架。
推荐阅读
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习
- 【韩语学习】(韩语随堂笔记整理)
- 焦点学习田源分享第267天《来访》