【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)
文章目錄
- 前言
- 代碼
- 修改之前錯(cuò)誤的代碼
- 知道為何Z的結(jié)果不能擬合到預(yù)期的5了
- 解決辦法1:取消輸出層神經(jīng)單元的a和b(直接將z作為輸出)(這個(gè)辦法不行,影響神經(jīng)單元的完整性,沒法計(jì)算出輸出層神經(jīng)單元誤差,從而使用誤差反向傳播法了)(×)
- 解決辦法2:將輸出層的z作為最終三角凸臺(tái)的高度Z(這樣是錯(cuò)誤的,損失函數(shù)計(jì)算會(huì)出問題)(×)
- 解決辦法3:將預(yù)期數(shù)據(jù)T歸一化,使其符合我們神經(jīng)網(wǎng)絡(luò)的輸出(√)
- 以0.1為學(xué)習(xí)率訓(xùn)練1000次
- 以0.01為學(xué)習(xí)率訓(xùn)練1000次
- 以0.01為學(xué)習(xí)率訓(xùn)練10000次(奇跡出現(xiàn)了!)
- 我們以本次訓(xùn)練得到的權(quán)重結(jié)果作為預(yù)訓(xùn)練模型,再對(duì)模型訓(xùn)練100000次(結(jié)果非常良好!!!)
- 最后附上最終成功的2×4×1層代碼
前言
【深度學(xué)習(xí)的數(shù)學(xué)】接“2×3×1層帶sigmoid激活函數(shù)的神經(jīng)網(wǎng)絡(luò)感知機(jī)對(duì)三角形平面的分類訓(xùn)練預(yù)測(cè)”,輸出層加偏置b
在上↑一次測(cè)試中,我們使用了2×3×1層輸出層帶偏置b的神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測(cè),但是發(fā)現(xiàn)繪制的分割平面數(shù)量不夠,導(dǎo)致沒能達(dá)到我們的分割效果
本次測(cè)試我們將在第一個(gè)隱藏層添加一個(gè)神經(jīng)單元w4
直接上在上一節(jié)的基礎(chǔ)上修改的代碼吧!
代碼
修改之前錯(cuò)誤的代碼
修改代碼的時(shí)候,看到這里我驚呆了,,
是不是之前的,,,弄錯(cuò)了ll、
改過來看看
之前不能很好擬合,不會(huì)就是因?yàn)槲野堰@個(gè)寫錯(cuò)了吧淦,???,
試了N次,模型都不能收斂,試到N+1次時(shí),出現(xiàn)了這個(gè)情況:
這就很離譜- -
但是看損失值還是很大,是不是繪圖除了問題??
然后發(fā)現(xiàn)指數(shù)函數(shù)有溢出,在這里解決了:
python計(jì)算警告:overflow encountered in exp(指數(shù)函數(shù)溢出)
然后試了n次,就沒一個(gè)收斂的,不知啥情況???
又檢查檢查,發(fā)現(xiàn)我這好像也有問題??(核查了一下,發(fā)現(xiàn)就是這樣的,沒啥問題)
我這個(gè)地方好像還是有問題!!公式不是這樣的,參見:
【深度學(xué)習(xí)的數(shù)學(xué)】2×3×1層帶sigmoid激活函數(shù)的神經(jīng)網(wǎng)絡(luò)感知機(jī)對(duì)三角形平面的分類訓(xùn)練預(yù)測(cè)(繪制出模型結(jié)果三維圖展示效果)(梯度下降法+最小二乘法+激活函數(shù)sigmoid+誤差反向傳播法)
改過來(目標(biāo)損失對(duì)當(dāng)前神經(jīng)單元的權(quán)重偏導(dǎo)=當(dāng)前神經(jīng)單元誤差×上一層輸入神經(jīng)單元的輸出):
運(yùn)行程序,奇跡出現(xiàn)了,可以看到,結(jié)果損失一直波動(dòng)減少到300左右,繪制的三維圖結(jié)果跟我們的預(yù)期又接近一些了,除了高度Z和三角形平臺(tái)右邊的平面沒有擬合到之外,其余的,看起來都非常漂亮!!
知道為何Z的結(jié)果不能擬合到預(yù)期的5了
因?yàn)槟阌胊3_1 = sigmoid(z3_1)作為最終輸出相當(dāng)于把輸出的值限定在(0,1)之間了!!!
解決辦法1:取消輸出層神經(jīng)單元的a和b(直接將z作為輸出)(這個(gè)辦法不行,影響神經(jīng)單元的完整性,沒法計(jì)算出輸出層神經(jīng)單元誤差,從而使用誤差反向傳播法了)(×)
解決辦法2:將輸出層的z作為最終三角凸臺(tái)的高度Z(這樣是錯(cuò)誤的,損失函數(shù)計(jì)算會(huì)出問題)(×)
解決辦法3:將預(yù)期數(shù)據(jù)T歸一化,使其符合我們神經(jīng)網(wǎng)絡(luò)的輸出(√)
以0.1為學(xué)習(xí)率訓(xùn)練1000次
效果不是特別理想,可能是學(xué)習(xí)率太大導(dǎo)致波動(dòng)太大
以0.01為學(xué)習(xí)率訓(xùn)練1000次
也不是太理想
以0.01為學(xué)習(xí)率訓(xùn)練10000次(奇跡出現(xiàn)了!)
我們預(yù)期的基本輪廓居然出來了,雖然擬合得還不是特別完美,但是結(jié)果大體顯現(xiàn)!!
我們以本次訓(xùn)練得到的權(quán)重結(jié)果作為預(yù)訓(xùn)練模型,再對(duì)模型訓(xùn)練100000次(結(jié)果非常良好!!!)
結(jié)果顯示擬合得非常良好
最后附上最終成功的2×4×1層代碼
# -*- coding: utf-8 -*- """ @File : 接“2×4×1層帶sigmoid激活函數(shù)的神經(jīng)網(wǎng)絡(luò)感知機(jī)對(duì)三角形平面的分類訓(xùn)練預(yù)測(cè)”,輸出層加偏置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 # 用來處理數(shù)據(jù)# Dontla:定義sigmoid函數(shù) def sigmoid(x):x_ravel = x.ravel() # 將numpy數(shù)組展平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的導(dǎo)數(shù)函數(shù) def sigmoid_derivative(x):return sigmoid(x) * (1 - sigmoid(x))# 準(zhǔn)備訓(xùn)練數(shù)據(jù)# 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))# 預(yù)期數(shù)據(jù)(原始預(yù)期輸出值) 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.]])# 對(duì)數(shù)據(jù)歸一化 T_normalized = T / 5# 【構(gòu)建神經(jīng)網(wǎng)絡(luò)】 # 初始化神經(jīng)網(wǎng)絡(luò)參數(shù)(用正態(tài)分布隨機(jī)數(shù)) # 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])# 利用誤差反向傳播法求解各梯度分量# 學(xué)習(xí)率 learning_rate = 0.01# 創(chuàng)建預(yù)測(cè)值變量 T_normalized_Predict = None# 創(chuàng)建實(shí)時(shí)繪制損失值的橫縱軸變量 iter_list = [] neural_network_error_list = [] # 創(chuàng)建繪制實(shí)時(shí)損失的動(dòng)態(tài)窗口 plt.ion()# 計(jì)算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))# 計(jì)算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)# 計(jì)算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)# 計(jì)算a3(首次) a3_1 = sigmoid(z3_1) # print(a3_1.shape) # (25, 30)# 構(gòu)建神經(jīng)單元誤差關(guān)系式 # 創(chuàng)建計(jì)算循環(huán)(訓(xùn)練次數(shù)) for i in range(100000):# 使用誤差反向傳播法計(jì)算神經(jīng)單元損失(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)# 計(jì)算各權(quán)重和偏置參數(shù)的梯度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)# 更新各權(quán)重和偏置參數(shù)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# 計(jì)算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))# 計(jì)算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)# 計(jì)算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)# 計(jì)算a3a3_1 = sigmoid(z3_1)# print(a3_1.shape) # (25, 30)T_normalized_Predict = a3_1# 打印參數(shù)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)))# 計(jì)算損失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:{} 學(xué)習(xí)率learning rate:{} 訓(xùn)練次數(shù):{}'.format(C, learning_rate, i + 1))# 實(shí)時(shí)繪制損失值圖表iter_list.append(i)neural_network_error_list.append(C)plt.clf() # 清除之前畫的圖plt.plot(iter_list, neural_network_error_list * np.array([-1])) # 畫出當(dāng)前iter_list列表和neural_network_error_list列表中的值的圖形plt.pause(0.001) # 暫停一段時(shí)間,不然畫的太快會(huì)卡住顯示不出來plt.ioff() # 關(guān)閉畫圖窗口# 繪制三維圖 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X1, X2, T_normalized_Predict * 5, cmap='rainbow') plt.show()總結(jié)
以上是生活随笔為你收集整理的【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习的数学】接“2×3×1层带si
- 下一篇: 【深度学习的数学】初始权重和偏置参数对模