現在、ニューラルネットワーク機能のために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に取り除くと、ネットワークは同じ動作をしますが、別の機能に近いトレーニングをしてネットワークを助けることができます。それは動作しませんでしたが、私はちょうどそのビットを外していなかった。
入力データを正規化していますか?ウェイトをどのように初期化していますか? – tttthomasssss
-100から100の範囲のこのネットワークへの入力は1つしかありません。私は-1から1に正規化し、最後に10,000を掛けてみてください。私は無作為に体重を初期化しようとしましたが、scikit-learnの組み込み機能を使用し、y = xを回帰するように訓練されたネットワークからの暖かいスタートを使用しました。 –
私は入力を-1,1に正規化してみました。学習率を10倍に下げました。また、誤差が掛け算されるので、収束の許容差をはるかに低く設定しました。現在のネットワークは約60倍速くなっていますが、予想されるすべてのデータポイントはx^2の代わりにf(x)= 240x-17000にほぼ従うので、パフォーマンスは実際には向上していません。 –