Создание SequenceExample (ов) с использованием TensorFlow Transform - PullRequest
1 голос
/ 11 января 2020

С помощью TensorFlow Transform мы можем предварительно обработать данные, используя Apache Beam. Одним из требований при настройке такого конвейера является определение объекта DatasetMetadata , который содержит схему, содержащую информацию, необходимую для анализа данных из формата на диске или в памяти, в тензоры.

В официальной документации нам приведен пример формы:

raw_data_metadata = dataset_metadata.DatasetMetadata(
dataset_schema.from_feature_spec({
    's': tf.FixedLenFeature([], tf.string),
    'y': tf.FixedLenFeature([], tf.float32),
    'x': tf.FixedLenFeature([], tf.float32),
}))

Это нормально, если ваши необработанные данные представляют собой словарь в форме:

{
    's': 'example string',
    'y': 32.0,
    'x': 35.0
}

Однако я несколько растерялся, когда дело доходит до определения схемы для SequenceExample . В частности, учтите, что мои данные имеют следующий формат:

{
    # context features
    'length': 5,
    # sequence features
    'tokens': [
        {
            'raw': 'The',
            'ner-tag': 'O'
        },
        {
            'raw': 'European',
            'ner-tag': 'B-org'
        },
        {
            'raw': 'Union',
            'ner-tag': 'I-org'
        },
        {
            'raw': 'is',
            'ner-tag': 'O'
        },
        {
            'raw': 'nice',
            'ner-tag': 'O'
        }
        ...
    ]
}

Выше у меня есть предложение с двумя последовательностями:

  • ner-tag последовательность, которая будет использоваться в качестве метки для модели
  • raw последовательность, которая будет использоваться в качестве функции для модели

Как создать схема данных TFT для таких примеров?

Документация для этого немного отсутствует. Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 12 января 2020

Что ж, после дальнейших исследований ответ таков: вы не можете.

TensorFlow Transform еще не поддерживает SequenceExample (s). Установите флажок this .

. Похоже, что единственный способ сделать это в настоящее время состоит в том, чтобы конвейер балок создал SequenceExamples, сериализовал их и записал в TFRecords.

В приведенной выше структуре объекта предложения вам необходимо сначала создать DoFn Beam, который преобразует каждое предложение в сериализованный пример SequenceExample:

class ConvertJSONSentenceToSerializedSequenceExample(beam.DoFn):

    def make_example(self, sentence):
        # the context features
        sentence_level_details = tf.train.Features(feature={
            'length': tf.train.Feature(int64_list=tf.train.Int64List(value=[sentence['length']]))
        })

        # create sequence data
        word_features = []
        ner_tags_features = []
        for token in sentence['tokens']:
            # create each of the features, then add them to the corresponding feature list
            word_feature = tf.train.Feature(bytes_list=tf.train.BytesList(value=[token['raw'].encode('utf-8')]))
            word_features.append(word_feature)

            ner_tag_feature = tf.train.Feature(int64_list=tf.train.Int64List(value=[token['']]))
            ner_tags_features.append(ner_tag_feature)

        words = tf.train.FeatureList(feature=word_features)
        ner_tags = tf.train.FeatureList(feature=ner_tags_features)

        sentence_sequences = tf.train.FeatureLists(feature_list={
            'words': words,
            'ner-tags': ner_tags
        })

        ex = tf.train.SequenceExample(
            context = sentence_level_details,
            feature_lists = sentence_sequences
        )

        return ex

    def process(self, sentence, **kwargs):
        try:
            ex = self.make_example(sentence)
            yield ex.SerializeToString()
        except Exception as e:
            logging.warning("JSON sentence could not be converted into SequenceExample: " + str(e))
            return None

Как только это будет сделано, вы можете использовать beam.io. .tfrecordio модулирует эти сериализованные примеры SequenceExample в файлы TFRecord (s):

with beam.Pipeline(RUNNER, options=opts) as p:
(p
...
| 'Convert sentences to serialized TensorFlow SequenceExamples' >> beam.ParDo(ConvertJSONSentenceToSerializedSequenceExample())
| 'Write to TFRecord files' >> tfrecordio.WriteToTFRecord(
     os.path.join(OUTPUT_DIR, 'train'),
     file_name_suffix='.gz'
     # default coder is the BytesCoder, which will work since we have serialized the training data
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...