2016-08-02 4 views
2

現在、ニューラルネットワーク機能のためにscikit learnパッケージを使用しようとしています。私はそれを解決するために複雑な問題がありますが、私はそれに慣れるためにいくつかの基本的なテストを試しています。私は何かをやろうとしましたが、意味のある結果を生み出していません。私のコード:ニューラルネットワーク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=",") 

私はそれが私を与えるデータをポストする方法を理解していないが、それは正しくに非常に近いマッピングされているように思わ0と100の間のすべての入力のための7000と10000の間で吐き出します範囲の先頭ですが、入力が0に近い場合は、7000付近に何かが返されます。

編集:これを追加するのを忘れました。ダミートレーニングをy = xに取り除くと、ネットワークは同じ動作をしますが、別の機能に近いトレーニングをしてネットワークを助けることができます。それは動作しませんでしたが、私はちょうどそのビットを外していなかった。

+0

入力データを正規化していますか?ウェイトをどのように初期化していますか? – tttthomasssss

+0

-100から100の範囲のこのネットワークへの入力は1つしかありません。私は-1から1に正規化し、最後に10,000を掛けてみてください。私は無作為に体重を初期化しようとしましたが、scikit-learnの組み込み機能を使用し、y = xを回帰するように訓練されたネットワークからの暖かいスタートを使用しました。 –

+0

私は入力を-1,1に正規化してみました。学習率を10倍に下げました。また、誤差が掛け算されるので、収束の許容差をはるかに低く設定しました。現在のネットワークは約60倍速くなっていますが、予想されるすべてのデータポイントはx^2の代わりにf(x)= 240x-17000にほぼ従うので、パフォーマンスは実際には向上していません。 –

答えて

2

私の推奨は、レイヤー当たりのニューロンの数を減らし、トレーニングデータセットのサイズを増やすことです。今では、あなたのネットワークでトレーニングするための多くのパラメータと、小さなトレーニングセット(〜10K)があります。しかし、私の答えの主なポイントは、おそらくあなたの最終的なアプリケーションのための素晴らしい選択ではないことです。

あなたは神経ネットワークで解決したい複雑な問題がありますか?

私はそれを解決するために複雑な問題がありますが、私はそれに慣れるためにいくつかの基本的なテストを試しています。

official user guideによると、ニューラルネットワークのsklearnの実装は、大規模なアプリケーションのために設計されておらず、深い学習のためにはるかに少ない柔軟other options以上です。

私がよく経験したPythonディープラーニングライブラリの1つは、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は、KerasをWindowsにインストールするのに役立ちます。

+0

賞金時間をかけて助けてくれた唯一の人ありがとう、私はこれを後で見ていきます。 –

関連する問題