1. 程式人生 > >PyBrain-Python的人工神經網路

PyBrain-Python的人工神經網路

python有一個很好用的神經網路庫。雖然sklearn很強大,但是好像對神經網路的支援並不是那麼那好。

1.安裝

安裝很方便,專案是一個開源的,託管在github上。如果你用的也是Anconda平臺,那麼在Anconda Prompt的命令列中敲下

pip install git+https://github.com/pybrain/[email protected]

等一會兒就會裝好了。裝好了是這樣的:

然後就能在ide裡面import pybrain了。

2.建立神經網路的拓撲結構

有兩種方式,一種比較簡單,直接指明層的數目就可以了

net = buildNetwork(4, 10, 1)
這樣你就建立了一個輸入層為4個節點,隱藏層為10個節點,一個輸出節點的神經網路拓撲結構。

當時,個人還是建議使用複雜一點的神經網路建立方法。

def netBuild(ds):
#    net = buildNetwork(4, 10, 1)

    # 建立神經網路fnn
    fnn = FeedForwardNetwork()

# 設立三層,一層輸入層(3個神經元,別名為inLayer),一層隱藏層,一層輸出層
    inLayer = LinearLayer(4, name='inLayer')
    hiddenLayer = SigmoidLayer(13, name='hiddenLayer0')
    outLayer = LinearLayer(1, name='outLayer')

# 將三層都加入神經網路(即加入神經元)
    fnn.addInputModule(inLayer)
    fnn.addModule(hiddenLayer)
    fnn.addOutputModule(outLayer)

# 建立三層之間的連線
    in_to_hidden = FullConnection(inLayer, hiddenLayer)
    hidden_to_out = FullConnection(hiddenLayer, outLayer)

# 將連線加入神經網路
    fnn.addConnection(in_to_hidden)
    fnn.addConnection(hidden_to_out)

# 讓神經網路可用
    fnn.sortModules()
    
    print "Trainging"
    trainer = BackpropTrainer(net, ds,verbose = True, learningrate=0.01)
    #trainer.train()
    trainer.trainUntilConvergence(maxEpochs=100)
    print "Finish training"
    return fnn
上面的程式碼,我們寫了一個函式,這個函式返回了fnn,也就是一個神經網路結構。在建立了fnn後,其實我們還做了一個工作,就是訓練。首先我們是設定了個訓練器traine,verbose=True這一條還是建議開啟的,這樣在訓練的過程中我們能夠看到當前訓練的情況。learningrate則是學習率。

最後開啟訓練器,trainer.trainUntilConergence這個函式可以設定最大的訓練次數。

這時候有同學就要問了,怎麼沒提到資料。訓練的樣本資料是這個函式的引數。

3.訓練樣本def readData(path):

def readData(path):
    reader = csv.reader(file(path, 'rb'))
    data = []
    for line in reader:
        data.append((float(line[1]),float(line[2]),float(line[3]),float(line[4]),float(line[0])))
    return data
我們的神經網路四個輸入一個輸出的,所以對於學習樣本就應該有五個記錄。在我的資料中,有五個記錄,也就是五列資料。第一列是結果,後面四列是輸入。

這個函式,傳入的引數path就是檔案的路徑。這裡,檔案的讀取我們用了一點點tip。首先是

    reader = csv.reader(file(path, 'rb'))
這裡,file(path,‘rb’)返回的是一個檔案控制代碼,外面用csv流做一個包裝,然後就可以很方便的讀取了,原始檔的每一行都變成了一個list,list中的元素就是被“,”分開的元素。
def dsBuild(data):
    ds = SupervisedDataSet(4, 1)
    for ele in data:
        ds.addSample((ele[0],ele[1],ele[2],ele[3]), (ele[4]))
    dsTrain,dsTest = ds.splitWithProportion(0.8)
    return dsTrain,dsTest
有了這樣的資料也不能直接放到神經網路裡面去訓練。PyBrain有自己的訓練資料結構,當然,說白了就是ndarray。
ds = SupervisedDataSet(4, 1)
這裡定義了一個SupervisedData的資料結構,四個輸入,一個輸出。這個資料結構還有一個方法,能夠給使用者隨機按比例切割整個資料集,這個方法就是
splitWithProportion()

傳入的引數是分割資料集的比例。如0.8則表示2/8分割。

4.使用神經網路

dsTrain,dsTest = dsBuild(readData(path))
netModel = netBuild(dsTrain)
dsTest = dsTrain
#pred=[]
for i in range(0,len(dsTest['input'])):
    error = dsTest['target'][i]-netModel.activate((dsTest['input'][i][0],dsTest['input'][i][1],dsTest['input'][i][2],dsTest['input'][i][3]))
    print error

最後把上面的函式用起來就可以了。模型訓練完之後,只要用activate方法,傳入輸入的量,就可以得到結果。

5.更多的內容,可以去官網看哦。

http://www.pybrain.org/docs/index.html

不過似乎官網乾貨並不多。