2010-07-01 17 views
13

基本上我知道一個神經網絡的概念和它是什麼,但我不知道它是如何看起來,當你編碼或如何存儲數據,我經歷了很多教程,我發現谷歌,但couldn找不到任何代碼,只是概念和算法。神經網絡,他們如何看待編碼?

任何人都可以給我一段簡單的神經網絡代碼,像「Hello World!」嗎?

+1

一個簡單的網絡在什麼語言? – 2010-07-01 17:03:44

+0

我會說與語言無關的標記。 – 2010-07-01 17:11:08

+0

[澄清神經網絡中扮演蛇的可能的重複](http://stackoverflow.com/questions/42099814/clarification-on-a-neural-net-that-plays-snake) – devinbost 2017-02-15 20:31:25

回答

7

您主要需要的是一個對象,表示與其他神經元(代表突觸)及其權重的相關聯的單個神經元。

在一個典型的OOP語言的單個神經元將是類似

class Synapse 
{ 
    Neuron sending; 
    Neuron receiving; 
    float weight; 
} 

class Neuron 
{ 
    ArrayList<Synapse> toSynapses; 
    ArrayList<Synapse> fromSynapses; 

    Function threshold; 
} 

其中threshold表示被施加在輸入加權總和,以查看是否神經元激活自身,並傳播該信號的功能。

當然,那麼你就需要特定的算法前饋網或背傳播將在這個數據結構進行操作的學習。

最簡單的東西,你可以開始實施將是一個簡單的感知器,你可以找到一些信息here

+0

有很多其他類型神經網絡,當然,比簡單的體重和閾值類型。 – 2010-07-01 19:46:22

+0

當然有,但我們說的是從某個地方開始..而你通常從一個簡單的東西開始,然後其他類型的神經網絡通常依賴於簡單元素的可伸縮性(就像真正的大腦) – Jack 2010-07-01 19:58:30

4

AI-Junkie有很棒的tutorial on (A)NNs他們有the code posted there

這裏是一個神經元(從AI-迷):

struct SNeuron 
{ 

    //the number of inputs into the neuron 
    int m_NumInputs; 

    //the weights for each input 
    vector<double> m_vecWeight; 

    //ctor 
    SNeuron(int NumInputs); 

}; 

這裏是一個神經元層(AI-迷):

struct SNeuronLayer 
{ 
    //the number of neurons in this layer 
    int m_NumNeurons; 

    //the layer of neurons 
    vector<SNeuron> m_vecNeurons; 

    SNeuronLayer(int NumNeurons, int NumInputsPerNeuron); 
}; 

就像我之前提到的......你可以找到所有與ai-junkie(A)NN教程的代碼。

+0

哇,該網站是醜陋...但有用! – 2010-07-01 19:47:02

+1

@Justin,美麗是在旁觀者的眼睛;) – Kiril 2010-07-01 20:24:19

+2

或啤酒持有人,視情況而定。 – 2010-07-01 21:52:31

7

你說你已經對神經網絡很熟悉,但是因爲有許多不同類型的複雜度不同的神經網絡(卷積,赫比奇,科諾寧等),我會通過一個簡單的前饋神經網絡,只是爲了確保我們在同一頁面上。

甲神經網絡基本包括以下東西

  1. 神經元
    1. 輸入神經元(多個)
    2. 隱藏神經元(可選)
    3. 輸出神經元(多個)
  2. 神經元之間的聯繫(有時被稱爲類似於生物學的突觸)
  3. 激活函數

神經元具有激活值。在評估網絡時,輸入節點的激活被設置爲實際輸入。來自輸入節點的鏈接導致節點更接近輸出,通常是一層或多層隱藏節點。在每個神經元,輸入激活使用激活函數進行處理。可以使用不同的激活函數,有時它們甚至可以在單個網絡的神經元內變化。

激活功能將神經元的激活處理成其輸出。早期的實驗通常使用簡單的閾值函數(即激活> 0.5?1:0),現在經常使用Sigmoid function

激活函數的輸出然後通過鏈接傳播到下一個節點。每個鏈接都有一個適用於其輸入的相關權重。

最後,從輸出神經元的激活中提取網絡的輸出。

我已經放在一起非常簡單(並且非常詳細...)示例here。它用Ruby編寫,並計算AND,它就像它一樣簡單。

一個更棘手的問題是如何真正創建一個有用的網絡。該示例的簡單網絡是手動創建的,但這對於更復雜的問題是不可行的。有兩種方法我知道,最常見的是backpropagation。較少使用的是neuroevolution,其中鏈接的權重是使用遺傳算法確定的。

1

這個is the NUPIC programmer's指南。 NUPIC是實現他們的基礎上,新大腦皮層

的結構和工作原理(HTM)的框架這是他們如何定義HTM

HTM技術能夠解決機器學習許多困難的問題的可能性,推理和預測。我們與客戶探索的一些應用領域包括識別圖像中的對象,識別視頻中的行爲,識別說話者的性別,預測流量模式,對雜亂文本進行光學字符識別,評估醫療圖像以及預測點擊模式在網上。

這是nument 1.5

from nupic.network import * 
from nupic.network.simpledatainterface import WideDataInterface 
def TheNet(): 
    net=SimpleHTM(
      levelParams=[ 
      { # Level 0 
      }, 
      { # Level 1 
       'levelSize': 8, 'bottomUpOut': 8, 
       'spatialPoolerAlgorithm': 'gaussian', 
       'sigma': 0.4, 'maxDistance': 0.05, 
       'symmetricTime': True, 'transitionMemory': 1, 
       'topNeighbors': 2, 'maxGroupSize': 1024, 
       'temporalPoolerAlgorithm': 'sumProp' 
      }, 
      { # Level 2 
       'levelSize': 4, 'bottomUpOut': 4, 
       'spatialPoolerAlgorithm': 'product', 
       'symmetricTime': True, 'transitionMemory': 1, 
       'topNeighbors': 2, 'maxGroupSize': 1024, 
       'temporalPoolerAlgorithm': 'sumProp' 
      }, 
      { # Level 3 
       'levelSize': 1, 
       'spatialPoolerAlgorithm': 'product', 
       'mapperAlgorithm': 'sumProp' 
      },],) 

    Data=WideDataInterface('Datos/__Categorias__.txt', 'Datos/Datos_Entrenamiento%d.txt', numDataFiles = 8)# 

    net.createNetwork(Data) 
    net.train(Datos) 

if __name__ == '__main__': 
    print "Creating HTM Net..." 
    TheNet()