本文關(guān)鍵闡述了Python完成1個(gè)全連接層的神經(jīng)元網(wǎng)絡(luò),文章內(nèi)容緊扣主題進(jìn)行詳盡的基本介紹,具有很強(qiáng)的實(shí)用價(jià)值,必須的朋友可以學(xué)習(xí)一下
序言
在本文中,提前準(zhǔn)備用Python重新開始完成1個(gè)全連接層的神經(jīng)元網(wǎng)絡(luò)。你可能會(huì)說,為何需要自己去完成,有許多庫(kù)和架構(gòu)能夠給我們做這些事,例如Tensorflow、Pytorch等。這兒只想說僅有自己親自完成了,就是自己的。
想起今日他從接觸到了從事神經(jīng)元網(wǎng)絡(luò)有關(guān)工作早已是多少2、3年多,在其中也試著用tensorflow或pytorch架構(gòu)去完成某些傳統(tǒng)互聯(lián)網(wǎng)。但是對(duì)于反向傳播身后體制還是挺模糊不清。
梯度方向
梯度方向是函數(shù)公式升高更快方位,速度最快的方位換句話說正確的方向函數(shù)公式樣子很險(xiǎn)峻,那樣都是函數(shù)公式減少速度最快的方位。
盡管有關(guān)某些基礎(chǔ)理論、梯度消失和節(jié)點(diǎn)飽和狀態(tài)能夠傷害1個(gè)1、2、3可是細(xì)究或是沒有自信,當(dāng)然沒有親自動(dòng)手去完成過個(gè)反向傳播和完善練習(xí)全過程。所以覺得或是浮于表層,學(xué)有所用而。
最近這幾天有段空余時(shí)間、因此運(yùn)用這一段休息日即將把這一部分知識(shí)總結(jié)一下下、全面了解掌握
大家可能很多人都清楚訓(xùn)練神經(jīng)網(wǎng)絡(luò)的一個(gè)過程,便是升級(jí)網(wǎng)絡(luò)參數(shù),升級(jí)更新的趨勢(shì)是減少交叉熵值。其實(shí)就是將學(xué)習(xí)上的問題變換因?yàn)橐粋€(gè)改善的難題。我們?cè)撊绾紊?jí)主要參數(shù)呢?我們應(yīng)該測(cè)算參加練習(xí)主要參數(shù)相較于損害函數(shù)的導(dǎo)數(shù),接著求得梯度方向,接著應(yīng)用梯度下降法來升級(jí)主要參數(shù),迭代更新這一過程,都可以找到1個(gè)最好解決方案來降到最低交叉熵。
我們都知道反向傳播關(guān)鍵是用來清算交叉熵相較于權(quán)重值和參考點(diǎn)的導(dǎo)函數(shù)
或許已經(jīng)聽見或讀到了,一些關(guān)于在互聯(lián)網(wǎng)根據(jù)反向傳播來傳送誤差的信息內(nèi)容。再根據(jù)神經(jīng)細(xì)胞的w和b對(duì)誤差成就的尺寸。其實(shí)就是將誤差安排到每個(gè)神經(jīng)細(xì)胞上。但是這里的誤差(error)是什么意思呀?這一誤差的準(zhǔn)確的界定到底是什么呢?答案就是這種誤差是通過每層神經(jīng)元網(wǎng)絡(luò)所成就的,并且某一層樓誤差是后續(xù)層誤差前提下平攤的,網(wǎng)絡(luò)里第層誤差用以表明。
反向傳播都是基于4個(gè)基本方程的,通過這個(gè)方程式來數(shù)據(jù)誤差和交叉熵,這兒把這4個(gè)方程式一一列舉
對(duì)于如何講解這一4個(gè)方程式,接著想要1期共享來闡述。
classNeuralNetwork(object): def__init__(self): pass defforward(self,x): #回到前向傳播的Z可能就是w和b特征函數(shù),鍵入激活函數(shù)前的值 #回到激活函數(shù)傷害值A(chǔ) #z_s,a_s pass defbackward(self,y,z_s,a_s): #回到前向傳播中學(xué)到參數(shù)導(dǎo)函數(shù)dwdb pass deftrain(self,x,y,batch_size=10,epochs=100,lr=0.001): pass
我們是神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)全過程,其實(shí)就是練習(xí)全過程。主要分兩階段前向傳播和后向傳播
在前向傳播函數(shù)中,關(guān)鍵測(cè)算傳遞的Z和A,有關(guān)Z和A指的是什么請(qǐng)參閱前邊報(bào)表
在反向傳播中測(cè)算可學(xué)習(xí)培訓(xùn)自變量w和b的導(dǎo)函數(shù)
def__init__(self,layers=[2,10,1],activations=['sigmoid','sigmoid']): assert(len(layers)==len(activations)+1) self.layers=layers self.activations=activations self.weights=[] self.biases=[] foriinrange(len(layers)-1): self.weights.append(np.random.randn(layers[i+1],layers)) self.biases.append(np.random.randn(layers[i+1],1))
layers主要參數(shù)用以特定每層神經(jīng)細(xì)胞的數(shù)量
activations為每層特定激活函數(shù),其實(shí)就是
來簡(jiǎn)易解悉一下下編碼assert(len(layers)==len(activations)+1)
foriinrange(len(layers)-1): self.weights.append(np.random.randn(layers[i+1],layers)) self.biases.append(np.random.randn(layers[i+1],1)) 因?yàn)闄?quán)重值連接每個(gè)層神經(jīng)細(xì)胞的w和b,可能就兩兩層之間的方程式,上面編碼是對(duì) 前向傳播 deffeedforward(self,x): #回到前向傳播的值 a=np.copy(x) z_s=[] a_s=[a] foriinrange(len(self.weights)): activation_function=self.getActivationFunction(self.activations) z_s.append(self.weights.dot(a)+self.biases) a=activation_function(z_s[-1]) a_s.append(a) return(z_s,a_s)
這里激活函數(shù),這個(gè)函數(shù)返回值是一個(gè)函數(shù),在python用lambda來返回一個(gè)函數(shù),這里簡(jiǎn)答留下一個(gè)伏筆,隨后會(huì)對(duì)其進(jìn)行修改。
staticmethod def getActivationFunction(name): if(name=='sigmoid'): return lambda x:np.exp(x)/(1+np.exp(x)) elif(name=='linear'): return lambda x:x elif(name=='relu'): def relu(x): y=np.copy(x) y[y<0]=0 return y return relu else: print('Unknown activation function.linear is used') return lambda x:x [staticmethod] def getDerivitiveActivationFunction(name): if(name=='sigmoid'): sig=lambda x:np.exp(x)/(1+np.exp(x)) return lambda x:sig(x)*(1-sig(x)) elif(name=='linear'): return lambda x:1 elif(name=='relu'): def relu_diff(x): y=np.copy(x) y[y>=0]=1 y[y<0]=0 return y return relu_diff else: print('Unknown activation function.linear is used') return lambda x:1
反向傳播
這是本次分享重點(diǎn)
def backpropagation(self,y,z_s,a_s): dw=[]#dC/dW db=[]#dC/dB deltas=[None]*len(self.weights)#delta=dC/dZ計(jì)算每一層的誤差 #最后一層誤差 deltas[-1]=((y-a_s[-1])*(self.getDerivitiveActivationFunction(self.activations[-1]))(z_s[-1])) #反向傳播 for i in reversed(range(len(deltas)-1)): deltas<i>=self.weights[i+1].T.dot(deltas[i+1])*(self.getDerivitiveActivationFunction(self.activations<i>)(z_s<i>)) #a=[print(d.shape)for d in deltas] batch_size=y.shape[1] db=[d.dot(np.ones((batch_size,1)))/float(batch_size)for d in deltas] dw=[d.dot(a_s<i>.T)/float(batch_size)for i,d in enumerate(deltas)] #返回權(quán)重(weight)矩陣and偏置向量(biases) return dw,db
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)硪欢ǖ膸椭?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128844.html
摘要:神經(jīng)網(wǎng)絡(luò)的補(bǔ)充前篇后篇數(shù)據(jù)預(yù)處理權(quán)重初始化經(jīng)典神經(jīng)網(wǎng)絡(luò)搞明白后,我們接下來看看他的變種,也是本系列的主角卷積神經(jīng)網(wǎng)絡(luò)。卷積神經(jīng)網(wǎng)絡(luò)一個(gè)普通的卷積神經(jīng)網(wǎng)絡(luò)由各種層按順序堆疊而成,這些層主要分三類卷積層池化層和全連接層。 【DL-CV】神經(jīng)網(wǎng)絡(luò)的補(bǔ)充【DL-CV】數(shù)據(jù)預(yù)處理&權(quán)重初始化 經(jīng)典神經(jīng)網(wǎng)絡(luò)搞明白后,我們接下來看看他的變種,也是本系列的主角——卷積神經(jīng)網(wǎng)絡(luò)(Convolution...
摘要:神經(jīng)網(wǎng)絡(luò)的補(bǔ)充前篇后篇數(shù)據(jù)預(yù)處理權(quán)重初始化經(jīng)典神經(jīng)網(wǎng)絡(luò)搞明白后,我們接下來看看他的變種,也是本系列的主角卷積神經(jīng)網(wǎng)絡(luò)。卷積神經(jīng)網(wǎng)絡(luò)一個(gè)普通的卷積神經(jīng)網(wǎng)絡(luò)由各種層按順序堆疊而成,這些層主要分三類卷積層池化層和全連接層。 【DL-CV】神經(jīng)網(wǎng)絡(luò)的補(bǔ)充【DL-CV】數(shù)據(jù)預(yù)處理&權(quán)重初始化 經(jīng)典神經(jīng)網(wǎng)絡(luò)搞明白后,我們接下來看看他的變種,也是本系列的主角——卷積神經(jīng)網(wǎng)絡(luò)(Convolution...
摘要:本論文將嘗試概述卷積網(wǎng)絡(luò)的架構(gòu),并解釋包含激活函數(shù)損失函數(shù)前向傳播和反向傳播的數(shù)學(xué)推導(dǎo)。本文試圖只考慮帶有梯度下降優(yōu)化的典型卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)的制定。 近日南洋理工大學(xué)研究者發(fā)布了一篇描述卷積網(wǎng)絡(luò)數(shù)學(xué)原理的論文,該論文從數(shù)學(xué)的角度闡述整個(gè)卷積網(wǎng)絡(luò)的運(yùn)算與傳播過程。該論文對(duì)理解卷積網(wǎng)絡(luò)的數(shù)學(xué)本質(zhì)非常有幫助,有助于讀者「徒手」(不使用卷積API)實(shí)現(xiàn)卷積網(wǎng)絡(luò)。論文地址:https://arxiv....
閱讀 923·2023-01-14 11:38
閱讀 895·2023-01-14 11:04
閱讀 756·2023-01-14 10:48
閱讀 2055·2023-01-14 10:34
閱讀 961·2023-01-14 10:24
閱讀 840·2023-01-14 10:18
閱讀 510·2023-01-14 10:09
閱讀 588·2023-01-14 10:02