2016-08-30 3 views
2

wildmlの"RNNs in TensorFlow, a Practical Guide and Undocumented Features"投稿をフォローしていて、tf.train.batch()機能の出力を見ることができません。次のように格納するためのコード、ローディング及び入力処理である:ポストに基づいtf.train.batch()の出力を表示するには

sequences = [[1, 2, 3], [4, 5, 1], [1, 2]] 
label_sequences = [[0, 1, 0], [1, 0, 0], [1, 1]] 

def make_example(sequence, labels): 
    # The object we return 
    ex = tf.train.SequenceExample() 
    # A non-sequential feature of our example 
    sequence_length = len(sequence) 
    ex.context.feature["length"].int64_list.value.append(sequence_length) 
    # Feature lists for the two sequential features of our example 
    fl_tokens = ex.feature_lists.feature_list["tokens"] 
    fl_labels = ex.feature_lists.feature_list["labels"] 
    for token, label in zip(sequence, labels): 
     fl_tokens.feature.add().int64_list.value.append(token) 
     fl_labels.feature.add().int64_list.value.append(label) 
    return ex 
fname = "/home/someUser/PycharmProjects/someTensors" 
writer = tf.python_io.TFRecordWriter(fname) 
for sequence, label_sequence in zip(sequences, label_sequences): 
    ex = make_example(sequence, label_sequence) 
    print ex 
    writer.write(ex.SerializeToString()) 
writer.close() 
print("Wrote to {}".format(fname)) 
reader = tf.TFRecordReader() 
filename_queue = tf.train.string_input_producer([fname]) 
_, serialized_example = reader.read(filename_queue) 
context_parsed, sequence_parsed = tf.parse_single_sequence_example(
serialized=serialized_example, context_features=context_features, 
sequence_features=sequence_features) 

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 
tf.train.start_queue_runners(sess=sess) 

batched_data = tf.train.batch(tensors= 
[context_parsed['length'], sequence_parsed['tokens'],  
sequence_parsed['labels']], batch_size=5, dynamic_pad= True) 

batched_context_data = tf.train.batch(tensors= [context_parsed['length']], 
batch_size=5, dynamic_pad= True) 

batched_tokens_data = tf.train.batch(tensors= 
[sequence_parsed['tokens']], batch_size=5, dynamic_pad= True) 

batched_labels_data = tf.train.batch(tensors= 
[sequence_parsed['labels']], batch_size=5, dynamic_pad= True) 

次のように、バッチの出力を表示することが可能であるべきである。

res = tf.contrib.learn.run_n({"y": batched_data}, n=1, feed_dict=None) 
print("Batch shape: {}".format(res[0]["y"].shape)) 
print(res[0]["y"]) 

か、次のようより具体的なケースについて:

残念ながら、TensorFlowは永遠に両方のケースを計算するのにかかるので、プロセスが終了することになります。誰かが私が間違っていることを教えてもらえますか?

ありがとうございました!

​​

あなたが移動した場合:

tf.train.start_queue_runners(sess=sess) 

... tf.train.batch()へのコールが含まれているこれらの行、前に来る:

答えて

2

私はこの問題はtf.train.start_queue_runners()を呼び出して、この行が、ということである疑いがありますtf.train.start_queue_runners()の呼び出しの後にtf.train.batch()を呼び出すと、プログラムはデッドロックになってはなりません。


どうしてですか? tf.train.batch()関数は、バッチ処理中にデータをバッファするためのキューを内部的に作成します.TensorFlowでは、これらのキューにデータを格納する一般的な方法は、要素をキューに移動するバックグラウンドスレッドである"queue runner"を作成することです。 tf.train.start_queue_runners()関数は、呼び出された時点ですべての登録済みキューランナーのバックグラウンドスレッドを開始しますが、キューランナーが作成される前に呼び出された場合、それらのスレッドは開始されません。

関連する問題