У меня проблема с преобразованием моего файла .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 или что-то подобное.
Помощь