:これらはmodel.compile()
声明ているあなたはloss='binary_crossentropy'
を使用するときに報告した(高い)精度は、あなたのように、正しいものではありませんすでに推測している。問題の場合、推奨される損失はcategorical_crossentropy
です。
ロングで
:
あなたのこの動作の根本的な理由は、あなたが選択した損失関数に応じて、使用する精度方法Keras実際推測ではなく、微妙な&文書化されていない問題ですモデルのコンパイルにはそのままmetrics=['accuracy']
を含めます。言い換えれば、あなたの最初のコンパイルオプション
model.compile(loss='categorical_crossentropy',
optimizer=keras.optimizers.Adam(),
metrics=['accuracy']
は、2番目の1有効な間:
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(),
metrics=['accuracy'])
は、あなたが期待するものを生成しませんが、その理由は、バイナリのクロスエントロピーを使用することではありません(少なくとも原則的には、絶対的に有効な損失関数である)。
なぜですか? metrics source codeを確認した場合、Kerasでは精度メトリックは1つではなく、複数の異なるメトリックを定義しています(binary_accuracy
とcategorical_accuracy
)。 under the hoodはloss='binary_crossentropy'
を選択し、の具体的なメトリックを指定していないため、Keras(間違って...)はbinary_accuracy
に興味があると推測しています。 に興味があります。
はのは、以下の変更で、Kerasで
MNIST CNN exampleを使用して、これが事実であることを確認してみましょう:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # WRONG way
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=2, # only 2 epochs, for demonstration purposes
verbose=1,
validation_data=(x_test, y_test))
# Keras reported accuracy:
score = model.evaluate(x_test, y_test, verbose=0)
score[1]
# 0.9975801164627075
# Actual accuracy calculated manually:
import numpy as np
y_pred = model.predict(x_test)
acc = sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000
acc
# 0.98780000000000001
score[1]==acc
# False
おそらく、独自のデータと上記の動作の検証が簡単です。
そして、何らかの理由で、あなたの損失関数としてバイナリクロスエントロピーを使うことを主張しているならば(私が言ったように、少なくとも原理的にはこれは間違っていませんでした)、
from keras.metrics import categorical_accuracy
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[categorical_accuracy])
MNISTの例では、トレーニングの後、スコアリング、そして私は上記を示してテストセットを予測:当面の問題で必要とされる精度カテゴリ次のように、あなたがモデルのコンパイルにcategorical_accuracy
に対して明示的に依頼する必要があります次の2つの指標は同じになります。
# Keras reported accuracy:
score = model.evaluate(x_test, y_test, verbose=0)
score[1]
# 0.98580000000000001
# Actual accuracy calculated manually:
y_pred = model.predict(x_test)
acc = sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000
acc
# 0.98580000000000001
score[1]==acc
# True
システム設定:
Python version 3.5.3
Tensorflow version 1.2.1
Keras version 2.0.4
あなたの正確な 'model.compile()この記事をレビュー誰のために加え、申し訳ありません – desertnaut
で'コマンド含めてください:これは*の符号化であるが*問題持ちますKerasと関係があり、stats/ML理論や実践に関係するものではありません。したがって、その場所はここにあり、クロスバリデーションではありません。 – Tutanchamunon
@desertnaut各ケース – desertnaut