PyBrain-Python的人工神經網路
阿新 • • 發佈:2019-01-04
python有一個很好用的神經網路庫。雖然sklearn很強大,但是好像對神經網路的支援並不是那麼那好。
1.安裝
安裝很方便,專案是一個開源的,託管在github上。如果你用的也是Anconda平臺,那麼在Anconda Prompt的命令列中敲下
pip install git+https://github.com/pybrain/[email protected]
等一會兒就會裝好了。裝好了是這樣的:
然後就能在ide裡面import pybrain了。
2.建立神經網路的拓撲結構
有兩種方式,一種比較簡單,直接指明層的數目就可以了
這樣你就建立了一個輸入層為4個節點,隱藏層為10個節點,一個輸出節點的神經網路拓撲結構。net = buildNetwork(4, 10, 1)
當時,個人還是建議使用複雜一點的神經網路建立方法。
上面的程式碼,我們寫了一個函式,這個函式返回了fnn,也就是一個神經網路結構。在建立了fnn後,其實我們還做了一個工作,就是訓練。首先我們是設定了個訓練器traine,verbose=True這一條還是建議開啟的,這樣在訓練的過程中我們能夠看到當前訓練的情況。learningrate則是學習率。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
最後開啟訓練器,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
不過似乎官網乾貨並不多。