2017-04-12 6 views
1

オーディオデータでいくつかのモデルをトレーニングしようとしています。私はいくつかのmp3ファイルを読み込み、短い部分(それぞれ約0.1秒)に分割し、これらの部分をバッチで分析するコードを書きました。だから、私はこのコードを書いた。テンソルフローでオーディオデータをバッチ処理する

 
import glob 
import tensorflow as tf 
from tensorflow.contrib import ffmpeg 

def load(fname): 
    binary = tf.read_file(fname) 
    return ffmpeg.decode_audio(binary, file_format='mp3', samples_per_second=44100, channel_count=2) 

def preprocess(audio, seconds_per_sample=0.1, rate=44100): 
    # pad to a with 1 second of silence front and back 
    front = tf.zeros([rate, 2], dtype=audio.dtype) 
    back = tf.zeros([rate - tf.mod(tf.shape(audio)[0], rate) + rate, 2], dtype=audio.dtype) 
    audio = tf.concat([front, audio, back], 0) 
    # normalize to 0 to 1 range 
    audio = tf.add(audio, tf.abs(tf.reduce_min(audio))) 
    audio = tf.multiply(audio, 1.0/tf.reduce_max(audio)) 
    # [data, channels] => [samples, data, channels] 
    audio = tf.reshape(audio, [-1, int(rate * seconds_per_sample), 2]) 
    return audio 

tf.reset_default_graph() 
with tf.Graph().as_default(): 
    # take files one by one and read data from them 
    files = glob.glob('music/*.mp3')  
    queue = tf.train.string_input_producer(files, num_epochs=1) 
    fname = queue.dequeue() 
    audio = load(fname) 
    audio = preprocess(audio) 
    samples = tf.train.slice_input_producer([audio], num_epochs=1) 
    batch = tf.train.batch(samples, 10) 

    model = tf.identity(batch) 

    init = [tf.global_variables_initializer(), tf.local_variables_initializer()] 

    coord = tf.train.Coordinator() 

    with tf.Session() as session: 
     session.run(init) 
     threads = tf.train.start_queue_runners(sess=session, coord=coord) 
     for _ in range(10): 
      try: 
       result = session.run(model) 
      except tf.errors.OutOfRangeError: 
       coord.request_stop() 
     coord.request_stop() 
     coord.join(threads) 

私の以前のモデルでは、同様のアプローチがかなり機能していたようです。私はオーディオデータを再構成します。最初の次元はサンプルになります。スライス入力を使用してサンプルをキューに入れ、次にbatch()を使用してサンプルを一度にモデルに送ります。簡単にするために、モデルをアイデンティティ関数として残しました。このコードは、私のpython segfaultをどこかのテンソルフローの深い場所にします。私が明らかに間違っていることは何ですか?ここで

はOSXのクラッシュレポートの開始である

 
Process:    Python [57865] 
Path:     /usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python 
Identifier:   Python 
Version:    3.6.1 (3.6.1) 
Code Type:    X86-64 (Native) 
Parent Process:  Python [57654] 
Responsible:   Python [57865] 
User ID:    502 

Date/Time:    2017-04-12 16:07:13.318 -0400 
OS Version:   Mac OS X 10.12.3 (16D32) 
Report Version:  12 
Anonymous UUID:  B5DE676B-FEC7-9626-B1CC-F392948D410C 

Sleep/Wake UUID:  F3A5360E-B7A0-4675-9DC9-EAEE938E2E70 

Time Awake Since Boot: 440000 seconds 
Time Since Wake:  16000 seconds 

System Integrity Protection: disabled 

Crashed Thread:  16 

Exception Type:  EXC_CRASH (SIGABRT) 
Exception Codes:  0x0000000000000000, 0x0000000000000000 
Exception Note:  EXC_CORPSE_NOTIFY 

Application Specific Information: 
abort() called 

編集:私はgithubの上で開かれた問題が説明なしで閉じますが、「課題追跡ポリシーを参照してください」されました。私はここで何ができるのか分かりません。もし誰かがこの問題に遭遇するようなことがあれば、してください。

答えて

0

コードを実行する前に私のコンピュータに投稿した "MP3"ファイルを "music"フォルダに追加する必要がありました。私はそこにいくつかのオーディオがあると仮定しますが、ffmpegバイナリにも注意してください。 Tensorflowはffmpeg/usr/local/sbin/フォルダに入れるよう求めています。

速い回避策

通常のシンボリックリンクが私のために働いていました。

ln -s /usr/bin/ffmpeg /usr/local/sbin/ffmpeg

この回答が参考にされていない場合、その後、端末エミュレータでコードを実行すると、ここでトレースバックを掲載することにより、より多くの情報を提供してください。

+1

私はtensorflowがバイナリを気にするとは思わないが、それはffmpegライブラリに直接リンクしているようだ。しかしどちらの方法でも、すべてのバッチコードを使わずに同じことをすると、load()と同じものを使ってファイルをロードし、出力を見ればうまく動作します。 –

関連する問題