2017-05-27 10 views
1

を期待できない)model.compileの損失= 'mean_squared_error'()を持つ:Keras model.fitから検証損失()(model.fitを使用して自分のネットワークを訓練に

model.compile(loss='mean_squared_error', optimizer=optimizers.Adam(decay=0.00001), metrics=['accuracy']) 
hist=model.fit(X, Y, epochs=200, batch_size=2000, verbose=2, shuffle="batch", validation_data=(Xval,Yval)) 

私がこれを取得終了:

エポック200/200 23S - ロス:1.2060 - ACC:0.5168 - val_loss:1.5213 - val_acc:私は手動で検証上の損失をチェックすると今0.5294

pre=model.predict(Xval) 
print(np.mean(np.square(pre-Yval))) 

私は1.4587で1.5213ではありません。

なぜ異なるのですか? model.fit()で計算した1.5213が得られないのはなぜですか?私はここに何かを逃していますかmodel.fit()は検証セット全体を調べませんか?

+0

実際には、損失の価値は低いですが、なぜそれに満足していませんか? – DarkCygnus

+0

それは本当です。しかし、 'model.fit()'によって報告されたval_lossは、私が手動で計算した損失と一致するべきではありませんか? – samjk

+0

あなたが選択した損失の指標でケラスが計算したのと同じ方法を計算していないかもしれません – DarkCygnus

答えて

0

それには二つの理由が考えられます:ネットワークの出力

  1. mseが出力され、ターゲット出力はスケーラーしていることを前提としながら、ベクトルです。それでもベクトルでは機能しますが、値は信頼できません。
  2. トレーニング中にbatch_sizeを2000として使用しましたが、予測中はbatch_sizeが1です。model.predict(Xval,batch_size=256)を試してみてください。これは、2つの条件が同じであることを確認します。
+0

'model.predict()'のbatch_sizesを変更しようとしました。 valの損失はまだ同じです。 – samjk

+0

最初のオプションも試しましたか? –

0

この状況を分析した後、私はあなたがなぜこれを体験できるのか知っていると思います。あなたのエポック200に乗る出力から判断すると、私たちはその瞬間であなたのモデルメトリクスことが確認できた。

損失: 1.2060 - ACC: 0.5168 - val_loss: 1.5213 - val_acc: 0.5294

これは、その最後のエポックに、あなたが訓練しているフィードフォワードモデルは1.2060の損失(および検証1を得たことを意味1.5213)。

しかし、トレーニングアルゴリズムは、モデルウェイトを更新するために、その最終損失をバックプロパゲーションする必要があります。入力がの間で繰り返された後にのみ、メトリックを計算し、最後にのバックプロパゲーションの重みを計算すると、エポックは「終了」とみなされます。追加のエポックについても同じプロセスが続きます。

最後の逆伝播でモデルが更新された後にモデルが少し変更されたため、最後のエポック後に評価したときに異なる損失が発生するのは、学習より前のステップのビット数です。これは、あなたのモデルが成功した訓練のエポックをもう1回持っていたので、なぜエポック200の後に損失の値が低くなったのかを説明します。

関連する問題