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が下がりにくくなる。AutoencoderAutoencoderの実験!MNISTで試してみよう。»プロフィールid:aidiary人工知能とその関連分野に興味があります。)はてなブログをはじめよう!aidiaryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。