Python(2018/8/20)のつづき。LSTMの実装方法を比較してみます。Problemとは、ランダムな整数の系列を入力とし、入力系列の特定の時刻の値を出力する単純なタスクです。時刻はネットワークへの入力とせずに固定します。系列を入力として、要素を1つだけ返すのでMany-to-one型のLSTMです。こんなモデルが何の役に立つのか?というと・・・何の役にもたちません(笑)練習用のタスクです。先にKerasで実装してみます。必要なライブラリをインポート。数字系列を生成します。encodingして与えます。encoded_seq]例えば、系列長が5で0から9までの乱数系列を生成したいときは下のようにします。3]例えば、0-9までの10個の数字を入力とする場合は、one-hotベクトル化すると10次元の特徴量ベクトルになります。次に訓練データを生成する関数を実装します。yKerasのLSTMへの入力は3Dテンソルで与える必要があります。与えると書いてあります。与えると書いてあります。今回は簡単のためバッチサイズは1で固定です。バッチサイズ1、系列長が5、特徴量の次元は10とすると入力系列Xと出力yは下のようになります。ModelLSTM層が1つ、分類のDense層が1つという単純なモデルを実装します。LSTM層は系列データをまとめて入力することで、内部の隠れ状態が更新されていきます。KerasのLSTMのデフォルト設定では先のMany-to-oneモデルのように系列を全て入れたあとの最後の隠れ状態が出力されます。その隠れ状態を0-9の10分類のDense層に入力し、活性化関数をsoftmaxとすることで確率に変換します。今回の実験では、長さ5の系列を入れて2番目の要素を出力するようにします。LSTMの隠れ状態は25次元です。0_________________________________________________________________Train最後にモデルの訓練コードです。losses.append(history.history['loss'][0])plt.plot(losses)今回は、各エポックで系列データを1つだけ生成し(ミニバッチ数1)、学習します。lossを下のようにエポックが進むにつれて下がることがわかります。Evaluate精度評価用のコードです。系列を100個生成して、正解と一致するか判定します。100.0))精度は100%です。100.000000Predict最後に予測用のコードです。2番目を返すように訓練したモデルなので正解は1です。予測も1で正解なことがわかります。次に同じタスクをPyTorchで実装してみます。'cpu')次にデータを生成する関数です。ここはKerasとちょっと違います。Kerasと同じく、系列をまとめて入力して処理します。stateの2つ)は明示的に与える必要があります。LogSoftmax())Train訓練用のコードです。し、それをLinear層に渡して分類しますこの図がわかりやすいです。Kerasのときと同じようなlossが得られます。Predict予測用のコードです。2番目を出力するモデルなので4が正解、予測も4なので合っています。最後に、いくつか実験してみました。plt.legend()入力系列が長いほどlossが下がらず、予測が難しいことがわかります。以下、コードは似たような感じなので省略します。予測の場所が系列の最後より遠い方が難しい?そのような傾向はあまりなさそう?LSTMの隠れ状態のサイズを変えると?大きすぎても小さすぎてもダメ。入力特徴量の次元数を変えると?次元数が大きいほど問題が難しくなるのでlossが下がりにくくなる。PyTorch最近、仕事でRNNを扱うアプリケーションが多くなっています。Network)についてまとめていこうと思います。参考資料は、です*1。実装して解説しています。Captioningなど大規模なデータと長い訓練時間が必要なタスクが一般的ですが、この本ではCPUでも訓練できるほど基本的なタスクが取り上られています(MNISTより簡単なレベル)Kerasでやってはこの本の真似になってしまうので、このブログではPyTorchでやっていきます。上の本のKerasのコードをPyTorchに翻訳しているのですが、KerasとPyTorchではRNNの実装方法がだいぶ違うことを実感しています。最近はPyTorchに慣れているせいか、Kerasの実装が難しく感じます。Kerasはコード量は少ないのですが、ドキュメント当たらないと読みときにくいタイプの難しさです。Learning、Kerasの入門としてとてもよいサイトです。説明が異常に丁寧です。Kaggle最近、Kaggle始めました。Challengeという効果音に対して3つのタグをつけるコンペです。2秒ほどの音に対してギター、犬の鳴き声、チャイム、シンバルなどの41個のタグから3つを付与します。1つの音声に対する正解のタグは1つなのですが、3つのうち正解のタグが上位にあるほどスコアが高くなります。Learningで音を分類したり、生成したりする技術に興味があったので取り組んでみました。Dataというとてもよいチュートリアルをまとめています。さんが翻訳されてました。(64次元)またはMFCC(64次元)です。手前味噌ですが、MFCCは以前、自分で実装したことあります。最近は、librosaという音を扱うのにとても便利なPythonパッケージができたため、自分で実装しなくても簡単に計算できます。以下の記事はlibrosaでメルスペクトログラムやMFCCを抽出する方法をlibrosaの実装にまで踏み込んで開設されていて参考になります。アーキテクチャ音の分類で使われるモデルアーキテクチャは、画像分類で使われるのと同じ畳み込みニューラルネットワーク(CNN)が一般的です。画像と違ってあまり深いネットワークは使われません。音は時系列データでもあるためLSTMなどのRNN系のモデルもよく使われています。画像は2次元の広がりを持つデータなのでの2次元のカーネルを使いますが、音声は2次元と1次元の両方のカーネルが使えます。どちらがよいかは対象タスクによるのでとりあえず全部試した方がよいと思います。Network)ResNet(1次元カーネル)の4種類を検討しました。CRNNは畳み込みの結果のあとにLSTMを使うモデルです。上記の特徴量とアーキテクチャの組み合わせで複数のモデルをたくさん作り、最後にそれらの分類結果をアンサンブルします。その他の細かい工夫データ標準化メルスペクトログラムやMFCCの値を音声ファイルごとに平均0、標準偏差1になるように標準化しました。本来は、訓練データ全体で平均0、標準偏差1になるようにするのが好ましいかもしれませんが、音声ファイル単位で処理しています。メルスペクトログラムやMFCCの各次元ごとに標準化せずに全体で標準化しています。Rateを導入fast.aiでも推奨されてましたが、局所最適解に陥りにくくなるそうです。学習曲線がギザギザしているのはそのためです。音声波形のランダムクロップのみです。雑音付与、音の高さ変更、音の長さ変更などいろいろ考えられますが試しませんでした。(TTA)テスト時にデータ拡張してそれらの結果を平均化する手法です。今回はランダムクロップのみですが、導入することでLBスコアで2〜3ポイントほど改善しました。Rateを導入したせいです。spectrogram)となりました。ResNetはvalid/accが高いのですが、train/accが100%に達しており、過学習してる感じです。全体的にメルスペクトログラムよりMFCCの方が精度が高いという結果になっています。38位/558チームでした。Setに過学習してたのかなと思います。一応、ブロンズメダルの範囲には入ってるみたいですが、このコンペはメダル出ないタイプでした。何か面白そうなのは挑戦してみたいと思います!その他のアイデア他にも下のようなこと考えてましたが未達でした。RNNのようなより高度なアーキテクチャを使用するさまざまなデータ拡張を導入するあまり整理できてませんが、コードはこのリポジトリにあります。ChallengeTweet広告を非表示にするもっと読むコメントを書く次のページプロフィールid:aidiary人工知能とその関連分野に興味があります。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。