Как прочитать весь файл CSV как один учебный пример в тензорном потоке?

Мой набор данных состоит из сотен файлов .csv с фиксированным количеством столбцов и переменным количеством строк. Вопрос - как это прочитать в tensorflow?

filename_queue = tf.train.string_input_producer(['file1.csv','file2.csv'])
features_reader = tf.WholeFileReader()
filename, value = features_reader.read(filename_queue)

Теперь было бы здорово иметь какой-то метод декодирования значения в фактические числа, которые в нем есть. Есть ли способ сделать это, или я должен использовать другой ридер?


person Karaszka    schedule 07.06.2017    source источник
comment
Вы смотрели: stackoverflow.com/questions/37091899/   -  person Harsha Pokkalla    schedule 07.06.2017
comment
Да, но он читает одну строку (строку файла .csv) за раз, и мой единственный ввод должен быть содержимым всего файла.   -  person Karaszka    schedule 07.06.2017


Ответы (1)


Так что на самом деле я решил этот вопрос с другим читателем, создав tf.records - двоичные файлы tensorflow, и я думаю, что в таком случае это обычное дело.

Хотя официальная документация по обработке tf.records неудовлетворительна, здесь есть отличное объяснение: http://web.stanford.edu/class/cs20si/lectures/notes_09.pdf.

Сначала нужно прочитать файл и преобразовать его в двоичный формат. В моем случае я просто прочитал файл в массив numpy.

file = your_custom_reader(csv_file)
file = file.tobytes()

Теперь в моем случае количество столбцов было постоянным, а количество строк в наборе данных переменным. Это может быть сложно — когда вы читаете двоичные файлы, они приходят в виде тензоров без предопределенной формы (в примере из примечаний форма хранится в двоичном файле, но это все равно означает, что вам нужно оценить ее в сеансе, что делает его бесполезен для построения модели). Поэтому на этом шаге полезно увеличить ваши тензоры до максимального размера.

file = your_custom_reader(csv_file)
file = pad_to_max_size(file)
file = file.tobytes()

Запись в tf.record очень проста. Учитывая, что для каждого файла у вас есть метка y:

writer = tf.python_io.TFRecordWriter(file_name)
example = tf.train.Example(features=tf.train.Features(feature={
    'features': tf.train.Feature(bytes_list=tf.train.BytesList(value=[file])),
    'y'       : tf.train.Feature(bytes_list=tf.train.BytesList(value=[y.tobytes()]))
    }))
writer.write(example.SerializeToString())
writer.close()

Теперь двоичный файл можно загрузить следующим образом.

tfrecord_file_queue = tf.train.string_input_producer([file_name, file_name_2,...,file_name_N], name='queue')
reader = tf.TFRecordReader()
_, tfrecord_serialized = reader.read(tfrecord_file_queue)
tfrecord_features = tf.parse_single_example(tfrecord_serialized,
                    features={
                        'features': tf.FixedLenFeature([],tf.string),
                        'y'       : tf.FixedLenFeature([],tf.string)                                                   
                                },  name='tf_features')

Как я уже сказал, для остальной части кода важно знать форму вашего тензора. У меня были SHAPE_1 и SHAPE_2

features = tf.decode_raw(tfrecord_features['features'],tf.float32)
features = tf.reshape(audio_features, (SHAPE_1,SHAPE_2))
features.set_shape((SHAPE_1,SHAPE_2))
y = tf.decode_raw(tfrecord_features['y'],tf.float32)

Более организованный пример, который помещает код в функции, доступен на слайдах лекции из Стэнфорда, которые мне понравились выше. Я очень рекомендую эти слайды, особенно потому, что они дают больше объяснений, где этот ответ отсутствует. Тем не менее, я надеюсь, что это поможет!

person Karaszka    schedule 10.07.2017