2016-08-27 1 views
1

Я пытаюсь создать свои собственные данные обучения для модели TextSum. Насколько я понимаю, мне нужно поместить мои статьи и рефераты в двоичный файл (в TFRecords). Однако я не могу создать свои собственные данные обучения из сырых текстовых файлов. Я не понимаю, формат очень хорошо, так что я пытаюсь создать очень простой двоичный файл, используя следующий код:Tensorflow - модель TextSum: как создать свои собственные данные обучения

files = os.listdir(path) 
writer = tf.python_io.TFRecordWriter("test_data") 
for i, file in enumerate(files): 
    content = open(os.path.join(path, file), "r").read() 
    example = tf.train.Example(
     features = tf.train.Features(
      feature = { 
       'content': tf.train.Feature(bytes_list=tf.train.BytesList(value=[content])) 
      } 
     ) 
    ) 

    serialized = example.SerializeToString() 
    writer.write(serialized) 

И я пытаюсь использовать следующий код, чтобы считывать значение этого test_data файла

reader = open("test_data", 'rb') 
len_bytes = reader.read(8) 
str_len = struct.unpack('q', len_bytes)[0] 
example_str = struct.unpack('%ds' % str_len, reader.read(str_len))[0] 
example_pb2.Example.FromString(example_str) 

Но я всегда получаю следующее сообщение об ошибке:

File "dailymail_corpus_to_tfrecords.py", line 34, in check_file 
    example_pb2.Example.FromString(example_str) 
    File "/home/s1510032/anaconda2/lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 770, in FromString 
    message.MergeFromString(s) 
    File "/home/s1510032/anaconda2/lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 1091, in MergeFromString 
    if self._InternalParse(serialized, 0, length) != length: 
    File "/home/s1510032/anaconda2/lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 1117, in InternalParse 
    new_pos = local_SkipField(buffer, new_pos, end, tag_bytes) 
    File "/home/s1510032/anaconda2/lib/python2.7/site-packages/google/protobuf/internal/decoder.py", line 850, in SkipField 
    return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, end) 
    File "/home/s1510032/anaconda2/lib/python2.7/site-packages/google/protobuf/internal/decoder.py", line 791, in _SkipLengthDelimited 
    raise _DecodeError('Truncated message.') 
google.protobuf.message.DecodeError: Truncated message. 

Я понятия не имею, что это неправильно. Пожалуйста, дайте мне знать, если у вас есть предложения по решению этой проблемы.

ответ

2

Для тех, у кого такая же проблема. Мне пришлось посмотреть исходный код TensorFlow, чтобы посмотреть, как они записывают данные с помощью TFRecordWriter. Я понял, что на самом деле они пишут 8 байтов для длины, 4 байта для проверки CRC, это означает, что первые 12 байтов для заголовка. Поскольку в коде TextSum двоичный файл образца имеет только 8-байтовый заголовок, поэтому они используют reader.read (8), чтобы получить длину данных и прочитать остальные как функции.

Мой рабочий раствор:

reader = open("test_data", 'rb') 
len_bytes = reader.read(8) 
reader.read(4) #ignore next 4 bytes 
str_len = struct.unpack('q', len_bytes)[0] 
example_str = struct.unpack('%ds' % str_len, reader.read(str_len))[0] 
example_pb2.Example.FromString(example_str) 
+0

каких операционная система у вас это работает на? OSX 11 Я сталкиваюсь с проблемами прежде чем я даже доберусь сюда. Мне пришлось модифицировать метод «Train», поэтому супервизор будет ждать остановки потоков. – Jordan

+0

Я использую ОС OSX. Я также попытался запустить его в Unix, и он работал нормально. Но в моем решении есть небольшая ошибка, мы должны использовать 'reader.read (4)', чтобы пропустить 4 байта в 'data.py' вместо использования' seek (12) '. Я собираюсь обновить свой пост –

2

Я надеюсь, что вы data_convert_example.py в каталоге textsum. Если нет, то вы можете найти его в этом посте: https://github.com/tensorflow/models/pull/379/files

Используйте файл питона, чтобы преобразовать данные двоичные данные игрушечные (имя файла:. Данные в каталоге данных в текстовый формат python data_convert_example.py --command binary_to_text --in_file ../data/data --out_file ../data/result_text

Вы можете увидеть фактический текст формат, который вы должны дать в формате result_text.

Подготовьте свои данные в этом формате и использовать тот же питон скрипт для преобразования из text_to_binary и использовать результат для обучения/тестирование/Eval.