2017-05-25 94 views
0

我已經生成了一些CSV輸入數據,其中'超棒'是'age * 10'。它看起來像這樣:如何訓練張量流中的線性模型?

age, awesomeness 
67, 670 
38, 380 
32, 320 
69, 690 
40, 400 

它應該是微不足道的寫tensorflow模型,可以預測由「時代」「迷死人」,但我不能使它發揮作用。

當我運行培訓,輸出我得到的是:

accuracy: 0.0 <----------------------------------- What!?? 
accuracy/baseline_label_mean: 443.8 
accuracy/threshold_0.500000_mean: 0.0 
auc: 0.0 
global_step: 6000 
labels/actual_label_mean: 443.8 
labels/prediction_mean: 1.0 
loss: -2.88475e+09 
precision/positive_threshold_0.500000_mean: 1.0 
recall/positive_threshold_0.500000_mean: 1.0 

請注意,這顯然是一個完全人爲的例子,但那是因爲我得到了相同的結果具有更復雜的意義的模型一個更大的數據集;準確度爲0%。

這是我嘗試在最小的可能的可重複測試案例,我可以使其展現相同的行爲。

下面是我在做什麼的基礎上,從tflearn的DNNClassifier普查例如:

COLUMNS = ["age", "awesomeness"] 
CONTINUOUS_COLUMNS = ["age"] 
OUTPUT_COLUMN = "awesomeness" 

def build_estimator(model_dir): 
    """Build an estimator.""" 
    age = tf.contrib.layers.real_valued_column("age") 
    deep_columns = [age] 

    m = tf.contrib.learn.DNNClassifier(model_dir=model_dir, 
            feature_columns=deep_columns, 
            hidden_units=[50, 10]) 
    return m 

def input_fn(df): 
    """Input builder function.""" 
    feature_cols = {k: tf.constant(df[k].values, shape=[df[k].size, 1]) for k in CONTINUOUS_COLUMNS} 
    output = tf.constant(df[OUTPUT_COLUMN].values, shape=[df[OUTPUT_COLUMN].size, 1]) 
    return feature_cols, output 

def train_and_eval(model_dir, train_steps): 
    """Train and evaluate the model.""" 
    train_file_name, test_file_name = training_data() 
    df_train = pd.read_csv(...) # ommitted for clarity 
    df_test = pd.read_csv(...) 

    m = build_estimator(model_dir) 
    m.fit(input_fn=lambda: input_fn(df_train), steps=train_steps) 

    results = m.evaluate(input_fn=lambda: input_fn(df_test), steps=1) 
    for key in sorted(results): 
    print("%s: %s" % (key, results[key])) 

def training_data(): 
    """Return path to the training and test data""" 
    training_datafile = path.join(path.dirname(__file__), 'data', 'data.training') 
    test_datafile = path.join(path.dirname(__file__), 'data', 'data.test') 
    return training_datafile, test_datafile 

model_folder = 'scripts/model' # Where to store the model 
train_steps = 2000 # How many iterations to run while training 
train_and_eval(model_folder, train_steps) 

有兩點要注意:

  • 原來的實例教程,這是基於爲這裏https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/learn/wide_n_deep_tutorial.py

  • 注意我使用的是DNNClassifier,而不是LinearClassifier,因爲我想專門處理連續的輸入t變量。

  • 很多示例只是使用已知可用於示例的「預製」數據集;我的數據集已經手動生成,絕對不是隨機的。

  • 我已驗證csv loader正在將數據正確加載爲int64值。

  • 訓練和測試數據的生成方式是相同的,但其中有不同的值;然而,使用data.training 作爲測試數據仍然返回的準確率爲0%,所以毫無疑問某些事情不起作用,這不僅僅是過度擬合。

回答

1

首先,您描述的是迴歸任務,而不是分類任務。因此,DNNClassifier和LinearClassifier都是錯誤的使用方法。這也會使準確性錯誤地用於判斷模型是否正常工作。我建議你閱讀這兩種不同的情況,例如在「統計學習的元素」一書中

但是,這裏是你的問題的簡短答案。假設你有一個線性模型

