2017-06-18 42 views
1

我使用Tensorflow 1.2停止,下面的代碼:TensorFlow/TFLearn LinearRegressor具有非常高的損耗

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一個完整的小白):

  1. 爲什麼步驟10的損失小於步驟47的損失?
  2. 爲什麼TF決定在之後停止訓練?
  3. 爲什麼「INFO:tensorflow:最後一步損失:19.3527」。並且步驟47中的損失彼此不匹配?

我已經使用vanilla TensorFlow實現了這個非常算法,它的工作方式和預期的一樣,但我真的無法從這裏得到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會給您更合理的結果(我建議將batch_size設置爲最多6,因爲在單個步驟中循環使用您的訓練樣本不止一次可能沒有多大意義)

  2. 爲什麼步驟10的損失小於步驟47的損失? 有幾個不同的原因,損失可能不會減少。 a。不計算每一步驟中完全相同數據的損失。例如,如果您的樣品尺寸爲100,批次尺寸爲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 = ...))