2016-05-30 5 views
7

Ich habe die Tensorflow-Anleitung Reading Data verwendet, um die Daten meiner Anwendung in Form von TFRecords zu erhalten, und verwende TFRecordReader in meinen Eingabe-Pipelines, um diese Daten zu lesen.Verwenden einer Tensorflow-Eingabepipeline mit skflow/tf learn

Ich lese jetzt die Anleitungen zur Verwendung von skflow/tf.learn, um einen einfachen Regressor zu erstellen, aber ich kann nicht sehen, wie ich meine Eingabedaten mit diesen Tools verwenden kann.

Im folgenden Code schlägt die App unter regressor.fit(..) mit ValueError: setting an array element with a sequence. fehl.

Fehler:

Traceback (most recent call last): 
    File ".../tf.py", line 138, in <module> 
    run() 
    File ".../tf.py", line 86, in run 
    regressor.fit(x, labels) 
    File ".../site-packages/tensorflow/contrib/learn/python/learn/estimators/base.py", line 218, in fit 
    self.batch_size) 
    File ".../site-packages/tensorflow/contrib/learn/python/learn/io/data_feeder.py", line 99, in setup_train_data_feeder 
    return data_feeder_cls(X, y, n_classes, batch_size) 
    File ".../site-packages/tensorflow/contrib/learn/python/learn/io/data_feeder.py", line 191, in __init__ 
    self.X = check_array(X, dtype=x_dtype) 
    File ".../site-packages/tensorflow/contrib/learn/python/learn/io/data_feeder.py", line 161, in check_array 
    array = np.array(array, dtype=dtype, order=None, copy=False) 

ValueError: setting an array element with a sequence. 

Code:

import tensorflow as tf 
import tensorflow.contrib.learn as learn 

def inputs(): 
    with tf.name_scope('input'): 
     filename_queue = tf.train.string_input_producer([filename]) 

     reader = tf.TFRecordReader() 
     _, serialized_example = reader.read(filename_queue) 

     features = tf.parse_single_example(serialized_example, feature_spec) 
     labels = features.pop('actual') 
     some_feature = features['some_feature'] 

     features_batch, labels_batch = tf.train.shuffle_batch(
      [some_feature, labels], batch_size=batch_size, capacity=capacity, 
      min_after_dequeue=min_after_dequeue) 

     return features_batch, labels_batch 


def run(): 
    with tf.Graph().as_default(): 
     x, labels = inputs() 

     # regressor = learn.TensorFlowDNNRegressor(hidden_units=[10, 20, 10]) 
     regressor = learn.TensorFlowLinearRegressor() 

     regressor.fit(x, labels) 
     ... 

Es sieht aus wie der check_array Anruf wird ein echtes Array erwartet, kein Tensor. Kann ich irgendetwas tun, um meine Daten in die richtige Form zu bringen?

+0

Was passiert, wenn Sie x = x.eval() und labels = labels.eval() vor Ihrem Aufruf von regressor.fit eingeben? Dies sollte den Tensor in ein Array auswerten, aber ich bezweifle, dass dies der richtige Weg ist, dies mit Skflow zu tun ... – mathetes

+0

@mathetes, das scheint zu funktionieren, aber bevor ich diesen Pfad hinunter gehe, ist das der 'tf-y' Weg Dinge tun? Meine Intuition ist, dass der TF-Graph die Daten bewegen sollte, nicht mein Programm. –

+0

Absolut, es tut mir leid, ich habe nicht angegeben, aber es war nur als eine Art des Debuggens gemeint. Deshalb habe ich eher einen Kommentar als eine Antwort gepostet. Ich kann dir jedoch nicht weiter helfen, ich kenne Skflow nicht. – mathetes

Antwort

1

Es sieht so aus, als ob die API, mit der Sie gearbeitet haben, abgeschrieben wird. Wenn Sie eine modernere tf.contrib.learn.LinearRegressor (ich denke> = 1.0) verwenden, sollten Sie die input_fn angeben, die im Grunde die Eingaben und Beschriftungen erzeugt. Ich denke, in Ihrem Beispiel, das wäre so einfach sein wie Ihre run Funktion Wechsel:

def run(): 
    with tf.Graph().as_default(): 
     regressor = tf.contrib.learn.LinearRegressor() 
     regressor.fit(input_fn=my_input_fn) 

und dann eine Eingabefunktion definieren aufgerufen my_input_fn. Von the docs nimmt diese Eingabefunktion die Form:

def my_input_fn(): 

    # Preprocess your data here... 

    # ...then return 1) a mapping of feature columns to Tensors with 
    # the corresponding feature data, and 2) a Tensor containing labels 
    return feature_cols, labels 

ich die Dokumentation denken können Sie den Rest des Weges zu bekommen. Es ist schwierig von hier zu sagen, wie Sie vorgehen sollten, ohne Ihre Daten zu sehen.

+1

Du hast Recht, dass dies ein altes Problem war und ich bin jetzt weit darüber hinaus. Vielen Dank für die Bereitstellung einer nützlichen, aktuellen Lösung. –

Verwandte Themen