awesomeness_predicted = slope * age 

其中slope是你想要從數據中學習的參數。假設你有數據age[0], ..., age[N]和相應的真棒值a_data[0],...,a_data[N]。爲了詳細說明,如果你的模型效果很好,我們將使用均方誤差,即

error = sum((a_data[i] - a_predicted[i])**2 for i in range(N)) 

你想現在做的是開始一個隨機猜測斜率和使用梯度下降逐步改善。這裏是純tensorflow

import tensorflow as tf 
import numpy as np 

DTYPE = tf.float32 

## Generate Data 
age = np.array([67, 38, 32, 69, 40]) 
awesomeness = 10 * age 

## Generate model 
# define the parameter of the model 
slope = tf.Variable(initial_value=tf.random_normal(shape=(1,), dtype=DTYPE)) 
# define the data inputs to the model as variable size tensors 
x = tf.placeholder(DTYPE, shape=(None,)) 
y_data = tf.placeholder(DTYPE, shape=(None,)) 
# specify the model 
y_pred = slope * x 
# use mean squared error as loss function 
loss = tf.reduce_mean(tf.square(y_data - y_pred)) 
target = tf.train.AdamOptimizer().minimize(loss) 

## Train Model 
init = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init) 
    for epoch in range(100000): 
     _, training_loss = sess.run([target, loss], 
            feed_dict={x: age, y_data: awesomeness}) 
    print("Training loss: ", training_loss) 
    print("Found slope=", sess.run(slope)) 
+0

唔...你能澄清可能如何推廣到更復雜的模型?這似乎特定於擬合線性模塊,其中I *已經知道* y = k * x;我知道這就是我所問的,非常公平,但是當你已經需要知道它是什麼的時候,這似乎已經挫敗了試圖訓練數據集的意義......? – Doug

+0

這就是機器學習的工作原理(有一些處理非參數模型的統計分支,但這是一個完全不同的野獸)。 這個模型與真實世界應用程序的唯一區別在於後者通常涉及更復雜和更富表現力的模型。但你說你想要一個線性模型,所以這就是你得到的;) – dseuss

0

https://github.com/tflearn/tflearn/blob/master/examples/basics/multiple_regression.py參閱使用tflearn來解決這個完整的工作示例。

""" Multiple Regression/Multi target Regression Example 

The input features have 10 dimensions, and target features are 2 dimension. 

""" 

from __future__ import absolute_import, division, print_function 

import tflearn 
import numpy as np 

# Regression data- 10 training instances 
#10 input features per instance. 
X=np.random.rand(10,10).tolist() 
#2 output features per instance 
Y=np.random.rand(10,2).tolist() 

# Multiple Regression graph, 10-d input layer 
input_ = tflearn.input_data(shape=[None,10]) 
#10-d fully connected layer 
r1 = tflearn.fully_connected(input_,10) 
#2-d fully connected layer for output 
r1 = tflearn.fully_connected(r1,2) 
r1 = tflearn.regression(r1, optimizer='sgd', loss='mean_square', 
             metric='R2', learning_rate=0.01) 

m = tflearn.DNN(r1) 
m.fit(X,Y, n_epoch=100, show_metric=True, snapshot_epoch=False) 

#Predict for 1 instance 
testinstance=np.random.rand(1,10).tolist() 
print("\nInput features: ",testinstance) 
print("\n Predicted output: ") 
print(m.predict(testinstance)) 
1

有幾件事我想說。 假設你正確加載數據:

- 這看起來像一個迴歸任務,你正在使用一個分類器。我並不是說它根本不起作用,但是就像這樣,你會給每個年齡段的每個條目貼上標籤,並且在整個批次上進行培訓,每個時期都非常不穩定。

- 您正在爲損失獲得巨大的價值,您的梯度正在爆炸式增長。有了這個玩具數據集,你可能需要調整像隱藏神經元這樣的超參數,學習速度和時代數量。嘗試記錄每個時期的損失值,看看是否可能是問題。

-Last建議,使您的數據的工作與簡單的模型,可能適合你的任務,就像一個regression model,然後擴大規模

相關問題