2017-08-30 3 views
8

は、私がtf.train.SequenceExample形式に自分のデータを構造化し、TFRecordファイルにそれを格納しています。新しいデータセットAPIを使用して、の埋め込みバッチを生成するを使用したいと思います。 the documentationにはpadded_batchを使用する例がありますが、私のデータではのpadded_shapesの値はどうなっているのでしょうか。私は次のPythonコードを書かれているバッチにTFrecordファイルを読み込むためのDataSet APIを使用してtf.train.SequenceExampleデータのTensorflowでパッディングされたバッチを作成するにはどうすればよいですか? Tensorflow</strong><strong>に<strong>LSTMモデル</strong>を訓練するため

は:

import math 
import tensorflow as tf 
import numpy as np 
import struct 
import sys 
import array 

if(len(sys.argv) != 2): 
    print "Usage: createbatches.py [RFRecord file]" 
    sys.exit(0) 


vectorSize = 40 
inFile = sys.argv[1] 

def parse_function_dataset(example_proto): 
    sequence_features = { 
     'inputs': tf.FixedLenSequenceFeature(shape=[vectorSize], 
              dtype=tf.float32), 
     'labels': tf.FixedLenSequenceFeature(shape=[], 
              dtype=tf.int64)} 

    _, sequence = tf.parse_single_sequence_example(example_proto, sequence_features=sequence_features) 

    length = tf.shape(sequence['inputs'])[0] 
    return sequence['inputs'], sequence['labels'] 

sess = tf.InteractiveSession() 

filenames = tf.placeholder(tf.string, shape=[None]) 
dataset = tf.contrib.data.TFRecordDataset(filenames) 
dataset = dataset.map(parse_function_dataset) 
# dataset = dataset.batch(1) 
dataset = dataset.padded_batch(4, padded_shapes=[None]) 
iterator = dataset.make_initializable_iterator() 

batch = iterator.get_next() 

# Initialize `iterator` with training data. 
training_filenames = [inFile] 
sess.run(iterator.initializer, feed_dict={filenames: training_filenames}) 

print(sess.run(batch)) 

コードは、私がdataset = dataset.batch(1)(その場合に必要なパディング)を使用しない場合はうまく動作しますが、私はpadded_batchを使用する場合バリアントは、私は次のエラーを取得する:

TypeError: If shallow structure is a sequence, input must also be a sequence. Input has type: .

あなたは私が私がpadded_shapesパラメータに渡すべきかを考え出す助けることができますか?

(私はこれのために、スレッドとキューを使用したサンプルコードがたくさんあるけど、私はむしろ、このプロジェクトのために新しいデータセットのAPIを使用すると思います)

+0

ありがとうMarijn!あなたの質問は私を大いに助けました! –

答えて

6

あなたは形状のタプルを渡す必要があります。 あなたのケースでは、

dataset = dataset.padded_batch(4, padded_shapes=([vectorSize],[None])) 

を渡すか、

dataset = dataset.padded_batch(4, padded_shapes=([None],[None])) 

を試してみてください詳細については、このcodeをチェックしてください。私はこの方法をデバッグして、なぜそれが私のために働いていないのか理解しなければなりませんでした。

+0

ありがとう!それは多くの意味があります。私の例では以下のように動作しました: 'padded_shapes =([None、vectorSize]、[None])'。最初のテンソルは次元vectorSizeを持つベクトルのリストで、2番目のテンソルは整数ラベルを持つリストです。 –

+0

'padded_shapes'はネストされた構造体の型に敏感です(データセットがタプルを返す場合、padded_shapesもリストではなくタプルでなければなりません) – Conchylicultor

0

現在のDatasetオブジェクトにタプルが含まれている場合は、各埋め込み要素のシェイプを指定することもできます。

たとえば、(same_sized_images, Labels)データセットがあり、各ラベルの長さは同じですが、同じランクです。

def process_label(resized_img, label): 
    # Perfrom some tensor transformations 
    # ...... 

    return resized_img, label 

dataset = dataset.map(process_label) 
dataset = dataset.padded_batch(batch_size, 
           padded_shapes=([None, None, 3], 
               [None, None])) # my label has rank 2 
関連する問題