損失関数が平均二乗誤差の場合、精度はどのように定義されますか? 平均絶対誤差 ?
私が使用するモデルは、出力アクティベーションが線形で、loss= mean_squared_error
でコンパイルされています
model.add(Dense(1))
model.add(Activation('linear')) # number
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
出力は次のようになります。
Epoch 99/100
1000/1000 [==============================] - 687s 687ms/step - loss: 0.0463 - acc: 0.9689 - val_loss: 3.7303 - val_acc: 0.3250
Epoch 100/100
1000/1000 [==============================] - 688s 688ms/step - loss: 0.0424 - acc: 0.9740 - val_loss: 3.4221 - val_acc: 0.3701
だから何をしますかval_acc:0.3250平均? Mean_squared_errorはパーセンテージではなくスカラーでなければなりません-すべきではありませんか? val_acc-平均二乗誤差、平均パーセント誤差、または別の関数ですか?
ウィキペディアのMSEの定義から: https://en.wikipedia.org/wiki/Mean_squared_error
MSEは推定器の品質の尺度であり、常に負ではなく、ゼロに近い値ほど優れています。
val_acc: 0.0
の値がval_acc: 0.325
よりも優れているということですか?
編集:私が訓練するときの精度測定基準の出力のより多くの例-私が訓練するほど精度が向上します。損失関数-mseは減少するはずです。 mseの精度は明確に定義されていますか?また、Kerasではどのように定義されていますか?
lAllocator: After 14014 get requests, put_count=14032 evicted_count=1000 eviction_rate=0.0712657 and unsatisfied allocation rate=0.071714
1000/1000 [==============================] - 453s 453ms/step - loss: 17.4875 - acc: 0.1443 - val_loss: 98.0973 - val_acc: 0.0333
Epoch 2/100
1000/1000 [==============================] - 443s 443ms/step - loss: 6.6793 - acc: 0.1973 - val_loss: 11.9101 - val_acc: 0.1500
Epoch 3/100
1000/1000 [==============================] - 444s 444ms/step - loss: 6.3867 - acc: 0.1980 - val_loss: 6.8647 - val_acc: 0.1667
Epoch 4/100
1000/1000 [==============================] - 445s 445ms/step - loss: 5.4062 - acc: 0.2255 - val_loss: 5.6029 - val_acc: 0.1600
Epoch 5/100
783/1000 [======================>.......] - ETA: 1:36 - loss: 5.0148 - acc: 0.2306
質問には少なくとも2つの問題があります。
マティアスのコメントともう1つの答えから、最初の1つは明確になっているはずです。精度はnotのような回帰問題では意味があります。 このKeras thread のpatyorkによるコメントも参照してください。良いことも悪いことも、Kerasはあなたや他のユーザーがコードに意味のないリクエストを入れないように「保護」しないということです。回帰設定の精度を要求するなど、意味がありません。
それを明確にした他の問題は次のとおりです。
Kerasは実際に回帰設定でも「精度」を返すので、それは正確に何であり、どのように計算されますか?
ここでいくつかの光を当てるために、パブリックデータセット(データに関する詳細を提供しないため)に戻りましょう。つまり、 ボストン住宅価格データセット (housing.csv
としてローカルに保存されます)次のように簡単な実験を実行します。
import numpy as np
import pandas
import keras
from keras.models import Sequential
from keras.layers import Dense
# load dataset
dataframe = pandas.read_csv("housing.csv", delim_whitespace=True, header=None)
dataset = dataframe.values
# split into input (X) and output (Y) variables
X = dataset[:,0:13]
Y = dataset[:,13]
model = Sequential()
model.add(Dense(13, input_dim=13, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
# Compile model asking for accuracy, too:
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y,
batch_size=5,
epochs=100,
verbose=1)
あなたの場合のように、モデルのフィッティング履歴(ここには示されていません)は、損失の減少と精度の大まかな増加を示しています。適切なKeras組み込み関数を使用して、同じトレーニングセットでモデルのパフォーマンスを評価してみましょう。
score = model.evaluate(X, Y, verbose=0)
score
# [16.863721372581754, 0.013833992168483997]
score
配列の正確な内容は、モデルのコンパイル中に正確に何を要求したかによって異なります。ここでは、最初の要素は損失(MSE)で、2番目の要素は「精度」です。
この時点で、 binary_accuracy
file 内のKeras metrics.py
の定義を見てみましょう。
def binary_accuracy(y_true, y_pred):
return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
したがって、Kerasは予測y_pred
を生成した後、最初にそれらを丸めてから、平均を取得する前に、それらの数が真のラベルy_true
と等しいかどうかを確認します。
単純なPython&Numpyコードを使用してこの操作を複製してみましょう。真のラベルはY
です:
y_pred = model.predict(X)
l = len(Y)
acc = sum([np.round(y_pred[i])==Y[i] for i in range(l)])/l
acc
# array([0.01383399])
さて、ビンゴ!これは、実際には上記のscore[1]
によって返される値と同じです...
簡単に言うと、モデルのコンパイルでmetrics=['accuracy']
を(誤って)要求するので、Kerasは を満たすために最善を尽くします/ 上記のように、これは設定ではまったく意味がありません。
Kerasがボンネットの下で、ユーザーにヒントや警告を与えることなく、かなり無意味な操作を実行する設定がかなりあります。私が偶然遭遇したそれらのうちの2つは次のとおりです。
マルチクラス設定でloss='binary_crossentropy'
の代わりにcategorical_crossentropy
をmetrics=['accuracy']
でリクエストすると、意味のない結果が得られます- Keras binary_crossentropy vs categorical_crossentropy performance? および Kerasのマルチクラス分類でbinary_crossentropyがcategorical_crossentropyより正確なのはなぜですか?
ドロップアウトを完全に無効にする(極端な場合、ドロップアウトレート1.0を要求する場合)- ドロップアウトの動作で、rate = 1(すべての入力ユニットをドロップする)が期待どおりではない
損失関数(この場合は平均二乗誤差)は、予測が目標値からどれだけ離れているかを示すために使用されます。トレーニング段階では、この量に基づいて重みが更新されます。分類の問題を扱う場合、精度と呼ばれる追加のメトリックを定義することは非常に一般的です。正しいクラスが予測されたケースの数を監視します。これはパーセント値として表されます。したがって、値0.0は正しい決定が行われないことを意味し、1.0は正しい決定のみを意味します。ネットワークのトレーニング中、損失は減少し、通常は精度が向上します。
損失とは対照的に、ネットワークのパラメーターを更新するために精度は通常使用されないことに注意してください。学習の進捗状況とネットワークの現在のパフォーマンスを監視するのに役立ちます。
@ desertnautは非常に明確に言っています
次の2つのコードを検討してください
def binary_accuracy(y_true, y_pred):
return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
ラベルは整数である必要があります。kerasは丸めないy_trueであり、高い精度が得られます。