我目前正在嘗試使用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,網絡具有相同的行爲,但是我在某處讀到,有時可以通過訓練它來獲得不同但更接近的功能,然後使用已加權的網絡作爲起點來幫助網絡。它沒有工作,但我還沒有采取那一點。
您是否對輸入數據進行了標準化,並且如何初始化權重? – tttthomasssss
這個網絡只有一個輸入,範圍從-100到100.我想我可以嘗試將它歸一化爲-1到1,然後在最後乘以10,000。我嘗試過使用scikit-learn中的內置函數隨機初始化權重,並且使用受訓網絡的熱啓動來回歸y = x。 –
我只是試着將我的輸入標準化爲-1,1,並將我的學習率降低了10倍。我還設定了對收斂的容差要低得多,因爲錯誤現在倍增。網絡訓練速度現在提高了60倍,但實際上並沒有提高其性能,因爲所有預測的數據點大致都遵循方程f(x)= 240x-17000,而不是像他們應該的那樣x^2 –