2017-06-18 3 views
1

で停止し、ここでのコードは次のとおりです。TensorFlow/TFLearn LinearRegressor私はTensorflow 1.2を使用しています非常に高い損失

import tensorflow as tf 
import tensorflow.contrib.layers as layers 
import numpy as np 
import tensorflow.contrib.learn as tflearn 

tf.logging.set_verbosity(tf.logging.INFO) 

# Naturally this is a very simple straight line 
# of y = -x + 10 
train_x = np.asarray([0., 1., 2., 3., 4., 5.]) 
train_y = np.asarray([10., 9., 8., 7., 6., 5.]) 

test_x = np.asarray([10., 11., 12.]) 
test_y = np.asarray([0., -1., -2.]) 

input_fn_train = tflearn.io.numpy_input_fn({"x": train_x}, train_y, num_epochs=1000) 
input_fn_test = tflearn.io.numpy_input_fn({"x": test_x}, test_y, num_epochs=1000) 

validation_monitor = tflearn.monitors.ValidationMonitor(
    input_fn=input_fn_test, 
    every_n_steps=10) 

fts = [layers.real_valued_column('x')] 

estimator = tflearn.LinearRegressor(feature_columns=fts) 
estimator.fit(input_fn=input_fn_train, 
       steps=1000, 
       monitors=[validation_monitor]) 

print(estimator.evaluate(input_fn=input_fn_test)) 

期待どおりに動作します。何が起こっていることは、トレーニングが非常に高い損失値とステップ47で停止していることである:私は完全に理解していない

INFO:tensorflow:Starting evaluation at 2017-06-18-20:52:10 
INFO:tensorflow:Finished evaluation at 2017-06-18-20:52:10 
INFO:tensorflow:Saving dict for global step 1: global_step = 1, loss = 12.5318 
INFO:tensorflow:Validation (step 10): global_step = 1, loss = 12.5318 
INFO:tensorflow:Saving checkpoints for 47 into  
INFO:tensorflow:Loss for final step: 19.3527. 
INFO:tensorflow:Starting evaluation at 2017-06-18-20:52:11 
INFO:tensorflow:Restoring parameters from 
INFO:tensorflow:Finished evaluation at 2017-06-18-20:52:11 
INFO:tensorflow:Saving dict for global step 47: global_step = 47, loss = 271.831 

{'global_step': 47, 'loss': 271.83133} 

いくつか(確かに私はTFで完全にnoobのだ):

  1. なぜステップ10の損失はステップ47の損失よりも小さいのですか?
  2. なぜTFは後でトレーニングを停止することにしたのですか?
  3. 「INFO:テンソルフロー:最終ステップの損失:19.3527」ステップ47での損失が互いに一致しない場合は、

私はバニラTensorFlowを使用して、この非常にアルゴリズムをimlementedしており、期待どおりに動作しますが、私は本当にLinearRegressorがここに私から何を望んでいるかの把握を取得することはできません。

答えて

2

ここにあなたの質問に対する答えの一部が示されています。すべての質問に対処することはできませんが、うまくいけば、より多くの洞察を与えるでしょう。

  1. なぜTFがトレーニングをやめたらいいですか? これは、num_epochs = 1000を設定し、numpy_input_fnのデフォルトのbatch_sizeを128に設定していることと関連しています(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/learn/python/learn/learn_io/numpy_io.py参照)。 num_epochs = 1000は、フィットメソッドが多くても1000回(または1000ステップのうち、どちらか早いほうが起きる)データを通過することを意味します。そのため、天井(1000 * 6/128)= 47ステップでフィットが実行されます。 batch_sizeを6(トレーニングデータセットのサイズ)に設定するかnum_epochs = Noneに設定するとより合理的な結果が得られます(トレーニングサンプルを1ステップで複数回使用することはあまり意味がないため、batch_sizeを最大6に設定することをお勧めします)

  2. なぜステップ10の損失がステップ47の損失よりも小さいのですか? 損失が減少しない理由はいくつかあります。 a。各ステップで全く同じデータの損失を計算しません。たとえば、サンプルのサイズが100で、batch_sizeが32の場合、次のバッチのサイズ32で損失を計算します(これは周期的に続きます)。 b。あなたの学習率は高すぎますので、損失は跳ねます。これを修正するには、学習率を下げるか、さまざまなオプティマイザで試してみてください。私はデフォルトで、LinearRegressorで使用されるオプティマイザはFtrlOptimizerだと考えています。

    推定= tflearn.LinearRegressor( feature_columnsの=のFTS、 オプティマイザ= tf.train.FtrlOptimizer(learning_rate = ...))

    :あなたはLinearRegressorを構築するときには、次のコマンドを使用して、デフォルト学習率を変更することができます

    また、別のオプティマイザを試すこともできます。 推定= tflearn.LinearRegressor( feature_columnsの=のFTS、 オプティマイザ= tf.train.GradientDescentOptimizer(learning_rate = ...))

関連する問題