深度学习--TensorFlow(3)线性神经网络(线性输入非线性输入)(实现)
目錄
一、線性神經網絡(線性輸入)
1、基礎理論?
2、線性輸入代碼
奇葩錯誤:
二、線性神經網絡(非線性輸入)
0、引言?
1、基礎理論
三、線性神經網絡(非線性輸入)實戰
1、設置初始參數
2、正向傳播,求線性輸出y
3、反向傳播,更新權重w
4、訓練&&預測(畫圖)
4-1、畫正負樣本點坐標
4-2、獲取非線性輸出模型(y)
非線性輸入代碼
???????
一、線性神經網絡(線性輸入)
1、基礎理論?
????線性神經網絡和上面的單層感知器十分相似,只是把單層感知器的sign激活函數改成了purelin函數:y=x。
有兩個地方需要修改:
1、修改激活函數
?因為線性神經網絡的激活函數是y=x,所以就不再需要np.sign()了。
2、 不需要擬合后退出
由于不是之前的sign激活函數(輸出0/1),線性神經網絡會無限逼近,一般不會與標簽完全擬合,可以更好地訓練樣本。
2、線性輸入代碼
和前面的單層感知器基本一致。
# 手寫單層感知器(多數據分類)
import numpy as np
import matplotlib.pyplot as plt# 1、設置初始參數
# 輸入 #每一行對應一個標簽
x = np.array([[1, 0, 2], #(0,2)坐標[1, 1, 3], #(1,3)坐標[1, 4, 2], #(4,2)坐標[1, 5, 1] #(5,1)坐標
])
# 初始權重(0~1的隨機生產數)
w = np.random.random([3, 1]) #3行1列# 偏置
b = 1# 標簽(正確標簽,訓練結束的目標)
true = np.array([ #每一行對應一個標簽[-1],[-1],[ 1],[ 1]
])# 學習率
lr = 0.1# 開始訓練
for i in range(100):# 2、正向傳播:計算輸出yy = np.dot(x, w) #dot:矩陣乘法(x列==w行)print('epoch:', i) #迭代次數print('weight:', w) #權重print(y) #標簽# 訓練成功if (y == true).all():print('訓練成功!')print('y = ', y)break# 3、反向傳播:更新權重# 訓練失敗(更新權重)else:w += lr * np.dot(x.T, true-y)/x.shape[0]
# w:權重 lr:學習率 np.dot:矩陣點乘 true-y:差 x.T:x的轉置 x.shape[0]:行數# 4、畫圖
# 4-1、畫點
# 正樣本坐標
x1, y1 = [0,1], [2,3] #坐標:(0,2), (1,3)
# 負樣本坐標
x2, y2 = [4,5], [2,1] #坐標:(4,2),(5,1)plt.scatter(x1, y1, c='b') #點:(x1,y1)坐標,blue顏色
plt.scatter(x2, y2, c='g') #點:(x2,y2)坐標,green顏色# 4-2、畫線段
# 定義線段兩點的x坐標
line_x = (0, 6)# 計算線性方程的k和d:
# w0*x0+w1*x1+w2*x2 = 0
# 把x1、x2分別看作:x、y
# 可以得到:w0 + w1*x + w2*y = 0 --> y = -w1/w2*x + -w0/w2 --> k=-w1/w2, d=-w0/w2
# 線段兩端點的y坐標
k = -w[1]/w[2] #斜率
d = -w[0]/w[2] #截距
line_y = k * line_x + d #y坐標#畫線段(通過兩個點)
plt.plot(line_x, line_y, 'r') #r:redplt.show()
??
訓練5次:?
?
?訓練500次:
由于不斷逼近訓練的緣故,可以發現500次的擬合效果比5次的明顯好不少。
奇葩錯誤:
?之前由于學習率設置過大,訓練多少次都無法成功。
二、線性神經網絡(非線性輸入)
0、引言?
有些比較復雜的情況是沒辦法用線性神經網絡的線性輸入處理的,比如異或問題:
??
?可以很明顯發現,一條直線無法劃分異或問題,這是非線性問題,這時就需要用線性神經網絡的非線性輸入來處理這些問題了。
1、基礎理論
線性神經網絡可以引入非線性輸入特征來解決非線性問題。?
這是線性神經元非線性輸入的模型:
三、線性神經網絡(非線性輸入)實戰
1、設置初始參數
# 1、設置初始參數
# 輸入 #每一行對應一個標簽
# 六個參數分別為:x0 x1 x2 x1*x1 x1*x2 x2*x2
x = np.array([[1, 0, 0, 0, 0, 0], #坐標(0,0) -1[1, 0, 1, 0, 0, 1], #坐標(0,1) 1[1, 1, 0, 1, 0, 0], #坐標(1,0) 1[1, 1, 1, 1, 1, 1] #坐標(1,1) -1
])
# 這些點者用來訓練線性模型,作為線性模型的輸入。# 初始權重(0~1的隨機生產數)
w = np.random.random([6, 1]) #3行1列# 偏置
b = 1# 標簽(正確標簽,訓練結束的目標)
true = np.array([ #每一行對應一個標簽[-1],[1],[1],[-1]
])# 學習率
lr = 0.1
2、正向傳播,求線性輸出y
# 開始訓練
for i in range(500):# 2、正向傳播:計算輸出yy = np.dot(x, w) #dot:矩陣乘法(x列==w行)
3、反向傳播,更新權重w
# 3、反向傳播:更新權重# 更新權重w += lr * np.dot(x.T, true-y)/x.shape[0]
# w:權重 lr:學習率 np.dot:矩陣點乘 true-y:差 x.T:x的轉置 x.shape[0]:行數
4、訓練&&預測(畫圖)
4-1、畫正負樣本點坐標
# 4-1、畫點
# 正樣本坐標
x1, y1 = [0,1], [1,0] #坐標:(0,2), (1,3)
# 負樣本坐標
x2, y2 = [0,1], [0,1] #坐標:(4,2),(5,1)plt.scatter(x1, y1, c='b') #點:(x1,y1)坐標,blue顏色
plt.scatter(x2, y2, c='g') #點:(x2,y2)坐標,green顏色
4-2、獲取非線性輸出模型(y)
1、生成100個輸入點橫坐標
# 獲取訓練集橫坐標(在(-1,2)上均勻100個數,作為橫坐標)
line_x = np.linspace(-1,2,100)
2、計算非線性輸出?
根據前面輸入的100個橫坐標,求出它們的非線性輸出y:
# 計算非線性方程的y:
# 計算非線性輸出(非線性輸入x的非線性輸出y)
def Calculate(line_x, root):# 定義參數a = w[5]b = w[2] + w[4]*line_xc = w[0] + w[1]*line_x + w[3]*line_x*line_x# 計算輸出yif root == 1:line_y = (-b+np.sqrt(b*b - 4*a*c))/(2*a)return line_yelif root == 2:line_y = (-b-np.sqrt(b*b - 4*a*c))/(2*a)return line_y
3、根據這100個點畫出“曲線”
# 畫曲線
plt.plot(line_x, Calculate(line_x,1), 'r') #r:red
plt.plot(line_x, Calculate(line_x,2), 'r') #r:redplt.show()
?
?注:這里是點數量足夠多 ,才能看起來像曲線,如果點數量不夠,那么就是明顯的折線了。
比如只生成3個點:
line_x = np.linspace(-1,2,3)
非線性輸入代碼
# 手寫單層感知器(多數據分類)
import numpy as np
import matplotlib.pyplot as plt# 1、設置初始參數
# 輸入 #每一行對應一個標簽
# 六個參數分別為:x0 x1 x2 x1*x1 x1*x2 x2*x2
x = np.array([[1, 0, 0, 0, 0, 0], #坐標(0,0) -1[1, 0, 1, 0, 0, 1], #坐標(0,1) 1[1, 1, 0, 1, 0, 0], #坐標(1,0) 1[1, 1, 1, 1, 1, 1] #坐標(1,1) -1
])
# 這些點者用來訓練線性模型,作為線性模型的輸入。# 初始權重(0~1的隨機生產數)
w = np.random.random([6, 1]) #3行1列# 偏置
b = 1# 標簽(正確標簽,訓練結束的目標)
true = np.array([ #每一行對應一個標簽[-1],[1],[1],[-1]
])# 學習率
lr = 0.1# 開始訓練
for i in range(500):# 2、正向傳播:計算輸出yy = np.dot(x, w) #dot:矩陣乘法(x列==w行)# 3、反向傳播:更新權重w += lr * np.dot(x.T, true-y)/x.shape[0]
# w:權重 lr:學習率 np.dot:矩陣點乘 true-y:差 x.T:x的轉置 x.shape[0]:行數
print('epoch:', i) #迭代次數
print('weight:', w) #權重
print(y) #標簽# 4、訓練&&預測(畫圖)
# 4-1、畫點
# 正樣本坐標
x1, y1 = [0,1], [1,0] #坐標:(0,2), (1,3)
# 負樣本坐標
x2, y2 = [0,1], [0,1] #坐標:(4,2),(5,1)plt.scatter(x1, y1, c='b') #點:(x1,y1)坐標,blue顏色
plt.scatter(x2, y2, c='g') #點:(x2,y2)坐標,green顏色# 4-2、非線性輸出
# 獲取訓練集橫坐標(在(-1,2)上均勻100個數,作為橫坐標)
line_x = np.linspace(-1,2,100)# 計算非線性方程的y:
# 計算非線性輸出(非線性輸入x的非線性輸出y)
def Calculate(line_x, root):# 定義參數a = w[5]b = w[2] + w[4]*line_xc = w[0] + w[1]*line_x + w[3]*line_x*line_x# 計算輸出yif root == 1:line_y = (-b+np.sqrt(b*b - 4*a*c))/(2*a)return line_yelif root == 2:line_y = (-b-np.sqrt(b*b - 4*a*c))/(2*a)return line_y# 畫曲線
plt.plot(line_x, Calculate(line_x,1), 'r') #r:red
plt.plot(line_x, Calculate(line_x,2), 'r') #r:redplt.show()
總結
以上是生活随笔為你收集整理的深度学习--TensorFlow(3)线性神经网络(线性输入非线性输入)(实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习--TensorFlow (2)
- 下一篇: 深度学习--TensorFlow(4)B