DNN(全连接神经网络)
一.??
DNN網絡一般分為三層
1.輸入層
2.隱藏層
3.輸出層
簡單網絡如下:
?二.前向傳播
從第二層開始,每一個神經元都會獲得它上一層所有神經元的結果。即每一個 y = wx + b的值。
具體分析如下:
如此下去就會非??赡艹霈F了一個問題------就是越靠后的神經元獲得的y值會非常大,試想一下,如果這個數遠遠大于它前面神經元的值,前面神經元對整個網絡的表達就顯得毫無意義。所以我們在每創建一層網絡時就要多“y”進行一次約束。
我們有很多選擇,但最好的方法就是運用Sigmoid函數。它可以將每層網絡中的神經元全部控制在0-1之間。
我們到最后輸出層每個神經元就可以獲得一個y值。
利用tensorflow所構建網絡的代碼如下:
model = Sequential([layers.Dense(256, activation=tf.nn.sigmoid),layers.Dense(128, activation=tf.nn.sigmoid),layers.Dense(64, activation=tf.nn.sigmoid),layers.Dense(32, activation=tf.nn.sigmoid),layers.Dense(10) ])三.反向傳播(數據一層層傳播來,我們就一層層給它們每個反饋)
寫到這里,我覺的我們可以先返回到我們出發點,我們為什么想要搭建一個網絡,我相信大部分人的出發點就是想要網絡對未知物體進行預測。反向傳播所做的就是讓每一個神經元都擁有一個w,h值。這樣我們在傳進一個新的數據時,我們可以將他準確的預測。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Here we go!!!!!
訓練的目的是希望神經網絡的輸出和真實數據的輸出"一樣",但是在"一樣"之前,模型輸出和真實數據都是存在一定的差異,我們把這個"差異"作這樣的一個參數ee代表誤差的意思,那么模型輸出加上誤差之后就等于真實標簽了,作:y=wx+b+e。我們把每次的失誤都加起來。為了防止e值的正負抵消。我們取其平方值。這樣我們就可以獲得一個損失函數。如下:
? ????????????????????????????????
我們將損失函數(Loss)展開:
?根據展開式作圖:
??????????????????? ?
?損失值顧名思義,它就是誤差,我們肯定希望它越小越好,所以我們接下來想做的就是取得的新w值與b值使隨時函數取得的值越小越好。專家們名其曰:梯度下降。
數學公式如下:
我們可以利用此公式延申到我們計算w,b上
?寫出總式子:? ? ? ??????????????????????????????
?帶入loss函數:
?利用復合函數:
?最終可以獲得:
這樣我們就可以獲得一個線性關系:
?利用這種鏈式傳播,我們就可以更新我們的每個神經元。
?利用tensorFlow所實現的反向傳播如下:
logits = model(x)y_onehot = tf.one_hot(y, depth=10)# 兩種計算誤差函數的方法loss = tf.reduce_mean(tf.losses.MSE(y_onehot, logits))loss2 = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True)loss2 = tf.reduce_mean(loss2)loss_meter.update_state(loss)# 分別對w, b求偏導grads = tape.gradient(loss2, model.trainable_variables)# 將所有參數進行原地更新。即w‘ = w - lr*gradoptimizer.apply_gradients(zip(grads, model.trainable_variables))?五:總結
全連接網絡可以經過大量數據的訓練之后,對一個未知事物進行預測。是深度學習的基礎。如有不足之處,還望指正。文章有所參考,但僅為少數公理。
總結
以上是生活随笔為你收集整理的DNN(全连接神经网络)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 做路由器系统下载文件,用Li
- 下一篇: 北京医保报销比例,范围