2016-07-21 5 views
1

私はオーディオファイルの分類子を習得しようとしています。私は自分のWAVファイルを読んで、カスタムPython機能のトレーニングのためにスペクトログラム画像のシーケンスに変換します。この関数はtf.py_funcで呼び出され、同じ形の画像の配列を返します。換言すれば、画像形状は明確に定義されているが、画像の数は動的である。 (例えば、短いオーディオスニペットの場合3つのスペクトログラム、長いスニペットの場合15つ)Tensorflow操作で可変長データを生成

tf.train.batch_join()でさらに処理/エンキューするために結果リストをアンパックする方法はありますか?定義されていないシーケンスの長さは、多くのTF操作で問題になるようです。長さを何らかの形で推測することはできますか?

... 
// Read the audio file name and label from a CSV file 
audio_file, label = tf.decode_csv(csv_content) 

def read_audio(audio_file): 

    signal = read_wav(audio_file) 
    images = [generate_image(segment) for segment in split_audio(signal)] 

    // This output is of varying length depending on the length of audio file. 
    return images 

// Convert audio file to a variable length sequence of images 
// Shape: <unknown>, which is to be expected from tf.py_func 
image_sequence = tf.py_func(wav_to_spectrogram, [audio_file], [tf.float32])[0] 

// Auxilliary to set a shape for the images defined in tf.py_func 
def process_image(in_image): 
    image = tf.image.convert_image_dtype(in_image, dtype=tf.float32) 
    image.set_shape([600, 39, 1]) 

    return (image, label) 


// Shape: (?, 600, 39, 1) 
images_labels = tf.map_fn(process_image, image_sequence, dtype=(tf.float32, tf.int32)) 


// This will not work. 'images_and_labels' needs to be a list 
images, label_index_batch = tf.train.batch_join(
    images_and_labels, 
    batch_size=batch_size, 
    capacity=2 * num_preprocess_threads * batch_size, 
    shapes=[data_shape, []], 
) 

答えて

7

あなたは可変サイズの入力バッチとして、このテンソルを治療するための入力とenqueue_manyとして可変サイズのテンソルを使用することができます。

可変サイズのバッチを生成するpy_funcの例を次に示します。enqueue_manyを一定サイズのバッチに変換するバッチです。

import tensorflow as tf 

tf.reset_default_graph() 

# start with time-out to prevent hangs when experimenting 
config = tf.ConfigProto() 
config.operation_timeout_in_ms=2000 
sess = tf.InteractiveSession(config=config) 

# initialize first queue with 1, 2, 1, 2 
queue1 = tf.FIFOQueue(capacity=4, dtypes=[tf.int32]) 
queue1_input = tf.placeholder(tf.int32) 
queue1_enqueue = queue1.enqueue(queue1_input) 
sess.run(queue1_enqueue, feed_dict={queue1_input: 1}) 
sess.run(queue1_enqueue, feed_dict={queue1_input: 2}) 
sess.run(queue1_enqueue, feed_dict={queue1_input: 1}) 
sess.run(queue1_enqueue, feed_dict={queue1_input: 2}) 
sess.run(queue1.close()) 

# call_func will produce variable size tensors 
def range_func(x): 
    return np.array(range(x), dtype=np.int32) 
[call_func] = tf.py_func(range_func, [queue1.dequeue()], [tf.int32]) 
queue2_dequeue = tf.train.batch([call_func], batch_size=3, shapes=[[]], enqueue_many=True) 

coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord) 
try: 
    while True: 
    print sess.run(queue2_dequeue) 
except tf.errors.OutOfRangeError: 
    pass 
finally: 
    coord.request_stop() 
coord.join(threads) 
sess.close() 

あなたは

[0 0 1] 
[0 0 1] 
+0

もう一つが表示されるはずです。私はこの例題が何をしているのか理解していますが、私は 'ラベルの部分'がありません。各ラベルをシーケンスにマージ/結合するにはどうすればよいですか? 'py_func'の各可変長出力は' tf.train.batch() 'に入力するときにそのラベルと対になっていなければなりません。どうやってやるの? – Tom

関連する問題