2016-08-27 4 views
1

Ich versuche meine eigenen Trainingsdaten für das TextSum Modell zu erstellen. Nach meinem Verständnis muss ich meine Artikel und Abstracts in eine Binärdatei (in TFRecords) einfügen. Ich kann jedoch aus Rohtextdateien keine eigenen Trainingsdaten erstellen. Ich verstehe nicht, Format sehr klar, so versuche ich, eine sehr einfache binäre Datei mit dem folgenden Code zu erstellen:Tensorflow - TextSum Modell: Wie erstelle ich meine eigenen Trainingsdaten?

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) 

Und ich versuche, den folgenden Code zu verwenden, um den Wert dieser test_data Datei auszulesen

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) 

Aber ich bekomme immer folgende Fehlermeldung:

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. 

ich habe keine Ahnung, was falsch ist. Bitte lassen Sie mich wissen, wenn Sie Vorschläge zur Lösung dieses Problems haben.

Antwort

2

Für diejenigen, die das gleiche Problem haben. Ich musste mir den Quelltext von TensorFlow ansehen, um zu sehen, wie sie die Daten mit TFRecordWriter ausschreiben. Ich habe festgestellt, dass sie tatsächlich 8 Bytes für die Länge schreiben, 4 Bytes für die CRC-Prüfung, das bedeutet, dass die ersten 12 Bytes für den Header sind. Da im TextSum-Code die Beispiel-Binärdatei nur einen 8-Byte-Header zu haben scheint, verwenden sie reader.read (8), um die Länge der Daten zu ermitteln und den Rest als Features zu lesen.

Meine Arbeitslösung:

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

welches Betriebssystem hast du das läuft auf? Unter OSX 11 bekomme ich Probleme bevor ich überhaupt herkomme. Ich musste die Train-Methode ändern, so dass der Supervisor auf das Stoppen der Threads warten würde. – Jordan

+0

Ich benutze laufenden OSX. Ich habe auch versucht, es auf Unix laufen zu lassen und es lief gut. Aber es gibt einen kleinen Fehler in meiner Lösung, wir sollten 'reader.read (4)' verwenden, um 4 Bytes in 'dat.py' zu überspringen, anstatt' seek (12) 'zu verwenden. Ich werde meinen Beitrag aktualisieren –

2

Ich hoffe, Sie data_convert_example.py in Ihrem textsum Verzeichnis haben. Wenn nicht, können Sie es in diesem Beitrag finden: https://github.com/tensorflow/models/pull/379/files

die Python-Datei verwenden zu bestimmten binären Spielzeug Daten (Dateiname zu konvertieren. Daten in Datenverzeichnis in Textformat python data_convert_example.py --command binary_to_text --in_file ../data/data --out_file ../data/result_text

Sie den eigentlichen Text sehen Format sollten Sie im result_text Format geben.

Ihre Daten in diesem Format vorbereiten und das gleiche python-Skript verwenden, um von text_to_binary zu konvertieren und das Ergebnis für die Ausbildung/Prüfung/eval.

Verwandte Themen