Как преобразовать последовательность целых чисел в .tfrecords и обратно в набор данных - PullRequest
0 голосов
/ 03 мая 2018

У меня проблема с преобразованием моего файла .csv в файл .tfrecords и последующим чтением указанного файла для создания набора данных. Или, точнее, набор данных, который дает мне функции в форме, которую я могу использовать.

У меня есть файл .csv, подобный этому:

Feature1,Feature2,...,Feature50,Label
    5   ,   19   ,...,    17   ,  0

Первая строка - это, конечно, строка заголовка. Это пятьдесят целых чисел и метка 0 или 1. Я читаю это строка за строкой и записываю ее в файл .tfrecords, например так:

    with tf.python_io.TFRecordWriter(self.abs_write_train_file_path) as writer:
        for row in self.train_file:
            features, label = row[0:50], row[50]
            self.example = tf.train.Example(features=tf.train.Features(feature={
                'features': tf.train.Feature(int64_list=tf.train.Int64List(value=[item for item in features])),
                'labels': tf.train.Feature(int64_list=tf.train.Int64List(value=[label]))
            }))
            writer.write(self.example.SerializeToString())

Это дает мне пример в следующем формате:

features {
  feature {
    key: "features"
    value {
      int64_list {
    value: 5
    value: 19
   ...(50 values all together)...
    value: 17
      }
    }
  }
  feature {
    key: "labels"
    value {
      int64_list {
        value: 0
      }
    }
  }
}

А сейчас я пытаюсь использовать этот файл так:

import tensorflow as tf

COLUMNS = []
for _ in range(1, 51):
    COLUMNS.append('Feature'+str(_))
COLUMNS.append('Label')

def get_dataset(file_path):
    dataset = tf.data.TFRecordDataset([file_path])
    dataset = dataset.map(parse_function)
    return dataset

def parse_function(example_proto):
    features= {
        'Features': tf.FixedLenFeature((50), tf.int64),
        'Labels': tf.FixedLenFeature((), tf.int64)
    }
    parsed_features = tf.parse_single_example(example_proto, features)
    return parsed_features['Features'], parsed_features['Labels']

def train_input_fn():
    train_dataset = get_dataset(train_filepath)
    iterator = train_dataset.make_one_shot_iterator()
    features, labels = iterator.get_next()
    return {'features': [features]}, labels

feature_columns = [tf.feature_column.numeric_column(k) for k in COLUMN]
classifier = tf.estimator.LinearClassifier(feature_columns=feature_columns)
classifier.train(input_fn=train_input_fn)

К сожалению - но понятно, учитывая словарь внутри файла .tfrecords - это ошибка:

Traceback (most recent call last):
  File "c:\Users\REDACTED\Neural Net\test.py", line 53, in <module>
input_fn=train_input_fn
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\estimator.py", line 355, in train
loss = self._train_model(input_fn, hooks, saving_listeners)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\estimator.py", line 824, in _train_model
features, labels, model_fn_lib.ModeKeys.TRAIN, self.config)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\estimator.py", line 805, in _call_model_fn
model_fn_results = self._model_fn(features=features, **kwargs)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\canned\linear.py", line 318, in _model_fn
config=config)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\canned\linear.py", line 158, in _linear_model_fn
logits = logit_fn(features=features)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\estimator\canned\linear.py", line 99, in linear_logit_fn
cols_to_vars=cols_to_vars)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 433, in linear_model
trainable=trainable)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 1710, in _create_weighted_sum
trainable=trainable)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 1719, in _create_dense_column_weighted_sum
trainable=trainable)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 2083, in _get_dense_tensor
return inputs.get(self)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 1886, in get
transformed = column._transform_feature(self)  # pylint: disable=protected-access
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 2051, in _transform_feature
input_tensor = inputs.get(self.key)
  File "C:\Users\REDACTED\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 1882, in get
raise ValueError('Feature {} is not in features dictionary.'.format(key))
ValueError: Feature Feature1 is not in features dictionary.

Вопрос в том, где ошибка. Создание файла .tfrecords было сделано строго по книге, и данные, записанные в него, имеют формат, указанный для записи в файл .tfrecords. С другой стороны, чтение из файла .tfrecords должно быть легким и без особых хлопот при разборе, особенно если вы просто хотите использовать высокоуровневый API-интерфейс tenorflow. Кроме того, маркировка последовательности не так часто встречается в google для более новых версий, и почти в каждом учебнике используются устаревшие tf-версии или просто снова объясняются tf-руководства (кстати, документально-руководство по tf-api-ужасно плохо документировано ), которые используют данные для скачивания из mnist или что-то подобное.

Помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...