【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)
文章目录
- 前言
- 代码
- 修改之前错误的代码
- 知道为何Z的结果不能拟合到预期的5了
- 解决办法1:取消输出层神经单元的a和b(直接将z作为输出)(这个办法不行,影响神经单元的完整性,没法计算出输出层神经单元误差,从而使用误差反向传播法了)(×)
- 解决办法2:将输出层的z作为最终三角凸台的高度Z(这样是错误的,损失函数计算会出问题)(×)
- 解决办法3:将预期数据T归一化,使其符合我们神经网络的输出(√)
- 以0.1为学习率训练1000次
- 以0.01为学习率训练1000次
- 以0.01为学习率训练10000次(奇迹出现了!)
- 我们以本次训练得到的权重结果作为预训练模型,再对模型训练100000次(结果非常良好!!!)
- 最后附上最终成功的2×4×1层代码
前言
【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b
在上↑一次测试中,我们使用了2×3×1层输出层带偏置b的神经网络进行预测,但是发现绘制的分割平面数量不够,导致没能达到我们的分割效果
本次测试我们将在第一个隐藏层添加一个神经单元w4
直接上在上一节的基础上修改的代码吧!
代码
修改之前错误的代码
修改代码的时候,看到这里我惊呆了,,
是不是之前的,,,弄错了ll、
改过来看看
之前不能很好拟合,不会就是因为我把这个写错了吧淦,ԾㅂԾ,
试了N次,模型都不能收敛,试到N+1次时,出现了这个情况:
这就很离谱- -
但是看损失值还是很大,是不是绘图除了问题??
然后发现指数函数有溢出,在这里解决了:
python计算警告:overflow encountered in exp(指数函数溢出)
然后试了n次,就没一个收敛的,不知啥情况???
又检查检查,发现我这好像也有问题??(核查了一下,发现就是这样的,没啥问题)
我这个地方好像还是有问题!!公式不是这样的,参见:
【深度学习的数学】2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误差反向传播法)
改过来(目标损失对当前神经单元的权重偏导=当前神经单元误差×上一层输入神经单元的输出):
运行程序,奇迹出现了,可以看到,结果损失一直波动减少到300左右,绘制的三维图结果跟我们的预期又接近一些了,除了高度Z和三角形平台右边的平面没有拟合到之外,其余的,看起来都非常漂亮!!
w2=[[ 0.067 2.913 -4.402 -1.848][ 7.913 -5.987 8.991 -0.048]]
b2=[ 3.292 2.061 -2.798 0.408]
w3=[10.782 3.335 -8.155 -1.165]
b3=[-6.659]
损失总和C:302.191528
# -*- coding: utf-8 -*-
"""
@File : 接“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b.py
@Time : 2020/6/4 15:40
@Author : Dontla
@Email : sxana@qq.com
@Software: PyCharm
"""from matplotlib import pyplot as plt # 用来绘制图形from mpl_toolkits.mplot3d import Axes3Dimport numpy as np # 用来处理数据# Dontla:定义sigmoid函数
def sigmoid(x):x_ravel = x.ravel() # 将numpy数组展平length = len(x_ravel)y = []for index in range(length):if x_ravel[index] >= 0:y.append(1.0 / (1 + np.exp(-x_ravel[index])))else:y.append(np.exp(x_ravel[index]) / (np.exp(x_ravel[index]) + 1))return np.array(y).reshape(x.shape)# Dontla:定义sigmoid的导数函数
def sigmoid_derivative(x):return sigmoid(x) * (1 - sigmoid(x))# 准备训练数据# X = np.arange(-10, 10, 0.25)
# X1 = np.arange(-10, 20, 1)
X1 = np.arange(-5, 15, 1)# Y = np.arange(-10, 10, 0.25)
# X2 = np.arange(-10, 15, 1)
X2 = np.arange(-5, 10, 1)X1, X2 = np.meshgrid(X1, X2)# Z = 0 * np.ones((25, 30))
# print(list(Z))T = np.array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 5., 5., 5., 5., 5., 5., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 5., 5., 5., 5., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 5., 5., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.]])# 【构建神经网络】
# 初始化神经网络参数(用正态分布随机数)
w2 = np.random.randn(2, 4)
b2 = np.random.randn(4)
w3 = np.random.randn(4)
b3 = np.random.randn(1)# w2 = np.random.randn(2, 3)
# b2 = np.random.randn(3)
# w3 = np.random.randn(3)
# b3 = np.random.randn(1)# w2 = np.array([[1.936, -10.246, -16.059], [3.856, 1.978, 2.899]])
# b2 = np.array([2.327, 1.111, -1.26])
# w3 = np.array([0.487, -1.382, -2.505])
# b3 = np.array([0.641])# 比较好的结果(损失331)
# w2 = np.array([[244.429, -32.861, -120.832], [244.893, 243.652, 245.117]])
# b2 = np.array([0.076, -4.036, -16.428])
# w3 = np.array([13.477, -0.982, -11.57])
# b3 = np.array([-4.353])# 利用误差反向传播法求解各梯度分量# 学习率
learning_rate = 0.1# 创建预测值变量
T_Predict = None# 创建实时绘制损失值的横纵轴变量
iter_list = []
neural_network_error_list = []
# 创建绘制实时损失的动态窗口
plt.ion()# 计算z2(首次)
z2_1 = w2[0, 0] * X1 + w2[1, 0] * X2 + b2[0]
z2_2 = w2[0, 1] * X1 + w2[1, 1] * X2 + b2[1]
z2_3 = w2[0, 2] * X1 + w2[1, 2] * X2 + b2[2]
z2_4 = w2[0, 3] * X1 + w2[1, 3] * X2 + b2[3]
# print(z2_1.shape) # (25, 30)
# print(np.around(z2_1, decimals=3))# 计算a2(首次)
a2_1 = sigmoid(z2_1)
a2_2 = sigmoid(z2_2)
a2_3 = sigmoid(z2_3)
a2_4 = sigmoid(z2_4)
# print(a2_1.shape) # (25, 30)# 计算z3(首次)
z3_1 = w3[0] * a2_1 + w3[1] * a2_2 + w3[2] * a2_3 + w3[3] * a2_4 + b3
# print(z3_1.shape) # (25, 30)# 计算a3(首次)
a3_1 = sigmoid(z3_1)
# print(a3_1.shape) # (25, 30)# 构建神经单元误差关系式
# 创建计算循环(训练次数)
for i in range(300):# 使用误差反向传播法计算神经单元损失(Neural unit error —— nue)nue3_1 = (a3_1 - T) * sigmoid_derivative(z3_1)nue2_1 = nue3_1 * w3[0] * sigmoid_derivative(z2_1)nue2_2 = nue3_1 * w3[1] * sigmoid_derivative(z2_2)nue2_3 = nue3_1 * w3[2] * sigmoid_derivative(z2_3)nue2_4 = nue3_1 * w3[3] * sigmoid_derivative(z2_4)# print(nue3_1.shape) # (25, 30)# print(nue2_1.shape) # (25, 30)# 计算各权重和偏置参数的梯度gradientCt_w2_1to1 = np.sum(nue2_1 * X1)gradientCt_w2_1to2 = np.sum(nue2_2 * X1)gradientCt_w2_1to3 = np.sum(nue2_3 * X1)gradientCt_w2_1to4 = np.sum(nue2_4 * X1)gradientCt_w2_2to1 = np.sum(nue2_1 * X2)gradientCt_w2_2to2 = np.sum(nue2_2 * X2)gradientCt_w2_2to3 = np.sum(nue2_3 * X2)gradientCt_w2_2to4 = np.sum(nue2_4 * X2)# print(gradientC_w2_1to1.shape) # (25, 30)gradientCt_b2_1 = np.sum(nue2_1)gradientCt_b2_2 = np.sum(nue2_2)gradientCt_b2_3 = np.sum(nue2_3)gradientCt_b2_4 = np.sum(nue2_4)# print(gradientC_b2_1.shape) # (25, 30)gradientCt_w3_1to1 = np.sum(nue3_1 * a2_1)gradientCt_w3_2to1 = np.sum(nue3_1 * a2_2)gradientCt_w3_3to1 = np.sum(nue3_1 * a2_3)gradientCt_w3_4to1 = np.sum(nue3_1 * a2_4)# print(gradientC_w3_1to1.shape) # (25, 30)gradientCt_b3_1 = np.sum(nue3_1)# 更新各权重和偏置参数w2 += np.array([[gradientCt_w2_1to1, gradientCt_w2_1to2, gradientCt_w2_1to3, gradientCt_w2_1to4],[gradientCt_w2_2to1, gradientCt_w2_2to2, gradientCt_w2_2to3, gradientCt_w2_2to4]]) * -learning_rateb2 += np.array([gradientCt_b2_1, gradientCt_b2_2, gradientCt_b2_3, gradientCt_b2_4]) * -learning_ratew3 += np.array([gradientCt_w3_1to1, gradientCt_w3_2to1, gradientCt_w3_3to1, gradientCt_w3_4to1]) * -learning_rateb3 += np.array([gradientCt_b3_1]) * -learning_rate# 计算z2z2_1 = w2[0, 0] * X1 + w2[1, 0] * X2 + b2[0]z2_2 = w2[0, 1] * X1 + w2[1, 1] * X2 + b2[1]z2_3 = w2[0, 2] * X1 + w2[1, 2] * X2 + b2[2]z2_4 = w2[0, 3] * X1 + w2[1, 3] * X2 + b2[3]# print(z2_1.shape) # (25, 30)# print(np.around(z2_1, decimals=3))# 计算a2a2_1 = sigmoid(z2_1)a2_2 = sigmoid(z2_2)a2_3 = sigmoid(z2_3)a2_4 = sigmoid(z2_4)# print(a2_1.shape) # (25, 30)# 计算z3z3_1 = w3[0] * a2_1 + w3[1] * a2_2 + w3[2] * a2_3 + w3[3] * a2_4 + b3# print(z3_1.shape) # (25, 30)# 计算a3a3_1 = sigmoid(z3_1)# print(a3_1.shape) # (25, 30)T_Predict = a3_1# 打印参数print('第{:0>2d}轮'.format(i + 1))print('w2={}'.format(np.around(w2, decimals=3)))print('b2={}'.format(np.around(b2, decimals=3)))print('w3={}'.format(np.around(w3, decimals=3)))print('b3={}'.format(np.around(b3, decimals=3)))# 计算损失C# C = np.sum(1 / 2 * np.power(T_Predict - T, 2))C = np.around(np.sum(1 / 2 * np.power(T_Predict - T, 2)), decimals=6)print('损失总和C:{}'.format(C))# 实时绘制损失值图表iter_list.append(i)neural_network_error_list.append(C)plt.clf() # 清除之前画的图plt.plot(iter_list, neural_network_error_list * np.array([-1])) # 画出当前iter_list列表和neural_network_error_list列表中的值的图形plt.pause(0.001) # 暂停一段时间,不然画的太快会卡住显示不出来plt.ioff() # 关闭画图窗口# 绘制三维图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X1, X2, T_Predict, cmap='rainbow')
plt.show()
知道为何Z的结果不能拟合到预期的5了
因为你用a3_1 = sigmoid(z3_1)
作为最终输出相当于把输出的值限定在(0,1)之间了!!!
解决办法1:取消输出层神经单元的a和b(直接将z作为输出)(这个办法不行,影响神经单元的完整性,没法计算出输出层神经单元误差,从而使用误差反向传播法了)(×)
解决办法2:将输出层的z作为最终三角凸台的高度Z(这样是错误的,损失函数计算会出问题)(×)
解决办法3:将预期数据T归一化,使其符合我们神经网络的输出(√)
以0.1为学习率训练1000次
效果不是特别理想,可能是学习率太大导致波动太大
以0.01为学习率训练1000次
也不是太理想
以0.01为学习率训练10000次(奇迹出现了!)
我们预期的基本轮廓居然出来了,虽然拟合得还不是特别完美,但是结果大体显现!!
w2=[[-1.505 -3.632 0.371 -0.143][ 0.059 6.991 1.435 -5.638]]
b2=[16.158 -1.75 0.442 -2.712]
w3=[ 7.504 -9.317 0.417 -8.363]
b3=[-3.698]
损失总和C:0.852291 学习率learning rate:0.01 训练次数:9999
我们以本次训练得到的权重结果作为预训练模型,再对模型训练100000次(结果非常良好!!!)
结果显示拟合得非常良好
第100000轮
w2=[[-2.17 -4.642 0.566 -0.156][ 0.016 9. 1.347 -6.607]]
b2=[22.88 -1.785 0.501 -2.868]
w3=[ 13.89 -12.622 -0.316 -12.369]
b3=[-6.969]
损失总和C:0.008305 学习率learning rate:0.01 训练次数:100000
最后附上最终成功的2×4×1层代码
# -*- coding: utf-8 -*-
"""
@File : 接“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b.py
@Time : 2020/6/4 15:40
@Author : Dontla
@Email : sxana@qq.com
@Software: PyCharm
"""from matplotlib import pyplot as plt # 用来绘制图形from mpl_toolkits.mplot3d import Axes3Dimport numpy as np # 用来处理数据# Dontla:定义sigmoid函数
def sigmoid(x):x_ravel = x.ravel() # 将numpy数组展平length = len(x_ravel)y = []for index in range(length):if x_ravel[index] >= 0:y.append(1.0 / (1 + np.exp(-x_ravel[index])))else:y.append(np.exp(x_ravel[index]) / (np.exp(x_ravel[index]) + 1))return np.array(y).reshape(x.shape)# Dontla:定义sigmoid的导数函数
def sigmoid_derivative(x):return sigmoid(x) * (1 - sigmoid(x))# 准备训练数据# X = np.arange(-10, 10, 0.25)
# X1 = np.arange(-10, 20, 1)
X1 = np.arange(-5, 15, 1)# Y = np.arange(-10, 10, 0.25)
# X2 = np.arange(-10, 15, 1)
X2 = np.arange(-5, 10, 1)X1, X2 = np.meshgrid(X1, X2)# Z = 0 * np.ones((25, 30))
# print(list(Z))# 预期数据(原始预期输出值)
T = np.array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 5., 5., 5., 5., 5., 5., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 5., 5., 5., 5., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 5., 5., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.,5., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 5., 5., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 5., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.],[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.]])# 对数据归一化
T_normalized = T / 5# 【构建神经网络】
# 初始化神经网络参数(用正态分布随机数)
# w2 = np.random.randn(2, 4)
# b2 = np.random.randn(4)
# w3 = np.random.randn(4)
# b3 = np.random.randn(1)w2 = np.array([[-1.505, -3.632, 0.371, -0.143], [0.059, 6.991, 1.435, -5.638]])
b2 = np.array([16.158, -1.75, 0.442, -2.712])
w3 = np.array([7.504, -9.317, 0.417, -8.363])
b3 = np.array([-3.698])# 利用误差反向传播法求解各梯度分量# 学习率
learning_rate = 0.01# 创建预测值变量
T_normalized_Predict = None# 创建实时绘制损失值的横纵轴变量
iter_list = []
neural_network_error_list = []
# 创建绘制实时损失的动态窗口
plt.ion()# 计算z2(首次)
z2_1 = w2[0, 0] * X1 + w2[1, 0] * X2 + b2[0]
z2_2 = w2[0, 1] * X1 + w2[1, 1] * X2 + b2[1]
z2_3 = w2[0, 2] * X1 + w2[1, 2] * X2 + b2[2]
z2_4 = w2[0, 3] * X1 + w2[1, 3] * X2 + b2[3]
# print(z2_1.shape) # (25, 30)
# print(np.around(z2_1, decimals=3))# 计算a2(首次)
a2_1 = sigmoid(z2_1)
a2_2 = sigmoid(z2_2)
a2_3 = sigmoid(z2_3)
a2_4 = sigmoid(z2_4)
# print(a2_1.shape) # (25, 30)# 计算z3(首次)
z3_1 = w3[0] * a2_1 + w3[1] * a2_2 + w3[2] * a2_3 + w3[3] * a2_4 + b3
# print(z3_1.shape) # (25, 30)# 计算a3(首次)
a3_1 = sigmoid(z3_1)
# print(a3_1.shape) # (25, 30)# 构建神经单元误差关系式
# 创建计算循环(训练次数)
for i in range(100000):# 使用误差反向传播法计算神经单元损失(Neural unit error —— nue)nue3_1 = (a3_1 - T_normalized) * sigmoid_derivative(z3_1)nue2_1 = nue3_1 * w3[0] * sigmoid_derivative(z2_1)nue2_2 = nue3_1 * w3[1] * sigmoid_derivative(z2_2)nue2_3 = nue3_1 * w3[2] * sigmoid_derivative(z2_3)nue2_4 = nue3_1 * w3[3] * sigmoid_derivative(z2_4)# print(nue3_1.shape) # (25, 30)# print(nue2_1.shape) # (25, 30)# 计算各权重和偏置参数的梯度gradientCt_w2_1to1 = np.sum(nue2_1 * X1)gradientCt_w2_1to2 = np.sum(nue2_2 * X1)gradientCt_w2_1to3 = np.sum(nue2_3 * X1)gradientCt_w2_1to4 = np.sum(nue2_4 * X1)gradientCt_w2_2to1 = np.sum(nue2_1 * X2)gradientCt_w2_2to2 = np.sum(nue2_2 * X2)gradientCt_w2_2to3 = np.sum(nue2_3 * X2)gradientCt_w2_2to4 = np.sum(nue2_4 * X2)# print(gradientC_w2_1to1.shape) # (25, 30)gradientCt_b2_1 = np.sum(nue2_1)gradientCt_b2_2 = np.sum(nue2_2)gradientCt_b2_3 = np.sum(nue2_3)gradientCt_b2_4 = np.sum(nue2_4)# print(gradientC_b2_1.shape) # (25, 30)gradientCt_w3_1to1 = np.sum(nue3_1 * a2_1)gradientCt_w3_2to1 = np.sum(nue3_1 * a2_2)gradientCt_w3_3to1 = np.sum(nue3_1 * a2_3)gradientCt_w3_4to1 = np.sum(nue3_1 * a2_4)# print(gradientC_w3_1to1.shape) # (25, 30)gradientCt_b3_1 = np.sum(nue3_1)# 更新各权重和偏置参数w2 += np.array([[gradientCt_w2_1to1, gradientCt_w2_1to2, gradientCt_w2_1to3, gradientCt_w2_1to4],[gradientCt_w2_2to1, gradientCt_w2_2to2, gradientCt_w2_2to3, gradientCt_w2_2to4]]) * -learning_rateb2 += np.array([gradientCt_b2_1, gradientCt_b2_2, gradientCt_b2_3, gradientCt_b2_4]) * -learning_ratew3 += np.array([gradientCt_w3_1to1, gradientCt_w3_2to1, gradientCt_w3_3to1, gradientCt_w3_4to1]) * -learning_rateb3 += np.array([gradientCt_b3_1]) * -learning_rate# 计算z2z2_1 = w2[0, 0] * X1 + w2[1, 0] * X2 + b2[0]z2_2 = w2[0, 1] * X1 + w2[1, 1] * X2 + b2[1]z2_3 = w2[0, 2] * X1 + w2[1, 2] * X2 + b2[2]z2_4 = w2[0, 3] * X1 + w2[1, 3] * X2 + b2[3]# print(z2_1.shape) # (25, 30)# print(np.around(z2_1, decimals=3))# 计算a2a2_1 = sigmoid(z2_1)a2_2 = sigmoid(z2_2)a2_3 = sigmoid(z2_3)a2_4 = sigmoid(z2_4)# print(a2_1.shape) # (25, 30)# 计算z3z3_1 = w3[0] * a2_1 + w3[1] * a2_2 + w3[2] * a2_3 + w3[3] * a2_4 + b3# print(z3_1.shape) # (25, 30)# 计算a3a3_1 = sigmoid(z3_1)# print(a3_1.shape) # (25, 30)T_normalized_Predict = a3_1# 打印参数print('第{:0>2d}轮'.format(i + 1))print('w2={}'.format(np.around(w2, decimals=3)))print('b2={}'.format(np.around(b2, decimals=3)))print('w3={}'.format(np.around(w3, decimals=3)))print('b3={}'.format(np.around(b3, decimals=3)))# 计算损失C# C = np.sum(1 / 2 * np.power(T_Predict - T, 2))C = np.around(np.sum(1 / 2 * np.power(T_normalized_Predict - T_normalized, 2)), decimals=6)print('损失总和C:{} 学习率learning rate:{} 训练次数:{}'.format(C, learning_rate, i + 1))# 实时绘制损失值图表iter_list.append(i)neural_network_error_list.append(C)plt.clf() # 清除之前画的图plt.plot(iter_list, neural_network_error_list * np.array([-1])) # 画出当前iter_list列表和neural_network_error_list列表中的值的图形plt.pause(0.001) # 暂停一段时间,不然画的太快会卡住显示不出来plt.ioff() # 关闭画图窗口# 绘制三维图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X1, X2, T_normalized_Predict * 5, cmap='rainbow')
plt.show()
【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)相关推荐
- 【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b
文章目录 代码 接:[深度学习的数学]2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误 ...
- 【深度学习的数学】2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误差反向传播法)
文章目录 训练数据 数据示意 训练数据生成及绘制三维图像代码 训练数据三维图像 搭建神经网络结构 网络结构 利用梯度下降法和误差反向传播法计算损失函数损失值 代码 [灾难降临]代码出现严重问题,已将其 ...
- 【深度学习的数学】绘制2×3×1层带sigmoid激活函数的神经网络感知机输出函数的三维图像(神经网络参数使用正态分布随机数)
阅读博客时,神经网络的输入变量刚好为两个,输出变量为1个,于是想绘制一下输出函数的三维图像是什么样的 代码 # -*- coding: utf-8 -*- """ @Fi ...
- 【深度学习的数学】激活函数的作用是什么?
转载文章:神经网络激活函数的作用是什么? Donlta备注 不带激活函数的单层感知机是一个线性分类器,无法解决线性不可分(分类)问题 不带激活函数的多层感知机(带隐藏层)合并后也是一个线性分类器,也无 ...
- 【深度学习的数学】初始权重和偏置参数对模型训练非常重要!(预训练模型、预训练文件、初始权重)
在进行 [深度学习的数学]接"2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测",输出层加偏置b 的测试中,我们发现,模型的初始权重对模型的训练结果是 ...
- 深度学习100例 | 第43天:文本卷积神经网络(TextCNN)新闻文本分类实战
- 《深度学习的数学》笔记【各种概念】
文章目录 第一章 神经网络的思想 1-1 神经网络和深度学习 1-2 神经元工作的数学表示 1-3 激活函数:将神经元的工作一般化 1-4 什么是神经网络 1-5 用恶魔来讲解神经网络的结构 1-6 ...
- 深度学习的数学-卷积神经网络的误差反向传播
文章目录 前言 正文 卷积神经网络中的关系式 卷积层 池化层 输出层 平方误差(损失函数) 梯度下降法 卷积层和输出层的神经单元误差(重点) 输出层的神经单元误差计算 输出层的神经单元与其权重偏置的关 ...
- 《深度学习的数学》学习笔记
深度学习的数学 本文为学习了涌井良幸和涌井贞美所著的<深度学习的数学>后的读书笔记及总结. 文章目录 第一章 神经网络的思想 1-1 神经网络和深度学习 1-2 神经元的数学表示 1-3 ...
最新文章
- 一台支持vlan管理的交换机_关于交换机的VLAN技术你了解多少?
- matlab 恶俗的缩写combntns()
- libiconv2.dll
- 超图 iServer服务体系学习
- 【l转】VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func
- 深入浅出数据库设计三范式
- Ubuntu安装amule和编译安装amule-dlp
- 技术 Leader 怎样带跨一个团队?
- spark 2.2 读取 Hadoop3.0 数据异常 org.apache.hadoop.hdfs.web.HftpFileSystem cannot access its superinterfa
- 安装ae显示安装程序无法初始化_adobe CC 2015/2017安装失败(adobe cc安装不了的解决办法)...
- spring和redis的整合-超越昨天的自己系列(7)
- SQL Server Profiler
- 【读书笔记】-串指令备注
- 【经典算法实现 16】阿克曼函数(非递归实现 代码优化)
- 微信二维码扫码登录思路
- 关于WIN10开机自动开启小键盘解决方案
- rrpp协议如何修改_RRPP快速环网保护协议
- 外国用户和国内用户看待浏览器的问题
- android studio改api 26以上应用图标形状
- 尤雨溪告诉你为什么Vue比yox优秀