文章目录

  • 前言
  • 代码
    • 修改之前错误的代码
  • 知道为何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(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)相关推荐

  1. 【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b

    文章目录 代码 接:[深度学习的数学]2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误 ...

  2. 【深度学习的数学】2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误差反向传播法)

    文章目录 训练数据 数据示意 训练数据生成及绘制三维图像代码 训练数据三维图像 搭建神经网络结构 网络结构 利用梯度下降法和误差反向传播法计算损失函数损失值 代码 [灾难降临]代码出现严重问题,已将其 ...

  3. 【深度学习的数学】绘制2×3×1层带sigmoid激活函数的神经网络感知机输出函数的三维图像(神经网络参数使用正态分布随机数)

    阅读博客时,神经网络的输入变量刚好为两个,输出变量为1个,于是想绘制一下输出函数的三维图像是什么样的 代码 # -*- coding: utf-8 -*- """ @Fi ...

  4. 【深度学习的数学】激活函数的作用是什么?

    转载文章:神经网络激活函数的作用是什么? Donlta备注 不带激活函数的单层感知机是一个线性分类器,无法解决线性不可分(分类)问题 不带激活函数的多层感知机(带隐藏层)合并后也是一个线性分类器,也无 ...

  5. 【深度学习的数学】初始权重和偏置参数对模型训练非常重要!(预训练模型、预训练文件、初始权重)

    在进行 [深度学习的数学]接"2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测",输出层加偏置b 的测试中,我们发现,模型的初始权重对模型的训练结果是 ...

  6. 深度学习100例 | 第43天:文本卷积神经网络(TextCNN)新闻文本分类实战

  7. 《深度学习的数学》笔记【各种概念】

    文章目录 第一章 神经网络的思想 1-1 神经网络和深度学习 1-2 神经元工作的数学表示 1-3 激活函数:将神经元的工作一般化 1-4 什么是神经网络 1-5 用恶魔来讲解神经网络的结构 1-6 ...

  8. 深度学习的数学-卷积神经网络的误差反向传播

    文章目录 前言 正文 卷积神经网络中的关系式 卷积层 池化层 输出层 平方误差(损失函数) 梯度下降法 卷积层和输出层的神经单元误差(重点) 输出层的神经单元误差计算 输出层的神经单元与其权重偏置的关 ...

  9. 《深度学习的数学》学习笔记

    深度学习的数学 本文为学习了涌井良幸和涌井贞美所著的<深度学习的数学>后的读书笔记及总结. 文章目录 第一章 神经网络的思想 1-1 神经网络和深度学习 1-2 神经元的数学表示 1-3 ...

最新文章

  1. 一台支持vlan管理的交换机_关于交换机的VLAN技术你了解多少?
  2. matlab 恶俗的缩写combntns()
  3. libiconv2.dll
  4. 超图 iServer服务体系学习
  5. 【l转】VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func
  6. 深入浅出数据库设计三范式
  7. Ubuntu安装amule和编译安装amule-dlp
  8. 技术 Leader 怎样带跨一个团队?
  9. spark 2.2 读取 Hadoop3.0 数据异常 org.apache.hadoop.hdfs.web.HftpFileSystem cannot access its superinterfa
  10. 安装ae显示安装程序无法初始化_adobe CC 2015/2017安装失败(adobe cc安装不了的解决办法)...
  11. spring和redis的整合-超越昨天的自己系列(7)
  12. SQL Server Profiler
  13. 【读书笔记】-串指令备注
  14. 【经典算法实现 16】阿克曼函数(非递归实现 代码优化)
  15. 微信二维码扫码登录思路
  16. 关于WIN10开机自动开启小键盘解决方案
  17. rrpp协议如何修改_RRPP快速环网保护协议
  18. 外国用户和国内用户看待浏览器的问题
  19. android studio改api 26以上应用图标形状
  20. 尤雨溪告诉你为什么Vue比yox优秀

热门文章

  1. 电商行业知识汇集 这里有你想要的东西
  2. 【MM模块】Cycle Counting 周期盘点
  3. Bom技术类型的讲解
  4. 【三代增强干货一枚】外向交货单Delivery (VL01N)Header屏幕增强
  5. 标准程序的Parameter id 并不一定准确
  6. ME2N标准报表中加EKKO/EKPO中没显示的字段
  7. SAP相关会计科目的设置OBYC
  8. SAP 采购订单打印完后不可以取消审批
  9. SAP标准OK Code Values 列表
  10. 銷售訂單 (Sales Order): 資料表及更新記錄