2017-07-29 16 views
0

調査の必要性から、私はtf.Metrics.mean_squared_errorの精度をチェックしたいと思います。驚いたことに、彼らは非常に異なっています。私は説明を求める。ここでは私の実験の簡単な説明とサンプルコードを示します。の精度tf.metrics.mean_squared_error

1)トレーニングデータ全体をtf.Metrics.mean_squared_errorで評価します。 2)すべての同じ訓練データのすべての "Xs"(または画像)を与えられた予測を最初に収集し、次にすべての地上の真理(またはその両方)で平均自乗誤差を計算することによって、ステップ1の直後に再び評価する。ラベル)との間の関係を示す。

(1)浮動小数点精度の損失が蓄積され、(2)tf.Metrics.mean_square_errorは、その実装で見かけ上移動平均を適用して不正確さをもたらします。

どのようなrelaventのアイデアも大変ありがとうございます。ありがとう!


import tensorflow as tf 
from numpy import genfromtxt 

tf.logging.set_verbosity(tf.logging.INFO) 
# (hyper)parameters 
batch_size = 200 
num_epochs = 1000 
steps = 1000 
# prepare data 
with tf.Session() as sess: 
    training_x = sess.run(tf.random_normal([2048, 16], mean=-1, stddev=4, dtype=tf.float64)) 
    training_y = norm = sess.run(tf.random_normal([2048, 1], mean=-1, stddev=4, dtype=tf.float64)) 
# input function 
_input_fn = lambda _input_path: genfromtxt(_input_path, delimiter=',') 
input_training = tf.contrib.learn.io.numpy_input_fn({"input": training_x}, training_y, 
               batch_size=batch_size, num_epochs=num_epochs) 
input_evaluate_train_data = tf.contrib.learn.io.numpy_input_fn({"input": training_x}, training_y) 

# remember to give the same column name as used in _input_fn 
features = [tf.contrib.layers.real_valued_column('input', dimension=16)] 
regressor = tf.contrib.learn.DNNRegressor(feature_columns=features, 
              hidden_units=[32, 8], 
              dropout=0.1, 
              model_dir="testDNNR/result", 
              optimizer=tf.train.AdamOptimizer(learning_rate=0.008), 
              activation_fn=tf.nn.elu) 

# training 
regressor.fit(input_fn=input_training, steps=steps) 
# testing with training data 
eval_metric_ops = { 
    "mse": lambda targets, predictions: tf.metrics.mean_squared_error(tf.cast(targets, tf.float64), predictions) 
} 
ev = regressor.evaluate(input_fn=input_evaluate_train_data, steps=1, metrics=eval_metric_ops) 
pred = regressor.predict(input_fn=input_evaluate_train_data, as_iterable=False) 
# using my MSE 
mse = ((training_y - pred) ** 2).mean() 

print ("evaluation result given training data using my MSE: " + str(mse)) 
print ("evaluation result given training data using the library built-in MSE: " + str(ev)) 

答えて

0

不一致がどのようにtf.contrib.learn.io.numpy_input_fn作品から来ています。いくつかのラッピングの後、この関数は次のように実装されますhttps://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/python/estimator/inputs/numpy_io.py#L45

デフォルトでは、呼び出されるたびに128個のバッチのバッチが返されます。 regressor.evaluateへの呼び出しでそれを使用すると、regressor.predictで使用した場合とは異なる128の値が得られます。

他にも関連する問題があります。上にリンクされた実装はshuffle=Trueです。つまり、データからランダムな128要素を選ぶことを意味します。あなたがtraining_y - predを行う際

また

は、サイズが非常に異なっており、テンソルは、あなたが期待するものよりも多くの面で結果放送を取得します。