Удалите столбец из набора данных TFRecord (для выбора объектов)

#python #tensorflow #tensorflow-datasets #tfrecord #tfx

Вопрос:

Я пытаюсь реализовать компонент выбора функций, имея в виду следующий план:

Осуществление

  • Компонент принимает и InputArtifact[Example] в качестве входных данных
  • Поскольку данные хранятся в виде записей TF в URI входного артефакта, я преобразую их в совместимые словари numpy и использую sklearn для составления списка выбранных функций
  • Я удаляю необходимые функции из входного примера напрямую, чтобы создать его OutputArtifact[Example] (который имеет ту же структуру, но меньше столбцов).

Я закончил с первым и вторым пунктом, но не могу понять, как удалить выбранные столбцы непосредственно в самом наборе данных TFRecord (который я использую tf.data.TFRecordDataset(train_uri, compression_type='GZIP') ).

Комментарии:

1. Не могли бы вы, пожалуйста, обратиться к этому блогу . Спасибо

Ответ №1:

Мне потребовалось некоторое время, чтобы понять это (с помощью блога, связанного с поддержкой TensorFlow в комментариях), но вот обходной путь!

 split_dataset = tf.data.TFRecordDataset("path_to_original_dataset.gzip", compression_type='GZIP')
 
 with tf.io.TFRecordWriter(path = "path_to_new_TFRecord.gzip", options="GZIP") as writer:
      for split_record in split_dataset.as_numpy_iterator():
        example = tf.train.Example()
        example.ParseFromString(split_record)

        updated_example = update_example(selected_features, example)

        writer.write(updated_example.SerializeToString())
 

Вот updated_example пользовательская функция, которую я использовал, которая берет проанализированный пример, обрабатывает его и возвращает обработанный пример!

 # update example with selected features
def update_example(selected_features, orig_example):
  result = {}
  for key, feature in orig_example.features.feature.items():
    if key in selected_features:
      result[key] = orig_example.features.feature[key]
    
    new_example = tf.train.Example(features=tf.train.Features(feature=result))
    return new_example
 

Вместо того, чтобы удалить столбец (так как я не смог найти способ сделать это), я просто создал новый пример функции за функцией и вернул его!