Path: blob/master/site/ja/tutorials/audio/transfer_learning_audio.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
TensorFlow およびその他のライブラリのインポート
まず、TensorFlow I / Oをインストールすることから始めます。これにより、オーディオファイルをディスクから簡単にロードできるようになります。
YAMNetについて
YAMNet は、MobileNetV1 という深さ方向に分離可能な畳み込みアーキテクチャを使用するトレーニング済みのニューラルネットワークです。音声の波形を入力として使用し、AudioSet コーパスの 521 種の各音声イベントに対して個別の予測を行えます。
内部的には、モデルは音声信号から「フレーム」を抽出し、これらのフレームをバッチ処理します。このバージョンのモデルは長さが 0.96 秒のフレームを使用し、0.48 秒ごとに 1 つのフレームを抽出します。
モデルは、値域 [-1.0, +1.0]
の単精度 16 kHz サンプルとして表される、任意の長さの波形を、1-D float32 テンソルまたは NumPy 配列で受け入れます。このチュートリアルには、WAV ファイルをサポートされたフォーマットに変換するのに役立つコードが含まれています。
モデルは、クラススコア、埋め込み(転移学習に使用)、およびログメルスペクトログラムを含む 3 つの出力を返します。詳細については、こちらをご覧ください。
YAMNet には、高レベル特徴量抽出器(1,024 次元埋め込み出力)としての特定の使用方法があります。ベース(YAMNet)モデルの入力特徴量を使用して、それらを、1 つの tf.keras.layers.Dense
という非表示レイヤーで構成されるより浅いモデルにフィードします。その後、ネットワークを多数のラベル付きデータを使ったりエンドツーエンドでトレーニングすることなく、少量のデータで音声分類トレーニングを行います。(これはTensorFlow Hub を使った画像分類の転移学習に似ています。詳しくはそちらをご覧ください。)
それでは、モデルをテストし、音声の分類結果を確認してみましょう。その後、データの前処理パイプラインを構築していきます。
TensorFlowハブからYAMNetを読み込む
Tensorflow Hub にある事前トレーニング済みの YAMNet を使用して、サウンドファイルから埋め込みを抽出します。
TensorFlow Hubからモデルをロードするのは簡単です。モデルを選択し、そのURLをコピー、そして load
関数を使用します。
注意: モデルからドキュメントを読み取るには、ブラウザにモデルの URL を入力してください。
モデルが読み込まれたら、YAMNet の基本的な使用に関するチュートリアルに従って、推論を実行するサンプル WAV ファイルをダウンロードします。
音声ファイルの読み込む関数が必要です。この関数は、後でトレーニングデータを操作する際にも使用します。(音声ファイルとラベルの読み取りに関する詳細は、単純な音声の認識をご覧ください。)
注意: load_wav_16k_mono
から返される wav_data
はすでに [-1.0, 1.0]
の値域に正規化されています(詳細は、TF Hub にある YAMNet のドキュメントをご覧ください)。
クラスマッピングのロード
読み込むクラス名は YAMNet が認識できるものであることが重要です。マッピングファイルは CSV 形式で yamnet_model.class_map_path()
にあります。
推論の実行
YAMNet は、フレームレベルのクラススコア(フレームごとに 521 個のスコア)を提供します。クリップレベルでの予測を決定するために、スコアをフレーム全体でクラスごとに集計することができます(平均または最大集計などを使用します)。これは、scores_np.mean(axis=0)
によって以下のように行われます。最後に、クリップレベルで最高スコアのクラスを見つけるには、521 個の集計スコアの最大値を取得します。
注意: モデルは動物の声や音を正しく推論しました。このチュートリアルでの目標は、モデルの特定のクラスの精度を上げることです。また、モデルがフレームごとに 1 つの埋め込み(計 13 個の埋め込み)を生成したことにも注意してください。
ESC-50 dataset
ESC-50 データセット(Piczak, 2015)は、5 秒の長さの環境音声データが 2,000 個含まれるラベル付きのコレクションです。データセットは 50 個のクラスと、クラス当たり 40 個の Example で構成されています。
データセットをダウンロードして抽出します。
データの観察
各ファイルのメタデータは次のcsvファイルで指定されています。 ./datasets/ESC-50-master/meta/esc50.csv
また、すべてのオーディオファイルは次のディレクトリにあります。.datasets/ESC-50-master/audio/
マッピングを使用して pandas DataFrame
を作成し、それを使用してデータをよりわかりやすく表示します。
データのフィルタリング
データが DataFrame
に格納されたので、変換を適用しましょう。
行をフィルタリングして、選択したクラス(
dog
とcat
)のみを使用します。他のクラスを使用する場合は、ここで選択してください。後での読み込み作業を簡単に行えるように、ファイル名をフルパスに変更します。
ターゲットを特定の範囲内に変更します。この例では、
dog
は0
の位置のままですが、cat
は元の5
の値から1
に変わります。
オーディオファイルのロードとエンベディングの取得
ここでは、load_wav_16k_mono
を適用して、モデルに使用する WAV データを準備します。
WAV データから埋め込みを抽出すると、形状 (N, 1024)
の配列が得られます。N
は、YAMNet が検出したフレーム数です(音声の 0.48 秒あたり 1 フレーム)。
このモデルは角フレームを 1 つの入力として使用するため、1 行当たり 1つのフレームを持つ新しい列を作成する必要があります。また、新しい行を正しく反映させるために、ラベルと fold
列を拡張する必要もあります。
拡張された fold
列には元の値が保持されます。分割を行う際に異なる Split に同じ音声が含まれてしまう可能性があり、検証とテストのステップの効果が低くなってしまうため、フレームを混ぜることはできません。
データの分割
fold
列を使って、データセットをテストセット、検証セット、テストセットに分割します。
ESC-50 は、同じ元のソースが必ず同じ fold
に含まれるように、5 つの均一なサイズの相互検証 fold
に構成されます。詳細は、『ESC: Dataset for Environmental Sound Classification』論文をご覧ください。
最後のステップでは、データセットから fold
列を削除します。この列は、トレーニング中に使用されません。
モデルの作成
ここまでで、ほとんどの作業を終えました!次は、1 つの非表示レイヤーと 2 つの出力でサウンドから犬と猫を識別する非常に単純な Sequential モデルを定義します。
テストデータに対して evaluate
メソッドを実行し、過学習がないことを確認しましょう。
チェック完了です!
モデルのテスト
次に、先程例として視聴したデータに、YAMNetを適用して取得したエンベディングを用いて、モデルを試してみましょう。
WAV ファイルを入力として直接取れつ形式でモデルを保存する
現状、モデルにエンベディングを入力として与えると、モデルは機能します。
ただし、実世界のシナリオでは、音声データを直接入力として使用したいものです。
そのようにするには、YAMNet とここで作成したモデルを合わせて、他のアプリケーションにエクスポートできる単一のモデルにします。
モデルの結果を使いやすくするために、最終レイヤーを reduce_mean
演算にします。このモデルをサービングに使用する場合(これについては、チュートリアルの後の方で説明します)、最終レイヤーの名前が必要になります。これを定義しない場合、TensorFlow はインクリメンタルで名前を自動的に定義するため、モデルをトレーニングするたびに名前が変化し、テストが困難になります。生の TensorFlow 演算を使用する際にレイヤーに名前を付けることはできません。この問題に対処するには、reduce_mean
を適用するカスタムレイヤーを作成し、'classifier'
と名付けます。
保存したモデルをロードして、期待どおりに機能することを確認します。
さて、最後のテストです。サウンドデータに対して、モデルは正しい結果を返すでしょうか?
新しいモデルをサービング設定で試したい場合は、「serving_default」シグネチャを使用できます。
(任意)付加的ないくつかのテスト
モデルの準備が完了しました。
テストデータセットのYAMNetと比較してみましょう。
次のステップ
犬と猫のサウンドを分類するモデルを作成しました。同じ考え方で別のデータセットを使用すると、鳥の鳴き声に基づく鳥の音響識別器を構築するといったことが可能になります。
ソーシャルメディアで皆さんのプロジェクトを TensorFlow チームに知らせてください!