1. 神經網路weight參數怎麼初始化
不一定,也可設置為[-1,1]之間。事實上,必須要有權值為負數,不然只有激活神經元,沒有抑制的也不行。至於為什麼在[-1,1]之間就足夠了,這是因為歸一化和Sigmoid函數輸出區間限制這兩個原因。一般在編程時,設置一個矩陣為bounds=ones(S,1)*[-1,1]; %權值上下界。
在MATLAB中,可以直接使用net = init(net);來初始化。我們可以通過設定網路參數net.initFcn和net.layer{i}.initFcn這一技巧來初始化一個給定的網路。net.initFcn用來決定整個網路的初始化函數。前饋網路的預設值為initlay,它允許每一層用單獨的初始化函數。設定了net.initFcn ,那麼參數net.layer{i}.initFcn 也要設定用來決定每一層的初始化函數。對前饋網路來說,有兩種不同的初始化方式經常被用到:initwb和initnw。initwb函數根據每一層自己的初始化參數(net.inputWeights{i,j}.initFcn)初始化權重矩陣和偏置。前饋網路的初始化權重通常設為rands,它使權重在-1到1之間隨機取值。這種方式經常用在轉換函數是線性函數時。initnw通常用於轉換函數是曲線函數。它根據Nguyen和Widrow[NgWi90]為層產生初始權重和偏置值,使得每層神經元的活動區域能大致平坦的分布在輸入空間。
2. 關於BP神經網路訓練次數問題
初始權值不一樣,每次訓練重置初始權值
3. 第三代神經網路 SNN--脈沖神經網路
脈沖神經網路 (SNN) 屬於第三代神經網路模型,實現了更高級的生物神經模擬水平。除了神經元和突觸狀態之外,SNN 還將時間概念納入了其操作之中,是一種模擬大腦神經元動力學的一類很有前途的模型。
那麼什麼是第一代和第二代神經網路模型呢?
第一代神經網路
第一代神經網路又稱為感知器,在1950年左右被提出來,它的演算法只有兩層,輸入層輸出層,主要是線性結構。它不能解決線性不可分的問題,對稍微復雜一些的函數都無能為力,如異或操作。
第二代神經網路:BP 神經網路
為了解決第一代神經網路的缺陷,在1980年左右 Rumelhart、Williams 等人提出第二代神經網路多層感知器 (MLP)。和第一代神經網路相比,第二代在輸入層之間有多個隱含層的感知機,可以引入一些非線性的結構,解決了之前無法模擬異或邏輯的缺陷
第三代神經網路:脈沖神經網路
第三代神經網路,脈沖神經網路 (Spiking Neural Network,SNN) ,旨在彌合神經科學和機器學習之間的差距, 使用最擬合生物神經元機制的模型來進行計算,更接近生物神經元機制。 脈沖神經網路與目前流行的神經網路和機器學習方法有著根本上的不同。SNN 使用脈沖——這是一種發生在時間點上的離散事件——而非常見的連續值。每個峰值由代表生物過程的微分方程表示出來,其中最重要的是神經元的膜電位。本質上,一旦神經元達到了某一電位,脈沖就會出現,隨後達到電位的神經元會被重置。對此,最常見的模型是 Leaky Integrate-And-Fire (LIF) 模型。此外,SNN 通常是稀疏連接的,並會利用特殊的網路拓撲。
脈沖神經網路 (SNN-Spiking Neuron Networks) 包含具有時序動力學特性的神經元節點、穩態-可塑性平衡的突觸結構、功能特異性的網路環路等,高度借鑒了生物啟發的局部非監督(如脈沖時序依賴可塑性、短時突觸可塑性、局部穩態調節等)、全局弱監督(如多巴胺獎賞學習、基於能量的函數優化等)的生物優化方法,因此具有強大的時空信息表徵、非同步事件信息處理、網路自組織學習等能力。 [1]
脈沖神經網路,其 模擬神經元 更加接近實際,除此之外,把時間信息的影響也考慮其中。思路是這樣的,動態神經網路中的 神經元 不是在每一次迭代傳播中都被激活(而在典型的多層感知機網路中卻是),而是在它的 膜電位 達到某一個特定值才被激活。當一個神經元被激活,它會產生一個信號傳遞給其他神經元,提高或降低其膜電位。
在脈沖神經網路中,神經元的當前激活水平(被建模成某種微分方程)通常被認為是當前狀態,一個輸入脈沖會使當前這個值升高,持續一段時間,然後逐漸衰退。出現了很多編碼方式把這些輸出脈沖序列解釋為一個實際的數字,這些編碼方式會同時考慮到脈沖頻率和脈沖間隔時間。
藉助於神經科學的研究,人們可以精確的建立基於脈沖產生時間 神經網路模型 。這種新型的神經網路採用脈沖編碼(spike coding),通過獲得脈沖發生的精確時間,這種新型的神經網路可以進行獲得更多的信息和更強的計算能力。
20220112【脈絡分明:脈沖神經網路及其應用】余肇飛:脈沖神經網路學習理論與方法_嗶哩嗶哩_bilibili
如何看待第三代神經網路 SNN?詳解脈沖神經網路的架構原理、數據集和訓練方法-極市開發者社區 (cvmart.net)
脈沖神經網路_網路 (.com)
Frontiers | Spiking Neural Network (SNN) With Memristor Synapses Having Non-linear Weight Update | Frontiers in Computational Neuroscience
【強基固本】脈沖神經網路(Spiking Neural Network)介紹 (qq.com)
4. Keras快速構建神經網路模型
用Keras搭建神經網路的步驟:
深度學習框架Keras——像搭積木般構建神經網路,主要分為7個部分,每個部分只需要幾個keras API函數就能實現,用戶即可像搭積木般一層層構建神經網路模型。
1. 創建模型 Create model
2. 添加層級 Add Layer
3. 模型編譯 Compile
4. 數據填充 Fit
5. 模型評估 Evaluate
6. 模型預測 Predict
7. 模型保存 Save model
下面章節會對每一部分具體來介紹。。。
Keras 中主要有三類模型:Sequential model, Functional model, Subclass model
在開始創建模型之前,首先需要引入tensorflow和keras模塊,然後再創建一個Sequential model
Sequential API定義如下:
layers參數可以為空, 然後通過add method向模型中添加layer,相對應的通過pop method移除模型中layer。
創建Function API模型,可以調用Keras.Model來指定多輸入多數出。
Keras.Model定義:
Layers是神經網路基本構建塊。一個Layer包含了tensor-in/tensor-out的計算方法和一些狀態,並保存在TensorFlow變數中(即layers的權重weights)。
Layers主要分為6個類別,基礎層,核心層,卷基層,池化層,循環層,融合層。
對派生類的實現可以用以下方法:
** init (): 定義layer的屬性,創建layer的靜態變數。
** build(self, input_shape): 創建依賴於輸入的變數,可以調用add_weight()。
** call(self, *args, **kwargs): 在確保已調用build()之後,在 call 中調用。
** get_config(self): 返回包含用於初始化此層的配置的字典類型。
創建SimpleDense派生類,在build()函數里添加trainable weights。實現y=input*w +b
結果輸出:
創建ComputeSum派生類,在 init 函數里添加 non-trainable weights。實現輸入矩陣沿軸0元素相加後,x=x+self.total
結果輸出:
核心層是最常用的層,涉及到數據的轉換和處理的時候都會用到這些層。
Dense層就是所謂的全連接神經網路層,簡稱全連接層。全連接層中的每個神經元與其前一層的所有神經元進行全連接。
Dense 實現以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐個元素計算的激活函數,kernel 是由網路層創建的權值矩陣,以及 bias 是其創建的偏置向量 (只在 use_bias 為 True 時才有用)。
將激活函數應用於輸出。輸入信號進入神經元後進行的運算處理。
sigmoid、tanh、ReLU、softplus的對比曲線如下圖所示:
激活函數可以通過設置單獨的激活層Activation實現,也可以在構造層對象時通過傳遞 activation 參數實現:
Dropout在訓練中每次更新時,將輸入單元的按比率隨機設置為0,這有助於防止過擬合。未設置為0的輸入將按1 /(1-rate)放大,以使所有輸入的總和不變。
請注意,僅當訓練設置為True時才應用Dropout層,以便在推理過程中不會丟棄任何值。 使用model.fit時,訓練將自動適當地設置為True。
將輸入展平。不影響批量大小。注意:如果輸入的形狀是(batch,)沒有特徵軸,則展平會增加通道尺寸,而輸出的形狀是(batch, 1)。
將輸入重新調整為特定的尺寸
將任意表達式封裝為Layer對象。在Lambda層,以便在構造模型時可以使用任意TensorFlow函數。 Lambda層最適合簡單操作或快速實驗。 Lambda層是通過序列化Python位元組碼來保存的。
使用覆蓋值覆蓋序列,以跳過時間步。
對於輸入張量的每一個時間步(張量的第一個維度),如果所有時間步中輸入張量的值與mask_value相等,則將在所有下游層中屏蔽(跳過)該時間步。如果任何下游層不支持覆蓋但仍然收到此類輸入覆蓋信息,會引發異常。
舉例說明:
Embedding 是一個將離散變數轉為連續向量表示的一個方式。該層只能用作模型中的第一層。
Embedding 有以下3個主要目的: 在 embedding 空間中查找最近鄰,這可以很好的用於根據用戶的興趣來進行推薦。 作為監督性學習任務的輸入。 用於可視化不同離散變數之間的關系.
舉例說明:
輸出結果:
由維基網路的介紹我們可以得知,卷積是一種定義在兩個函數(𝑓跟𝑔)上的數學操作,旨在產生一個新的函數。那麼𝑓和𝑔的卷積就可以寫成𝑓∗𝑔,數學定義如下:
對應到不同方面,卷積可以有不同的解釋:𝑔 既可以看作我們在深度學習里常說的核(Kernel),也可以對應到信號處理中的濾波器(Filter)。而 𝑓 可以是我們所說的機器學習中的特徵(Feature),也可以是信號處理中的信號(Signal)。f和g的卷積 (𝑓∗𝑔)就可以看作是對𝑓的加權求和。
一維時域卷積操作:
二維圖像卷積操作:
卷積運算的目的是提取輸入的不同特徵,第一層卷積層可能只能提取一些低級的特徵如邊緣、線條和角等層級,更多層的網路能從低級特徵中迭代提取更復雜的特徵。
一維卷積層(即時域卷積),用以在一維輸入信號上進行鄰域濾波。
舉例說明:
結果輸出:
2D 卷積層 (例如對圖像的空間卷積)。
舉例說明:
結果輸出:
3D卷積層(例如體積上的空間卷積)
舉例說明:
結果輸出:
深度可分離1D卷積。該層執行分別作用在通道上的深度卷積,然後是混合通道的逐點卷積。 如果use_bias為True並提供了一個偏差初始值設定項,則它將偏差向量添加到輸出中。 然後,它可選地應用激活函數以產生最終輸出。
深度可分離的2D卷積。可分離的卷積包括首先執行深度空間卷積(它分別作用於每個輸入通道),然後是點向卷積,它將混合所得的輸出通道。 depth_multiplier參數控制在深度步驟中每個輸入通道生成多少個輸出通道。
直觀上,可分離的卷積可以理解為將卷積內核分解為兩個較小內核的一種方式,或者是Inception塊的一種極端版本。
轉置卷積層 (有時被成為反卷積)。對轉置卷積的需求一般來自希望使用 與正常卷積相反方向的變換,將具有卷積輸出尺寸的東西 轉換為具有卷積輸入尺寸的東西, 同時保持與所述卷積相容的連通性模式。
池化層是模仿人的視覺系統對數據進行降維,用更高層次的特徵表示圖像。實施池化的目的:降低信息冗餘;提升模型的尺度不變性、旋轉不變性。 防止過擬合。
通常有最大池化層,平均池化層。
池化層有三種形態:1D 用於一維數據,2D 一般用於二維圖像數據,3D 帶時間序列數據的圖像數據
循環神經網路(Recurrent Neural Network, 簡稱 RNN),循環神經網路的提出便是基於記憶模型的想法,期望網路能夠記住前面出現的特徵,並依據特徵推斷後面的結果,而且整體的網路結構不斷循環,因此得名為循環神經網路。
長短期記憶網路(Long-Short Term Memory, LSTM )論文首次發表於1997年。由於獨特的設計結構,LSTM適合於處理和預測時間序列中間隔和延遲非常長的重要事件。
舉例說明:
結果輸出:
GRU 門控循環單元- Cho et al. 2014.
在LSTM中引入了三個門函數:輸入門、遺忘門和輸出門來控制輸入值、記憶值和輸出值。而在GRU模型中只有兩個門:分別是更新門和重置門。與LSTM相比,GRU內部少了一個」門控「,參數比LSTM少,但是卻也能夠達到與LSTM相當的功能。考慮到硬體的計算能力和時間成本,因而很多時候我們也就會選擇更加」實用「的GRU。
舉例說明:
結果輸出:
循環神經網路層基類。
關於指定 RNN 初始狀態的說明
您可以通過使用關鍵字參數 initial_state 調用它們來符號化地指定 RNN 層的初始狀態。 initial_state 的值應該是表示 RNN 層初始狀態的張量或張量列表。
可以通過調用帶有關鍵字參數 states 的 reset_states 方法來數字化地指定 RNN 層的初始狀態。 states 的值應該是一個代表 RNN 層初始狀態的 Numpy 數組或者 Numpy 數組列表。
關於給 RNN 傳遞外部常量的說明
可以使用 RNN. call (以及 RNN.call)的 constants 關鍵字參數將「外部」常量傳遞給單元。 這要求 cell.call 方法接受相同的關鍵字參數 constants。 這些常數可用於調節附加靜態輸入(不隨時間變化)上的單元轉換,也可用於注意力機制。
舉例說明:
在訓練模型之前,我們需要配置學習過程,這是通過compile方法完成的。
他接收三個參數:優化器 opt
5. bp神經網路怎麼改變訓練次數啊怎麼總是默認次數
答案:然後瘋狂叫好。
6. 神經網路,輸入層的NULL值怎麼初始化處理
BP網路用於函數逼近時,權值的調節採用的是負梯度下降法,這種調節權值 的方法有它的局限性,既存在著收斂速度慢和局部極小等缺點。而徑向基神經網路在逼近能力、分類能力和學習速度等方面均優於BO網路。
從理論上講,RBF網路和BP網路一樣可近似任何的連續非線形函數,兩者的主要差別在於各使用不同的作用函數,BP網路中的隱層節點使用的是Sigmoid函數,其函數值在輸入空間中無限大的范圍內為非零值,而RBF網路的作用函數則是局部的。
7. 神經網路是什麼 歸一化又怎麼還原
神經網路是一種數據處理工具,或者叫數據處理方法。可以說是一種利用少量數據建立起一個帶有誤差的數據網路的一種方法,具體的建議你看一下這方面的ppt,在網路文庫里可以找到很多ppt。
歸一化之後如果要把數據取出來可以反歸一化,用歸一化的公式反過來推一下,反歸一化公式就出來了。
8. Pytorch_循環神經網路RNN
RNN是Recurrent Neural Networks的縮寫,即循環神經網路,它常用於解決序列問題。RNN有記憶功能,除了當前輸入,還把上下文環境作為預測的依據。它常用於語音識別、翻譯等場景之中。
RNN是序列模型的基礎,盡管能夠直接調用現成的RNN演算法,但後續的復雜網路很多構建在RNN網路的基礎之上,如Attention方法需要使用RNN的隱藏層數據。RNN的原理並不復雜,但由於其中包括循環,很難用語言或者畫圖來描述,最好的方法是自己手動編寫一個RNN網路。本篇將介紹RNN網路的原理及具體實現。
在學習循環神經網路之前,先看看什麼是序列。序列sequence簡稱seq,是有先後順序的一組數據。自然語言處理是最為典型的序列問題,比如將一句話翻譯成另一句話時,其中某個詞彙的含義不僅取決於它本身,還與它前後的多個單詞相關。類似的,如果想預測電影的情節發展,不僅與當前的畫面有關,還與當前的一系列前情有關。在使用序列模型預測的過程中,輸入是序列,而輸出是一個或多個預測值。
在使用深度學習模型解決序列問題時, 最容易混淆的是,序列與序列中的元素 。在不同的場景中,定義序列的方式不同,當分析單詞的感情色彩時,一個單詞是一個序列seq;當分析句子感情色彩時,一個句子是一個seq,其中的每個單詞是序列中的元素;當分析文章感情色彩時,一篇文章是一個seq。簡單地說,seq是最終使用模型時的輸入數據,由一系列元素組成。
當分析句子的感情色彩時,以句為seq,而句中包含的各個單詞的含義,以及單詞間的關系是具體分析的對象,此時,單詞是序列中的元素,每一個單詞又可有多維特徵。從單詞中提取特徵的方法將在後面的自然語言處理中介紹。
RNN有很多種形式,單個輸入單個輸入;多個輸入多個輸出,單個輸入多個輸出等等。
舉個最簡單的例子:用模型預測一個四字短語的感情色彩,它的輸入為四個元素X={x1,x2,x3,x4},它的輸出為單個值Y={y1}。字的排列順序至關重要,比如「從好變壞」和「從壞變好」,表達的意思完全相反。之所以輸入輸出的個數不需要一一對應,是因為中間的隱藏層,變向存儲中間信息。
如果把模型設想成黑盒,如下圖所示:
如果模型使用全連接網路,在每次迭代時,模型將計算各個元素x1,x2...中各個特徵f1,f2...代入網路,求它們對結果y的貢獻度。
RNN網路則要復雜一些,在模型內部,它不是將序列中所有元素的特徵一次性輸入模型,而是每一次將序列中單個元素的特徵輸入模型,下圖描述了RNN的數據處理過程,左圖為分步展示,右圖將所有時序步驟抽象成單一模塊。
第一步:將第一個元素x1的特徵f1,f2...輸入模型,模型根據輸入計算出隱藏層h。
第二步:將第二個元素x2的特徵輸入模型,模型根據輸入和上一步產生的h再計算隱藏層h,其它元素以此類推。
第三步:將最後一個元素xn的特徵輸入模型,模型根據輸入和上一步產生的h計算隱藏層h和預測值y。
隱藏層h可視為將序列中前面元素的特徵和位置通過編碼向前傳遞,從而對輸出y發生作用,隱藏層的大小決定了模型攜帶信息量的多少。隱藏層也可以作為模型的輸入從外部傳入,以及作為模型的輸出返回給外部調用。
本例仍使用上篇中的航空乘客序列數據,分別用兩種方法實現RNN:自己編寫程序實現RNN模型,以及調用Pytorch提供的RNN模型。前一種方法主要用於剖析原理,後一種用於展示常用的調用方法。
首先導入頭文件,讀取乘客數據,做歸一化處理,並將數據切分為測試集和訓練集,與之前不同的是加入了create_dataset函數,用於生成序列數據,序列的輸入部分,每個元素中包括兩個特徵:前一個月的乘客量prev和月份值mon,這里的月份值並不是關鍵特徵,主要用於在常式中展示如何使用多個特徵。
第一步:實現模型類,此例中的RNN模型除了全連接層,還生成了一個隱藏層,並在下一次前向傳播時將隱藏層輸出的數據與輸入數據組合後再代入模型運算。
第二步,訓練模型,使用全部數據訓練500次,在每次訓練時,內部for循環將序列中的每個元素代入模型,並將模型輸出的隱藏層和下一個元素一起送入下一次迭代。
第三步:預測和作圖,預測的過程與訓練一樣,把全部數據拆分成元素代入模型,並將每一次預測結果存儲在數組中,並作圖顯示。
需要注意的是,在訓練和預測過程中,每一次開始輸入新序列之前,都重置了隱藏層,這是由於隱藏層的內容只與當前序列相關,序列之間並無連續性。
程序輸出結果如下圖所示:
經過500次迭代,使用RNN的效果明顯優於上一篇中使用全連接網路的擬合效果,還可以通過調整超參數以及選擇不同特徵,進一步優化。
使用Pytorch提供的RNN模型,torch.nn.RNN類可直接使用,是循環網路最常用的解決方案。RNN,LSTM,GRU等循環網路都實現在同一源碼文件torch/nn/moles/rnn.py中。
第一步:創建模型,模型包含兩部分,第一部分是Pytorch提供的RNN層,第二部分是一個全連接層,用於將RNN的輸出轉換成輸出目標的維度。
Pytorch的RNN前向傳播允許將隱藏層數據h作為參數傳入模型,並將模型產生的h和y作為函數返回值。形如: pred, h_state = model(x, h_state)
什麼情況下需要接收隱藏層的狀態h_state,並轉入下一次迭代呢?當處理單個seq時,h在內部前向傳遞;當序列與序列之間也存在前後依賴關系時,可以接收h_state並傳入下一步迭代。另外,當模型比較復雜如LSTM模型包含眾多參數,傳遞會增加模型的復雜度,使訓練過程變慢。本例未將隱藏層轉到模型外部,這是由於模型內部實現了對整個序列的處理,而非處理單個元素,而每次代入的序列之間又沒有連續性。
第二步:訓練模型,與上例中把序列中的元素逐個代入模型不同,本例一次性把整個序列代入了模型,因此,只有一個for循環。
Pythorch支持批量處理,前向傳遞時輸入數據格式是[seq_len, batch_size, input_dim),本例中輸入數據的維度是[100, 1, 2],input_dim是每個元素的特徵數,batch_size是訓練的序列個數,seq_len是序列的長度,這里使用70%作為訓練數據,seq_len為100。如果數據維度的順序與要求不一致,一般使用transpose轉換。
第三步:預測和作圖,將全部數據作為序列代入模型,並用預測值作圖。
程序輸出結果如下圖所示:
可以看到,經過500次迭代,在前100個元素的訓練集上擬合得很好,但在測試集效果較差,可能存在過擬合。
9. 深度學習中的神經網路參數怎麼調整
根據前一次運行的情況做調整,例如出現梯度爆炸則要調低學習速率,出現過擬合則要調高正則化參數的系數。