2017-06-01 23 views
1

私はケラス連続モデルを構築するためのpythonスクリプトを持っています。たびに私はスクリプトの変更なしで別の結果を得ています。親切にスクリプトを見てください。私が間違っているところで助けてください。初めての実行で順次モデル毎回異なる結果を返す

thedata = pandas.read_csv("C:/User/Downloads/LSTM/data.csv", sep=', ', delimiter=',', header='infer', names=None) 

np.random.seed(1337) 

x = thedata['Review'] 
y = thedata['Polarity_Numeral'] 
x = x.iloc[:].values 
y = y.iloc[:].values 

tk = Tokenizer(num_words=40000, lower=True, split=" ") 
tk.fit_on_texts(x) 
x = tk.texts_to_sequences(x)  
max_len = 120 
x = pad_sequences(x, maxlen=max_len) 
max_features = 40000 
testx = x[51000:52588] 
print (testx) 
testy = y[51000:52588] 
x = x[0:50999] 
y = y[0:50999] 


model = Sequential() 
model.add(Embedding(max_features, 128, input_length=max_len)) 
model.add(SpatialDropout1D(0.3)) 
model.add(GaussianNoise(0.2)) 
model.add(LSTM(128 , dropout_W=0.3, dropout_U=0.3, return_sequences=False)) 
model.add(Dense(1, W_regularizer=l2(0.2))) 
model.add(Activation('sigmoid')) 
model.summary() 
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.00) 
model.compile(loss='binary_crossentropy', optimizer=adam,metrics = ['accuracy']) 
model_history = model.fit(x, y=y, batch_size=64, epochs=1, verbose=1,validation_split = 0.2) 
model.save('C:/User/Downloads/model.h5') 
model.save_weights('C:/User/Downloads/weight_model.h5') 

predictions = model.predict(testx) 
print (predictions) 

、私は2番目の時間の走行では57% すなわち取得しています。.. 53% それがランダムに変化している第三... 55% 毎回オン。 助けてくれてありがとう!

+0

テンソルフローバックエンドを使用していますか?この問題(https://github.com/fchollet/keras/issues/2280)に関連する可能性があります。 – sietschie

+0

'tk.fit_on_texts(x)'について、それは何らかのトレーニングですか?その場合は、xとyも保存して、新しいモデルと読み込まれたモデルの両方で正確に同じであることを確認する必要があります。 –

+0

ええ、テキストの前処理です。私は何が起こっているのかを正確に理解することができません。訓練とテスト側で同じデータが設定されていますが、同じモデルがロードされていますが、その精度はまだ異なります。 – user

答えて

0

クイックルックが表示されていません。 モデルをコンパイルすると、ケラスはモデル内のすべてのウェイトをランダムに初期化します(これを行う方法も指定できます、またはランダムにしたくない場合は、デフォルトは通常です)。コンパイルするたびに異なる重みと異なる結果が得られます...十分なエポックを与えれば、すべて同じ結果に収束するはずです。

+0

お返事ありがとうございます、私はそれがランダムであることを望んでいません。私の値をどのように指定できますか?結果を修正する方法。私はエポック-1を与えた理由をチェックしていただけで、実行に時間がかかりすぎませんでした。いったん修正されると、十分なエポックを与えます。 – user

+1

各レイヤーに必要な初期化を指定することができます。ドキュメント: https://keras.io/initializers/ これを1または0、または恒等行列にすることができます。 )あなたがしたい場合..バイアスを定数に設定し、ランダムではないことを確認してください。 しかし、私は本当にあなたがそれをしたいと思うか分からない...初期のランダム性は問題なく、最良の方法で収束するだろう。すべてのウェイトを同じ定数に設定すると、収束を妨げる可能性があります。 –

+0

私はhttps://keras.io/initializers/を見ることに感謝します。訓練されたモデルをディレクトリに保存し、そのモデルを別のスクリプトにロードして再度テストする必要があるため、一定の結果が必要です。それは同じ結果をもたらすはずです。これは単に時間を節約するためです。 – user

1

「正確に」コードを実行している場合は、という新しいモデルが完全に作成されていることにご注意ください。

モデルを読み込んでいません。モデルに独自の重みを追加するわけではありません。 まったく新しいランダムな重み付けのセットを使って、単に新しいモデルを作成するだけです。

はい、異なる結果が表示されます。何も悪いことはありません。


あなたはおそらくあなたが同じモデルが保持されるようにしたい場合は、「ロード保存したモデル」(おそらくmodel.load_weights())のいくつかの種類を使用する必要があります。

(ケースでは、モデルはどこかに保存されている)それともべき「set_weights()」いくつかの点でモデルを作成した後、(あなたが望むものの重みを知っていれば、あるいは、あなたの重みを持っている場合は保存されます)または、既知のウェイトを持つ新しいモデルが必要な場合は、各レイヤーのイニシャライザを使用することができます(別の回答に記載されているように)。

+0

正確に実行してください(C:/User/Downloads/model.h5)とmodel.load_weights( 'C:/User/Downloads/model.h5')を使用して訓練されたモデルをロードする別のスクリプトを作成しました。 /User/Downloads/weight_model.h5 ')、次にmodel.predict(testx)を実行します。私は66.6246%のテスト精度を得た。 – user

関連する問題