2016-08-27 1 views
1

J'essaie de créer mes propres données d'entraînement pour le modèle TextSum. Comme je le comprends, je dois mettre mes articles et résumés dans un fichier binaire (dans TFRecords). Cependant, je ne peux pas créer mes propres données d'apprentissage à partir de fichiers texte bruts. Je ne comprends pas le format très clairement, donc je suis en train de créer un fichier binaire très simple en utilisant le code suivant:Tensorflow - Modèle TextSum: Comment créer mes propres données d'entraînement

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) 

Et j'essaie d'utiliser le code suivant pour lire la valeur de ce fichier 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) 

mais je reçois toujours l'erreur suivante:

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. 

Je ne sais pas ce qui est faux. S'il vous plaît laissez-moi savoir si vous avez des suggestions pour résoudre ce problème.

Répondre

2

Pour ceux qui ont le même problème. J'ai dû regarder le code source de TensorFlow pour voir comment ils écrivent les données avec TFRecordWriter. J'ai réalisé qu'ils écrivent réellement 8 octets pour la longueur, 4 octets pour la vérification CRC, cela signifie que les 12 premiers octets sont pour l'en-tête. Parce que dans le code TextSum, l'exemple de fichier binaire semble n'avoir qu'un en-tête de 8 octets, c'est pourquoi ils utilisent reader.read (8) pour obtenir la longueur des données et lire le reste en tant que fonctions.

Ma solution de travail est:

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

quel système d'exploitation ne vous obtenez ce Sur OSX 11, je suis confronté à des problèmes avant même d'arriver ici. J'ai dû modifier la méthode 'Train' afin que le superviseur attende que les threads s'arrêtent. – Jordan

+0

J'utilise OSX en cours d'exécution. J'ai aussi essayé de l'utiliser sous Unix et ça fonctionnait bien. Mais il y a une petite erreur dans ma solution, nous devrions utiliser 'reader.read (4)' pour sauter 4 octets dans 'data.py' au lieu d'utiliser' seek (12) '. Je vais mettre à jour mon post –

2

J'espère que vous avez data_convert_example.py dans votre répertoire textsum. Sinon, vous pouvez le trouver dans ce post: https://github.com/tensorflow/models/pull/379/files

Utilisez le fichier python pour convertir données données jouets binaires (nom de fichier:. Données dans le répertoire de données en format texte python data_convert_example.py --command binary_to_text --in_file ../data/data --out_file ../data/result_text

Vous pouvez voir le texte réel le format, vous devez donner au format result_text.

Préparez vos données dans ce format et utiliser le même script python pour convertir text_to_binary et utiliser le résultat pour la formation/test/eval.