最終的に電話(iPhone/Android)で実行されるサウンド検出アプリケーションのプロトタイプを構築しています。特定のサウンドが認識されたときにユーザーに十分な応答を与えるためには、リアルタイムに近い必要があります。私は実際にテンソルフローを使ってモデルを構築して訓練し、それをモバイルデバイスに展開することを望んでいます。モバイルデバイス上でテンソルフローにリアルタイムオーディオデータを送信
この場合、推論のためのテンソルフローにデータを供給するための最良の方法です。
オプション1:新しく取得したサンプルのみをモデルにフィードします。
ここでモデル自体は、新しいサンプルが追加され、すべてが処理される以前の信号サンプルのバッファを保持します。 のような何か:
samples = tf.placeholder(tf.int16, shape=(None))
buffer = tf.Variable([], trainable=False, validate_shape=False, dtype=tf.int16)
update_buffer = tf.assign(buffer, tf.concat(0, [buffer, samples]), validate_shape=False)
detection_op = ....process buffer...
session.run([update_buffer, detection_op], feed_dict={samples: [.....]})
これが動作しているようですが、サンプルがモデルに100回秒をプッシュしている場合、tf.assign内部で何が起こっているのか(バッファが十分に大きく成長することができ、そして場合は常にtf.assignこれはうまく動作しないかもしれないメモリを割り当てる)?
オプション2:ここではモデル
に全体の記録をフィードiPhoneアプリが状態/記録のサンプルを保持し、モデルに全体の記録を供給します。入力がかなり大きくなり、録音全体で検出操作を再実行すると、毎回同じ値が再計算されなければなりません。
オプション3:ここではデータ
のスライディングウィンドウを養うアプリは全体の記録のためのデータを保持しますが、モデルへのデータの唯一の最新のスライスを供給します。例えば。 2000サンプリングレートで最後の2秒= 1/100秒のレートでフィードされた4000サンプル(各20サンプル新たに)。モデルはまた、録音全体でいくつかの実行中の合計を保持する必要があります。
Advise?