日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

深度学习--TensorFlow(3)线性神经网络(线性输入非线性输入)(实现)

發布時間:2023/11/27 生活经验 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习--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)线性神经网络(线性输入非线性输入)(实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。