2016-08-02 107 views
2

我目前正在嘗試使用scikit學習軟件包來實現其神經網絡功能。我有一個複雜的問題需要解決,但開始時我只是嘗試幾個基本測試來熟悉它。我已經完成了一些工作,但沒有產生有意義的結果。我的代碼:Scikit中的神經網絡學習不產生有意義的結果

import sklearn.neural_network.multilayer_perceptron as nnet 
import numpy 
def generateTargetDataset(expression="%s", generateRange=(-100,100), s=1000): 
    expression = expression.replace("x", "%s")  
    x = numpy.random.rand(s,) 
    y = numpy.zeros((s,), dtype="float") 
    numpy.multiply(x, abs(generateRange[1]-generateRange[0]), x) 
    numpy.subtract(x, min(generateRange), x) 
    for z in range(0, numpy.size(x)): 
     y[z] = eval(expression % (x[z])) 
    x = x.reshape(-1, 1) 
    outTuple = (x, y) 
    return(outTuple) 
print("New Net + Training") 
QuadRegressor = nnet.MLPRegressor(hidden_layer_sizes=(10), warm_start=True, verbose=True, learning_rate_init=0.00001, max_iter=10000, algorithm="sgd", tol=0.000001) 
data = generateTargetDataset(expression="x**2", s=10000, generateRange=(-1,1)) 
QuadRegressor.fit(data[0], data[1]) 
print("Net Trained") 
xt = numpy.random.rand(10000, 1) 
yr = QuadRegressor.predict(xt) 
yr = yr.reshape(-1, 1) 
xt = xt.reshape(-1, 1) 
numpy.multiply(xt, 100, xt) 
numpy.multiply(yr, 10000, yr) 
numpy.around(yr, 2, out=yr) 
numpy.around(xt, 2, out=xt) 
out = numpy.concatenate((xt, yr), axis=1) 
numpy.set_printoptions(precision=4) 
numpy.savetxt(fname="C:\\SCRATCHDIR\\numpydump.csv", X=out, delimiter=",") 

我不知道如何發佈它給我的數據,但7000和10000之間吐出0和100這似乎與所有輸入正確映射非常接近頂部的範圍內,但對於接近0的輸入,它只是返回接近7000的東西。

編輯:我忘了補充一點。如果我將虛擬訓練移除到y = x,網絡具有相同的行爲,但是我在某處讀到,有時可以通過訓練它來獲得不同但更接近的功能,然後使用已加權的網絡作爲起點來幫助網絡。它沒有工作,但我還沒有采取那一點。

+0

您是否對輸入數據進行了標準化,並且如何初始化權重? – tttthomasssss

+0

這個網絡只有一個輸入,範圍從-100到100.我想我可以嘗試將它歸一化爲-1到1,然後在最後乘以10,000。我嘗試過使用scikit-learn中的內置函數隨機初始化權重,並且使用受訓網絡的熱啓動來回歸y = x。 –

+0

我只是試着將我的輸入標準化爲-1,1,並將我的學習率降低了10倍。我還設定了對收斂的容差要低得多,因爲錯誤現在倍增。網絡訓練速度現在提高了60倍,但實際上並沒有提高其性能,因爲所有預測的數據點大致都遵循方程f(x)= 240x-17000,而不是像他們應該的那樣x^2 –

回答

2

我的建議是減少每層神經元的數量,並增加訓練數據集的大小。現在,您需要在網絡中訓練很多參數,並且需要一個小型訓練集(〜10K)。然而,我的答案的主要觀點是sklearn可能不是您的最終應用程序的理想選擇。

所以你有一個複雜的問題,你想解決神經網絡?

我有一個複雜的問題來解決它,但開始我只是想嘗試幾個基本的測試來熟悉它自己。

按照official user guide,神經網絡的sklearn的實現是不適合大型應用程序,是一個很多比other options深學習不夠靈活。

一個Python深度學習庫我有過很好的體驗,它是一個模塊化的,易於使用的GPU庫支持的keras

下面是我編碼的一個樣本,訓練單個感知器進行二次迴歸。

from keras.models import Sequential 
from keras.layers.core import Dense, Activation 
from keras.optimizers import SGD 
import numpy as np 
import matplotlib.pyplot as plt 

model = Sequential() 
model.add(Dense(1, init = 'uniform', input_dim=1)) 
model.add(Activation('sigmoid')) 


model.compile(optimizer = SGD(lr=0.02, decay=1e-6, momentum=0.9, nesterov=True), loss = 'mse') 

data = np.random.random(1000) 
labels = data**2 

model.fit(data.reshape((len(data),1)), labels, nb_epoch = 1000, batch_size = 128, verbose = 1) 

tdata = np.sort(np.random.random(100)) 
tlabels = tdata**2 

preds = model.predict(tdata.reshape((len(tdata), 1))) 

plt.plot(tdata, tlabels) 
plt.scatter(tdata, preds) 
plt.show() 

這會輸出測試數據點的散點圖以及真實曲線的圖形。 Keras Quad regression fit

正如你所看到的,結果是合理的。一般來說,神經網絡很難訓練,在得到這個例子之前我必須做一些參數調整。

它看起來像你使用的是Windows。 This question可能有助於在Windows上安裝Keras。

+0

因爲唯一一個花時間幫忙的人。謝謝,我會在稍後看看。 –