熬過了上一篇漫長的代碼,稍微解開了一丟丟疑惑,使得抽象的BP有一點具體化了,可是還是有好多細節的東西沒有講清楚,比如,為什么要用激活函數?為什么隨機梯度下降沒有提到?下面我們來一一解開疑惑。
首先是為什么要使用激活函數?這要回顧一下我們在學習BP之前學習的感知器模型。它模仿的是人類體內的信號傳導的過程,當信號達到一定的閾值時,就可以繼續向后傳播。
那這個感知器模型和BP網絡有什么關系呢?在我們所看到的BP網絡的結構圖中,其實是被簡化了的,下面小編畫了一個邏輯更清晰一點的圖:
這樣我們就可以看出來,其實BP網絡是由一個一個的感知器組成,也就構成了一個真正的神經網絡,自然就能理解為什么要使用激活函數了。
接下來我們來看一下TensorFlow實現BP神經網絡到底有多簡單!
#構建一個結構為[10,15,1]的BP神經網絡
model = tf.keras.Sequential([tf.keras.layers.Dense(15,activation='relu',input_shape=(10,)),
tf.keras.layers.Dense(1)])
model.summary() #顯示網絡結構
model.compile(optimizer='SGD',loss='mse') #定義優化方法為隨機梯度下降,損失函數為mse
#x->訓練集,y——>bia標簽,epochs=10000訓練的次數,validation_data=(test_x,test_y)——>驗證集
history = model.fit(x,y,epochs=10000,validation_data=(test_x,test_y))
上面就是一個最簡單的BP網絡的網絡結構,小編還準備好了完整的通用框架代碼,不用總是修改隱藏層,可以直接使用哦!公眾號發送“BP源碼”就可以獲取!是不是非常驚訝!昨天的百行代碼完全消失了,這短短幾行代碼就可實現一個BP網絡。
這里解釋一下validation_data,這是驗證集,作用和測試集是一樣的,只不過驗證集是在訓練過程中對模型進行測試,這樣方便觀察模型的準確性。loss函數的作用是計算模型的預測誤差,也就是是衡量模型的準確度,常用的誤差函數還有mse,mae,rmse,mape等等,模型中有很多誤差函數不能直接調用,但是可以自己定義。
SGD就是我們所說的隨機梯度下降算法了,但是現在我們普遍認為“adam”是目前最好的優化算法,當然這也根據不同的神經網絡做不同的選擇。想要研究理論的讀者可以去查一查資料,小編作為實戰派就不對理論做過多的闡述了!
另外再列出來同樣強大的pytorch框架的代碼,大家可以自行選取。
class Model(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Sequential(
nn.Linear(10, 15),
nn.ReLU(),
nn.Dropout(), #防止過度擬合,TensorFlow也有
nn.Linear(15, 2)
)
def forward(self, x):
x = self.fc(x)
return x
關于選擇哪一個框架的問題,在TensorFlow2.0出現之前,小編會推薦pytorch,現在的TensorFlow2.0和pytorch代碼風格已經越來越接近了,但是TensorFlow2.0可以支持的平臺更多,所以這里推薦TensorFlow2.0。
有什么問題,歡迎大家留言討論!
-
信號
+關注
關注
11文章
2804瀏覽量
77099 -
閾值
+關注
關注
0文章
123瀏覽量
18549 -
函數
+關注
關注
3文章
4346瀏覽量
62968 -
BP網絡
+關注
關注
0文章
27瀏覽量
22068 -
tensorflow
+關注
關注
13文章
329瀏覽量
60629
發布評論請先 登錄
相關推薦
評論