2016-05-30 10 views
7

Podążałem za przewodnikiem Tensorflow Reading Data, aby uzyskać dane mojej aplikacji w postaci TFRecords, i używam TFRecordReader w moich wejściowych potokach do odczytu tych danych.Używanie potoku wejściowego Tensorflow z przepływem/tf nauczyć się

Teraz czytam przewodniki na temat korzystania z skflow/tf.learn do budowy prostego regresora, ale nie widzę sposobu korzystania z moich danych wejściowych za pomocą tych narzędzi.

W poniższym kodzie aplikacja kończy się niepowodzeniem w przypadku połączenia regressor.fit(..) z ValueError: setting an array element with a sequence..

Błąd:

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. 

Kod:

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) 
     ... 

Wygląda na to wezwanie check_array spodziewa się prawdziwą tablicę, a nie tensora. Czy jest coś, co mogę zrobić, aby pomasować moje dane we właściwym kształcie?

+0

Co się stanie, jeśli zrobisz x = x.eval() i labels = labels.eval() przed wywołaniem regressor.fit? To powinno ocenić tensor w macierzy, ale wątpię, czy to jest właściwy sposób robienia tego z przepływem ... – mathetes

+0

@makhetes, który wydaje się działać, ale zanim pójdę tą ścieżką, jest to, że 'tf-y' sposób robienia rzeczy? Mam intuicję, że wykres TF powinien przenosić dane, a nie mój program. –

+0

Absolutnie, przykro mi, że nie określiłem, ale to było po prostu jako sposób debugowania. Dlatego wysłałem komentarz zamiast odpowiedzi. Nie mogę ci pomóc dalej, nie jestem zaznajomiony ze skąpem – mathetes

Odpowiedz

1

Wygląda na to, że API, z którym pracowałeś, jest amortyzowane. Jeśli używasz nowocześniejszego tf.contrib.learn.LinearRegressor (myślę, że> = 1.0), powinieneś podać input_fn, który zasadniczo wytwarza wejścia i etykiety. Myślę, że w swoim przykładzie, że byłoby tak proste, jak zmienia swoją funkcję run do:

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

a następnie zdefiniowanie funkcji wejścia nazwie my_input_fn. Od the docs, ta funkcja wejściowa przybiera postać:

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 

Myślę, że dokumentacja może Ci resztę drogi. Odtąd trudno mi powiedzieć, jak należy postępować, nie widząc swoich danych.

+1

Masz rację, że to był stary problem i jestem o krok od tego. Dziękujemy za udostępnienie przydatnego, aktualnego rozwiązania. –

Powiązane problemy