Почему SchemaGen не поддерживается в tfdv.display_schema ()?

Что касается проверки данных тензорного потока TFX, я пытаюсь понять, когда мне следует использовать компоненты * Gen по сравнению с использованием методов, предоставляемых TFDV.

В частности, меня сбивает с толку то, что у меня в качестве ExampleGen используется следующее:

output = example_gen_pb2.Output(
         split_config=example_gen_pb2.SplitConfig(splits=[
             example_gen_pb2.SplitConfig.Split(name='train', hash_buckets=7),
             example_gen_pb2.SplitConfig.Split(name='test', hash_buckets=2),
             example_gen_pb2.SplitConfig.Split(name='eval', hash_buckets=1)
         ]))
example_gen = CsvExampleGen(input_base=os.path.join(base_dir, data_dir), 
output_config=output)
context.run(example_gen)

Итак, я решил, что хочу сгенерировать свою статистику из моего разделения поездов, а не из исходного файла поезда, поэтому я попытался с:

statistics_gen = StatisticsGen(
  examples=example_gen.outputs['examples'],
  exclude_splits=['eval']
)
context.run(statistics_gen)

и это работает нормально. Но затем я попытался вывести свою схему (вставить звук зуммера):

schema = tfdv.infer_schema(statistics=statistics_gen)

и сознательно это вызывает ошибку ниже. Я полностью ожидал, что это неправильный тип, но я не могу понять, как извлечь из объекта StatsGen правильный вывод для передачи в метод infer_schema ().

В качестве альтернативы, если я преследую исключительно структуру компонентов на основе * Gen, она строится, но я не вижу, как правильно визуализировать схему, статистику и т. Д. Наконец, причина, по которой я использую здесь вызов tfdv.infer_schema () предназначен для аналогичного злополучного вызова display_schema (), который вызывает ошибку, если вы попытаетесь передать ему SchemaGen.

Ошибка сверху:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-93ceafbcb04a> in <module>
----> 1 schema = tfdv.infer_schema(statistics=validate_stats)
      2 tfdv.write_schema_text(schema, schema_location)
      3 
      4 tfdv.display(infer_schema)

/usr/local/lib/python3.6/dist-packages/tensorflow_data_validation/api/validation_api.py in infer_schema(statistics, infer_feature_shape, max_string_domain_size, schema_transformations)
     95     raise TypeError(
     96         'statistics is of type %s, should be '
---> 97         'a DatasetFeatureStatisticsList proto.' % type(statistics).__name__)
     98 
     99   # This will raise an exception if there are multiple datasets, none of which

TypeError: statistics is of type ExampleValidator, should be a DatasetFeatureStatisticsList proto.

Я действительно пытаюсь понять, почему у нас есть компоненты, такие как SchemaGen и StatisticsGen, только для того, чтобы TFDV требовал, чтобы мы использовали внутренние функции, чтобы извлечь из этого пользу. Я предполагаю, что он предоставляет интерактивный конвейер и неинтерактивные сценарии, но мой поиск в Google оставил мне неясным.

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

TIA


person Lorin S.    schedule 25.09.2020    source источник


Ответы (1)


Я тоже новичок в TFX. Ваш пост о ExampleValidator помог мне, надеюсь, это ответит на ваш вопрос.

Использование компонентов только для визуализации схемы

 statistics_gen = StatisticsGen(
  examples=example_gen.outputs['examples'],
  exclude_splits=['eval']
)
context.run(statistics_gen)

schema_gen = SchemaGen(
    statistics=statistics_gen.outputs['statistics'],
    infer_feature_shape=True
)
context.run(schema_gen)

context.show(schema_gen.outputs['schema']) # this should allow you to to visualize your schema 

Использование компонентов + TFDV для визуализации схемы

Похоже, мы не можем использовать StatisticsGen напрямую. Нам нужно будет знать, где сохраняется артефакт генерации статистики, а затем загрузить этот артефакт с помощью tfdv.load_statistics

# get the stats artifact
stats_artifact = statistics_gen.outputs.statistics._artifacts[0]

# get base path 
base_path = stats_artifact.uri 

# get path to file 
train_stats_file = os.path.join(base_path, 'train/stats_tfrecord') #only showing training as an example

# load stats 
loaded_stats = tfdv.load_statistics(train_stats_file)

# generic and show schema
schema = tfdv.infer_schema(loaded_stats)

tfdv.display_schema(schema)
person sleepyowl    schedule 04.10.2020
comment
Спасибо, @sleepyowl, это соответствует тому, что я обнаружил с тех пор, как задал вопрос изначально. Хотя я все еще сомневаюсь, это то, что мы обнаружили ... Но это правильный путь? Спасибо за ваше понимание. - person Lorin S.; 05.10.2020